From 881a130ab10c28e19624602abb9fab82bba1b237 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 20 Jul 2026 15:08:35 +0800 Subject: [PATCH 001/155] 0.29.0 Signed-off-by: Aayush Gupta --- buildSrc/src/main/kotlin/ProjectConfig.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/ProjectConfig.kt b/buildSrc/src/main/kotlin/ProjectConfig.kt index 5d2489d39..8f4c4c709 100644 --- a/buildSrc/src/main/kotlin/ProjectConfig.kt +++ b/buildSrc/src/main/kotlin/ProjectConfig.kt @@ -8,8 +8,8 @@ const val NEWPIPE_VERSION_SDK_COMPILE_MINOR = 0 const val NEWPIPE_VERSION_SDK_MIN = 23 const val NEWPIPE_VERSION_SDK_TARGET = 35 -const val NEWPIPE_VERSION_CODE = 1013 -const val NEWPIPE_VERSION_NAME = "0.28.8" +const val NEWPIPE_VERSION_CODE = 1014 +const val NEWPIPE_VERSION_NAME = "0.29.0" const val NEWPIPE_APPLICATION_ID_OLD = "org.schabi.newpipe" const val NEWPIPE_APPLICATION_ID_NEW = "net.newpipe.app" From dcb7f1ced25963b9d7668bf52bfaea5e7c2ebc1d Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 25 Jul 2026 10:03:37 +0200 Subject: [PATCH 002/155] Translated using Weblate (Portuguese (Portugal)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (French) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (French) Currently translated at 97.3% (37 of 38 strings) Translated using Weblate (Arabic) Currently translated at 94.7% (36 of 38 strings) Translated using Weblate (Icelandic) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Icelandic) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Swedish) Currently translated at 73.6% (28 of 38 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (German) Currently translated at 100.0% (38 of 38 strings) Co-authored-by: Aster Co-authored-by: Dot Max Co-authored-by: Dvuevi Co-authored-by: Hosted Weblate Co-authored-by: MS-PC Co-authored-by: Mazen Mohamed Co-authored-by: Mickaël Binos Co-authored-by: Mona Lisa Co-authored-by: Sveinn í Felli Co-authored-by: VfBFan Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/is/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ja/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sv/ Translation: NewPipe/compose --- .../composeResources/values-ar/strings.xml | 9 +++++ .../composeResources/values-de/strings.xml | 8 ++-- .../composeResources/values-es/strings.xml | 14 +++---- .../composeResources/values-fr/strings.xml | 11 +++++ .../composeResources/values-in/strings.xml | 11 +++++ .../composeResources/values-is/strings.xml | 37 +++++++++++++++++ .../composeResources/values-ja/strings.xml | 40 ++++++++++++++++++- .../values-pt-rPT/strings.xml | 40 ++++++++++++++++++- .../composeResources/values-pt/strings.xml | 40 ++++++++++++++++++- .../composeResources/values-sv/strings.xml | 13 +++--- 10 files changed, 203 insertions(+), 20 deletions(-) diff --git a/shared/src/commonMain/composeResources/values-ar/strings.xml b/shared/src/commonMain/composeResources/values-ar/strings.xml index 451291930..850da900a 100644 --- a/shared/src/commonMain/composeResources/values-ar/strings.xml +++ b/shared/src/commonMain/composeResources/values-ar/strings.xml @@ -27,4 +27,13 @@ فتح في المتصفح تم غير متاح + الإعدادات + بحث + المحتوى + الإشعارات + الفيديو والصوت + تنزيل + المظهر + التحديثات + النسخ الاحتياطي والاستعادة diff --git a/shared/src/commonMain/composeResources/values-de/strings.xml b/shared/src/commonMain/composeResources/values-de/strings.xml index 6e7886987..d3007cb0c 100644 --- a/shared/src/commonMain/composeResources/values-de/strings.xml +++ b/shared/src/commonMain/composeResources/values-de/strings.xml @@ -16,13 +16,13 @@ Freies und schlankes Streaming für Android. Beitragen Ob Ideen, Übersetzungen, Design-Änderungen, Code-Aufräumen oder richtig große Code-Änderungen — Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe! - NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, indem du den Entwicklern hilfst, NewPipe noch weiter zu verbessern, während sie sich an einer Tasse Kaffee erfreuen. + NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzungserfahrung zu bieten. Gib etwas zurück, indem du den Entwicklern hilfst, NewPipe noch weiter zu verbessern, während sie sich an einer Tasse Kaffee erfreuen. Zurückgeben Website Besuche die NewPipe-Website für weitere Informationen und Neuigkeiten. - NewPipes Datenschutzbestimmung - Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Deshalb sammelt diese App keine Daten ohne deine Zustimmung.\nNewPipes Datenschutzbestimmungen erklären im Detail, welche Daten beim Absenden eines Absturzberichtes verschickt und gespeichert werden. - Datenschutzbestimmungen lesen + NewPipes Datenschutzerklärung + Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Deshalb sammelt diese App keine Daten ohne deine Zustimmung.\nNewPipes Datenschutzerklärung erklären im Detail, welche Daten beim Absenden eines Absturzberichtes verschickt und gespeichert werden. + Datenschutzerklärung lesen NewPipes Lizenz NewPipe ist freie Copyleft-Software: Du kannst sie nach Belieben benutzen, untersuchen, mit anderen teilen und verbessern. Insbesondere kannst du sie unter den von der Free Software Foundation veröffentlichten Bedingungen der GNU General Public License, in der Version 3 der Lizenz oder (nach deiner Wahl) jeder späteren Version, weitergeben und/oder verändern. Wenn du Probleme bei der Verwendung der App hast, lies bitte die Antworten auf häufig gestellte Fragen! diff --git a/shared/src/commonMain/composeResources/values-es/strings.xml b/shared/src/commonMain/composeResources/values-es/strings.xml index cadde6cf6..66de23005 100644 --- a/shared/src/commonMain/composeResources/values-es/strings.xml +++ b/shared/src/commonMain/composeResources/values-es/strings.xml @@ -11,18 +11,18 @@ Tanto si tiene ideas de traducción, cambios de diseño, limpieza de código o modificaciones profundas en el código, la ayuda siempre es bienvenida. ¡Cuanto más se haga, mejor se vuelve! Ver en GitHub Donar - NewPipe es desarrollado por voluntarios que dedican su tiempo libre a ofrecerle la mejor experiencia de usuario. Colabore para ayudar a los desarrolladores a hacer que NewPipe sea aún mejor mientras disfrutan de una taza de café. + NewPipe es desarrollado por voluntarios que dedican su tiempo libre a ofrecerle la mejor experiencia de usuario. Puedes hacer una donación para ayudar a los desarrolladores y hacer que NewPipe sea aún mejor mientras disfrutan de una taza de café. Colaborar Sito web Visita el nuevo sitio web de NewPipe para más detalles y noticias. Política 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. \nLa política de privacidad de NewPipe explica en detalle qué datos se envían y almacenan al enviar un informe de fallo. - Leer la política de privacidad + El proyecto NewPipe se toma muy en serio tu privacidad. Por ello, la aplicación no recopila ningún dato sin tu consentimiento. \nLa política de privacidad de NewPipe explica en detalle qué datos se envían y almacenan al enviar un informe de fallo. + Leer política de privacidad Licencia de NewPipe - NewPipe es software libre con copyleft: puede usarlo, estudiarlo, compartirlo y mejorarlo a su antojo. Específicamente, puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia o (a su elección) cualquier versión posterior. - Leer la licencia + NewPipe es software libre con copyleft: 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 de 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. + Leer licencia Preguntas frecuentes - Si tiene problemas al usar la aplicación, ¡asegúrese de consultar estas respuestas a las preguntas comunes! + Si tienes problemas al usar la aplicación, ¡Asegúrate de verificar estas respuestas a preguntas comunes! Ver en el sitio web Abrir en el navegador Listo @@ -31,7 +31,7 @@ Buscar Contenido Notificaciones - Video y audio + Vídeo y audio Descargar Apariencia Historial y caché diff --git a/shared/src/commonMain/composeResources/values-fr/strings.xml b/shared/src/commonMain/composeResources/values-fr/strings.xml index bf9dc2ea7..3e1b7a49a 100644 --- a/shared/src/commonMain/composeResources/values-fr/strings.xml +++ b/shared/src/commonMain/composeResources/values-fr/strings.xml @@ -27,4 +27,15 @@ Ouvrir dans le navigateur Terminé Indisponible + Paramètres + Chercher + Contenu + Notifications + Vidéo et audio + Téléchargement + Apparence + Historique et cache + Mises à jour + Sauvegarde et restauration + Corriger diff --git a/shared/src/commonMain/composeResources/values-in/strings.xml b/shared/src/commonMain/composeResources/values-in/strings.xml index 555d69b59..540f47b22 100644 --- a/shared/src/commonMain/composeResources/values-in/strings.xml +++ b/shared/src/commonMain/composeResources/values-in/strings.xml @@ -27,4 +27,15 @@ Baca lisensi Jika Anda mengalami kesulitan menggunakan aplikasi, pastikan untuk memeriksa jawaban atas pertanyaan umum ini! Aplikasi ini adalah perangkat lunak bebas copyleft: Anda dapat menggunakan, mempelajari, membagikan, dan memperbaikinya sesuka hati. Secara khusus, Anda dapat mendistribusikan dan/atau memodifikasinya berdasarkan ketentuan Lisensi Publik Umum GNU sebagaimana diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi apapun yang lebih baru. + Pengaturan + Telusur + Konten + Notifikasi + Audio dan Video + Unduh + Penampilan + Riwayat & Cache + Pembaruan + Cadangkan dan Pulihkan + Debug diff --git a/shared/src/commonMain/composeResources/values-is/strings.xml b/shared/src/commonMain/composeResources/values-is/strings.xml index 8bffc4d23..1bf574be0 100644 --- a/shared/src/commonMain/composeResources/values-is/strings.xml +++ b/shared/src/commonMain/composeResources/values-is/strings.xml @@ -1,4 +1,41 @@ Frjáls og léttur streymisspilari fyrir Android. + Til baka + Um NewPipe + Um okkur & algengar spurningar + Vefsíða + NewPipe verkefnið tekur friðhelgi þína mjög alvarlega. Þess vegna safnar forritið engu án samþykkis þíns. \n\nPersónuverndarstefna NewPipe útskýrir í smáatriðum hvaða gögn eru send og geymd þegar þú sendir hrunskýrslu. + Notkunarleyfi utanaðkomandi aðila + Frá %1$s með %2$s + Hugbúnaðarleyfi + Taka þátt + Allt er velkomið — hugmyndir, þýðingar, endurhönnun, kóðahreinsun eða miklar kóðabreytingar. Því fleiri, því betra! + Skoða á GitHub + Styrkja + NewPipe er þróað af sjálfboðaliðum sem eyða frítíma sínum í að færa þér bestu notendaupplifunina. Gefðu til baka til að hjálpa forriturum að gera NewPipe enn betri á meðan þeir njóta kaffibolla. + Gefa til baka + Fyrir frekari upplýsingar og nýjustu fréttir um NewPipe geturðu skoðað heimasíðu okkar. + Persónuverndarstefna NewPipe + Lesa persónuverndarstefnu + Hugbúnaðarleyfi NewPipe + NewPipe er „copyleft“ frjáls hugbúnaður: Þú getur notað, rannsakað, deilt og bætt honum að vild. Þú getur endurdreift og breytt því samkvæmt skilmálum GNU GPL notendaleyfi eins og það er gefið út af Frjálsa Hugbúnaðarstofnuninni, annað hvort útgáfu 3 af leyfinu, eða (að eigin vali) hvaða síðari útgáfu sem er. + Lesa notkunarleyfi + Algengar spurningar + Ef þú átt í vandræðum með að nota forritið vertu viss um að skoða þessi svör við algengum spurningum! + Skoða á vefsíðu + Opna í vafra + Lokið + Ekki tiltækt + Stillingar + Leita + Efni + Tilkynningar + Mynd og hljóð + Niðurhal + Útlit + Ferill og skyndiminni + Uppfærslur + Öryggisafrita og endurheimta + Villuleit diff --git a/shared/src/commonMain/composeResources/values-ja/strings.xml b/shared/src/commonMain/composeResources/values-ja/strings.xml index 55344e519..307ca8fd5 100644 --- a/shared/src/commonMain/composeResources/values-ja/strings.xml +++ b/shared/src/commonMain/composeResources/values-ja/strings.xml @@ -1,3 +1,41 @@ - \ No newline at end of file + 戻る + NewPipeについて + サードパーティライセンス + %1$s作、%2$sライセンス + 概要とよくある質問 + ライセンス + Android向けの自由で軽量なストリーミングアプリ。 + 貢献する + 翻訳、デザインの変更、コードの整理、大規模なコード変更など、どんな形の協力もいつでも歓迎します。手を加えるほど、より良いものになります! + GitHubで見る + 寄付する + NewPipeは、最高のユーザー体験を届けるために、ボランティアが自由時間を使って開発しています。開発者がコーヒーを楽しみながらNewPipeをさらに良くできるよう、ぜひ支援してください。 + 支援する + ウェブサイト + 詳しい情報や最新ニュースについては、NewPipeのウェブサイトをご覧ください。 + NewPipeのプライバシーポリシー + NewPipeプロジェクトは、ユーザーのプライバシーを非常に重視しています。そのため、このアプリがユーザーの同意なくデータを収集することはありません。\nNewPipeのプライバシーポリシーでは、クラッシュレポートを送信した際に、どのようなデータが送信および保存されるかを詳しく説明しています。 + プライバシーポリシーを読む + NewPipeのライセンス + NewPipeは、コピーレフトの自由ソフトウェアです。自由に使用、研究、共有、改良できます。具体的には、フリーソフトウェア財団が公開しているGNU General Public Licenseのバージョン3、またはそれ以降の任意のバージョンの条件に従って、再配布や改変を行えます。 + ライセンスを読む + よくある質問 + アプリの使用中に問題が発生した場合は、よくある質問への回答をご確認ください! + ウェブサイトで見る + ブラウザで開く + 閉じる + 利用できません + 設定 + 検索 + コンテンツ + 通知 + 動画と音声 + ダウンロード + 外観 + 履歴とキャッシュ + 更新 + バックアップと復元 + デバッグ + diff --git a/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml b/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml index 55344e519..5a0e18a71 100644 --- a/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml @@ -1,3 +1,41 @@ - \ No newline at end of file + Voltar + Sobre o NewPipe + Licenças de terceiros + Por %1$s sob %2$s + Sobre & Perguntas Frequentes + Licenças + Streaming livre e gratuito no Android. + Contribuir + Caso tenha ideias; tradução, alterações de design, limpeza de código ou alterações realmente pesadas de código, a ajuda é sempre bem-vinda. Quanto mais for feito, melhor será! + Ver no GitHub + Doar + O NewPipe é desenvolvido por voluntários que passam o seu tempo livre a trazer-lhe a melhor experiência de utilizador. Retribua para ajudar os programadores a fazer o NewPipe ainda melhor enquanto tomam uma chávena de café. + Retribuir + Site + Visite o site do NewPipe para mais informações e novidades. + Política de Privacidade do NewPipe + O projeto NewPipe leva a sua privacidade muito a sério. Portanto, a app não coleta nenhum dado sem o seu consentimento.\nA política de privacidade do NewPipe explica detalhadamente quais dados são enviados e armazenados ao enviar um relatório de erro. + Leia a política de privacidade + Licença do NewPipe + NewPipe é um software copyleft libre: pode usá-lo, estudá-lo, partilhá-lo e melhorá-lo à vontade. Especificamente, pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (ao seu critério) qualquer versão posterior. + Ler licença + Perguntas frequentes + Se tem problemas a usar a app, verifique estas respostas para perguntas comuns! + Ver no site + Abrir no navegador + Concluído + Não disponível + Configurações + Pesquisar + Conteúdo + Notificações + Vídeo e áudio + Descarregar + Aparência + Histórico e cache + Atualizações + Backup e restauração + Depuração + diff --git a/shared/src/commonMain/composeResources/values-pt/strings.xml b/shared/src/commonMain/composeResources/values-pt/strings.xml index 55344e519..5a0e18a71 100644 --- a/shared/src/commonMain/composeResources/values-pt/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt/strings.xml @@ -1,3 +1,41 @@ - \ No newline at end of file + Voltar + Sobre o NewPipe + Licenças de terceiros + Por %1$s sob %2$s + Sobre & Perguntas Frequentes + Licenças + Streaming livre e gratuito no Android. + Contribuir + Caso tenha ideias; tradução, alterações de design, limpeza de código ou alterações realmente pesadas de código, a ajuda é sempre bem-vinda. Quanto mais for feito, melhor será! + Ver no GitHub + Doar + O NewPipe é desenvolvido por voluntários que passam o seu tempo livre a trazer-lhe a melhor experiência de utilizador. Retribua para ajudar os programadores a fazer o NewPipe ainda melhor enquanto tomam uma chávena de café. + Retribuir + Site + Visite o site do NewPipe para mais informações e novidades. + Política de Privacidade do NewPipe + O projeto NewPipe leva a sua privacidade muito a sério. Portanto, a app não coleta nenhum dado sem o seu consentimento.\nA política de privacidade do NewPipe explica detalhadamente quais dados são enviados e armazenados ao enviar um relatório de erro. + Leia a política de privacidade + Licença do NewPipe + NewPipe é um software copyleft libre: pode usá-lo, estudá-lo, partilhá-lo e melhorá-lo à vontade. Especificamente, pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (ao seu critério) qualquer versão posterior. + Ler licença + Perguntas frequentes + Se tem problemas a usar a app, verifique estas respostas para perguntas comuns! + Ver no site + Abrir no navegador + Concluído + Não disponível + Configurações + Pesquisar + Conteúdo + Notificações + Vídeo e áudio + Descarregar + Aparência + Histórico e cache + Atualizações + Backup e restauração + Depuração + diff --git a/shared/src/commonMain/composeResources/values-sv/strings.xml b/shared/src/commonMain/composeResources/values-sv/strings.xml index 6f9fca9ae..7dc8df6af 100644 --- a/shared/src/commonMain/composeResources/values-sv/strings.xml +++ b/shared/src/commonMain/composeResources/values-sv/strings.xml @@ -5,7 +5,7 @@ Om NewPipe Tredjepartslicenser Bidra - Oavsett om du har idéer kring översättning, designändringar, uppstädning av kod eller riktigt tunga kodändringar är hjälp alltid välkommen. Ju mer som görs, desto bättre blir det! + Oavsett om du har idéer om översättningar, designförbättringar, kodstädning eller omfattande kodändringar är all hjälp välkommen. Ju fler som bidrar, desto bättre blir NewPipe! NewPipe utvecklas av frivilliga som ägnar sin fritid åt att ge dig den bästa användarupplevelsen. Ge något tillbaka genom att hjälpa utvecklarna att göra NewPipe ännu bättre medan de njuter av en kopp kaffe. Ge tillbaka Webbplats @@ -15,16 +15,17 @@ NewPipes licens Licenser Donera - Om du har problem med att använda appen, se till att läsa dessa svar på några vanliga frågor! + Läs svaren på vanliga frågor om du har problem med att använda appen. Klar Icke tillgängligt - Om & vanliga frågor - Läs licens + Om och vanliga frågor + Läs hela licensen Vanliga frågor Visa på webbplatsen Öppna i webbläsare Av %1$s under %2$s - Lättviktsströmning på Android med fri programvara. + Lättviktig strömning på Android med fri programvara. Visa på GitHub - NewPipe är copyleft-licensierad fri programvara: du får använda, studera, dela och förbättra den som du vill. Mer specifikt får du distribuera och/eller modifiera den enligt villkoren i GNU General Public License, såsom den publicerats av Free Software Foundation, antingen version 3 av licensen eller, om du så önskar, någon senare version. + NewPipe är fri programvara under en copyleft-licens: du får använda, studera, dela och förbättra programmet. Du får distribuera och ändra det enligt villkoren i GNU General Public License, version 3 eller, om du föredrar det, en senare version. + Hämtningar From 98843e5dc5f4a6ca6b44ceaa0b7184cd4da1622a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 25 Jul 2026 10:02:03 +0200 Subject: [PATCH 003/155] Translated using Weblate (Toki Pona) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 5.9% (46 of 776 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (French) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (Icelandic) Currently translated at 97.4% (756 of 776 strings) Translated using Weblate (Icelandic) Currently translated at 97.4% (756 of 776 strings) Translated using Weblate (Arabic) Currently translated at 99.8% (775 of 776 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (French) Currently translated at 99.8% (775 of 776 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (Persian) Currently translated at 98.9% (768 of 776 strings) Translated using Weblate (German) Currently translated at 100.0% (776 of 776 strings) Co-authored-by: Aster Co-authored-by: Danial Behzadi Co-authored-by: Dot Max Co-authored-by: Dvuevi Co-authored-by: Hosted Weblate Co-authored-by: MS-PC Co-authored-by: Mazen Mohamed Co-authored-by: Mickaël Binos Co-authored-by: Mona Lisa Co-authored-by: Mæve Rey Co-authored-by: Sveinn í Felli Co-authored-by: VfBFan Co-authored-by: ssantos --- app/src/main/res/values-ar/strings.xml | 6 +- app/src/main/res/values-de/strings.xml | 13 +- app/src/main/res/values-es/strings.xml | 12 +- app/src/main/res/values-fa/strings.xml | 1 + app/src/main/res/values-fr/strings.xml | 4 +- app/src/main/res/values-in/strings.xml | 12 +- app/src/main/res/values-is/strings.xml | 14 +- app/src/main/res/values-ja/strings.xml | 96 ++++-- app/src/main/res/values-pt-rPT/strings.xml | 32 +- app/src/main/res/values-pt/strings.xml | 34 +- app/src/main/res/values-sv/strings.xml | 373 ++++++++++----------- app/src/main/res/values-tok/strings.xml | 3 +- 12 files changed, 311 insertions(+), 289 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index d708138bc..2e34a1de9 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -26,7 +26,7 @@ فتح في المتصفح الصوت تشغيل بواسطة كودي - البحث + بحث اللغة الإفتراضية للمحتوى الإعدادات المظهر @@ -59,7 +59,7 @@ الملفات المحملة الجميع الفيديو - التنزيل + تنزيل حول و الأسئلة الشائعة التاريخ التاريخ @@ -862,7 +862,7 @@ قم بتحرير كل إجراء إعلام أدناه من خلال النقر عليه. يتم تعيين الإجراءات الثلاثة الأولى (تشغيل/إيقاف مؤقت، السابق والتالي) بواسطة النظام ولا يمكن تخصيصها. لا توجد مساحة خالية كافية على الجهاز اعادة ضبط الإعداداتِ - النسخ الاحتياطيُّ والاستعادة + النسخ الاحتياطي والاستعادة أعيدوا جميع الإعدادات إلى قيمهم الافتراضية ستؤدي إعادة ضبط جميع الإعدادات إلى تجاهل جميع إعداداتك المفضلة وإعادة تشغيل التطبيق. \n diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 31bc9d10b..182135a4b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -186,7 +186,7 @@ Zurückgeben Website Besuche die NewPipe-Website für weitere Informationen und Neuigkeiten. - NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzererfahrung zu bieten. Gib etwas zurück, indem du den Entwicklern hilfst, NewPipe noch weiter zu verbessern, während sie sich an einer Tasse Kaffee erfreuen. + NewPipe wird von Freiwilligen entwickelt, die ihre Freizeit dafür verwenden, dir die beste Nutzungserfahrung zu bieten. Gib etwas zurück, indem du den Entwicklern hilfst, NewPipe noch weiter zu verbessern, während sie sich an einer Tasse Kaffee erfreuen. Kein Stream-Player gefunden (du kannst VLC installieren, um den Stream abzuspielen). Bevorzugtes Land des Inhalts Immer @@ -306,13 +306,12 @@ 1 Element gelöscht. NewPipe ist freie Copyleft-Software: Du kannst sie nach Belieben benutzen, untersuchen, mit anderen teilen und verbessern. Insbesondere kannst du sie unter den von der Free Software Foundation veröffentlichten Bedingungen der GNU General Public License, in der Version 3 der Lizenz oder (nach deiner Wahl) jeder späteren Version, weitergeben und/oder verändern. Möchtest du auch Einstellungen importieren\? - NewPipes Datenschutzbestimmung - Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Deshalb sammelt diese App keine Daten ohne deine Zustimmung.\nNewPipes Datenschutzbestimmungen erklären im Detail, welche Daten beim Absenden eines Absturzberichtes verschickt und gespeichert werden. - Datenschutzbestimmungen lesen + NewPipes Datenschutzerklärung + Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Daher sammelt die App keinerlei Daten ohne deine Zustimmung.\nNewPipes Datenschutzerklärung erläutert ausführlich, welche Daten beim Senden eines Absturzberichts übermittelt und gespeichert werden. + Datenschutzerklärung lesen Akzeptieren Ablehnen - Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipes Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. -\nDu musst den Datenschutzrichtlinien zustimmen, um den Fehlerbericht an uns zu senden. + Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipes Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. \nDu musst dieser zustimmen, um den Fehlerbericht an uns zu senden. Unbegrenzt Auflösung bei Verwendung mobiler Daten begrenzen Beim App-Wechsel minimieren @@ -436,7 +435,7 @@ Instanz existiert bereits Lokal Kürzlich hinzugefügt - Auto-generiert (kein Autor gefunden) + Automatisch erzeugt (kein Autor gefunden) Eine Instanz wählen Bevorzugte Peertube-Instanzen auswählen Es werden nur HTTPS-Adressen unterstützt diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 78e359b6e..351f9da78 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -34,7 +34,7 @@ Los archivos de audio descargados se almacenan aquí Elija la carpeta de descarga para los archivos de audio Carpeta de descarga de audio - Video y audio + Vídeo y audio Error Error de conexión No se pudo cargar las miniaturas @@ -110,7 +110,7 @@ Ver en GitHub Licencia de NewPipe Tanto si tiene ideas de traducción, cambios de diseño, limpieza de código o modificaciones profundas en el código, la ayuda siempre es bienvenida. ¡Cuanto más se haga, mejor se vuelve! - Leer la licencia + Leer licencia Contribuir Suscribirse Suscrito @@ -184,7 +184,7 @@ Lo nuevo y lo mejor Mantener pulsado para añadir a la cola Donar - NewPipe es desarrollado por voluntarios que dedican su tiempo libre a ofrecerle la mejor experiencia de usuario. Colabore para ayudar a los desarrolladores a hacer que NewPipe sea aún mejor mientras disfrutan de una taza de café. + NewPipe es desarrollado por voluntarios que dedican su tiempo libre a ofrecerle la mejor experiencia de usuario. Puedes hacer una donación para ayudar a los desarrolladores y hacer que NewPipe sea aún mejor mientras disfrutan de una taza de café. Colaborar Sito web Visita el nuevo sitio web de NewPipe para más detalles y noticias. @@ -301,12 +301,12 @@ ¿Borrar todo el historial de búsqueda\? Historial de búsquedas borrado Se ha borrado 1 elemento. - NewPipe es software libre con copyleft: puede usarlo, estudiarlo, compartirlo y mejorarlo a su antojo. Específicamente, puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU publicada por la Free Software Foundation, ya sea la versión 3 de la Licencia o (a su elección) cualquier versión posterior. + NewPipe es software libre con copyleft: 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 de 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. ¿Quieres importar también los ajustes\? Política de privacidad de NewPipe El proyecto NewPipe toma tu privacidad muy en serio. Por ello, la aplicación no recopila ningún dato sin tu consentimiento. \nLa política de privacidad de NewPipe explica en detalle qué datos se envían y almacenan al enviar un informe de fallo. - Leer la política de privacidad + Leer política de privacidad Para cumplir con el «Reglamento general europeo de protección de datos (GDPR)», atraemos su atención sobre la política de privacidad de NewPipe. Por favor léase cuidadosamente. \nDebe aceptarlo para enviarnos el informe de error. Aceptar @@ -703,7 +703,7 @@ Tamaño del intervalo de carga de reproducción Ver en el sitio web Preguntas frecuentes - Si tiene problemas al usar la aplicación, ¡asegúrese de consultar estas respuestas a las preguntas comunes! + Si tienes problemas al usar la aplicación, ¡Asegúrate de verificar estas respuestas a preguntas comunes! Ordenar Modo rápido Importa o exporta las suscripciones desde el menú con los tres puntos diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 4934a4bdb..82fe492dd 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -854,4 +854,5 @@ برون‌ریزی اشتراک‌هایتان به پروندهٔ ‪.json‬ نیوپایپ دارد پشتیبانی از اندروید ۵ را رها می‌کند هنگام پخش کردن کارساز خطای HTTP ‏%1$s داد + برای استفاده از پخش‌کنندهٔ بالاپریدنی %1$s را در فهرست تنظیمات اندروید زیر گزیده و %2$s را به کار بیندازید. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b34ae522f..9fc9b9864 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -12,7 +12,7 @@ Aucun lecteur de flux trouvé. Installer VLC \? Ouvrir dans le navigateur Lire avec Kodi - Rechercher + Chercher Paramètres Partager Partager avec @@ -253,7 +253,7 @@ Télécharger le flux Ajout automatique du flux suivant à la file de lecture Continue la file de lecture (non répétitive) en ajoutant un flux lié - Débogage + Corriger Remplir Générés automatiquement La surveillance des fuites de mémoire peut geler l’application durant le vidage du tas diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index be53db6bd..137818d74 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -7,7 +7,7 @@ Buka di peramban Bagikan Unduh - Cari + Telusur Pengaturan Bagi dengan Gunakan pemutar video lain @@ -31,8 +31,8 @@ Video \'Berikutnya\' dan \'Serupa\' URL tidak didukung Bahasa konten - Video dan audio - Tampilan + Audio dan Video + Penampilan Memutar di latar belakang Konten Tampilkan konten yang dibatasi usia @@ -100,7 +100,7 @@ Saran pencarian Menampilkan saran pencarian saat mencari Kualitas terbaik - Unduhan + Unduh Karakter yang diizinkan sebagai nama berkas Karakter yang tidak valid akan diganti dengan karakter ini Karakter pengganti @@ -139,7 +139,7 @@ Lokasi Konten Pemutar Perilaku - Riwayat dan cache + Riwayat & Cache Debug Urungkan Putar Semua @@ -800,7 +800,7 @@ \nApakah Anda yakin ingin melanjutkan? NewPipe dapat memeriksa versi baru secara berkala dan memberi tahu Anda ketika ada yang baru. \nApakah Anda ingin mengaktifkan ini? - Cadangkan dan pulihkan + Cadangkan dan Pulihkan Pengaturan dalam ekspor yang diimpor menggunakan format rentan yang tidak digunakan lagi sejak NewPipe 0.27.0. Pastikan ekspor yang diimpor berasal dari sumber tepercaya, dan lebih memilih hanya menggunakan ekspor yang diperoleh dari NewPipe 0.27.0 atau yang lebih baru di masa mendatang. Dukungan untuk mengimpor pengaturan dalam format rentan ini akan segera dihapus sepenuhnya, dan NewPipe versi lama tidak akan dapat lagi mengimpor pengaturan ekspor dari versi baru. sekunder Daftar putar diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index aa8c2e72c..854259735 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -53,7 +53,7 @@ Tilkynningar fyrir nýjar útgáfur NewPipe Hreinsa vefkökur sem NewPipe geymir þegar þú leysir reCAPTCHA NewPipe rakst á villu, ýttu til að tilkynna hana - Um okkur og algengar spurningar + Um okkur & algengar spurningar Gerast áskrifandi Aðeins sum tæki geta spilað 2K/4K myndskeið Spila með Kodi @@ -133,7 +133,7 @@ NewPipe verkefnið tekur friðhelgi þína mjög alvarlega. Þess vegna safnar forritið ekkert án samþykkis þíns. \nPersónuverndarstefna NewPipe útskýrir í smáatriðum hvaða gögn eru send og geymd þegar þú sendir hrunskýrslu. Spilari - Aflúsa + Villuleit Sjálfgefið tungumál efnis Tungumál Bæta við @@ -142,7 +142,7 @@ Svört Setja næsta streymi sjálfkrafa í biðröð Stokka - Innihald + Efni Ekkert Hreinsa Þema @@ -250,19 +250,19 @@ Leysa Lokið Beðið eftir þraut reCAPTCHA - Leyfi þriðja aðila + Notkunarleyfi utanaðkomandi aðila Hugbúnaðarleyfi © %1$s • %2$s • %3$s Taka þátt Allt er velkomið — hugmyndir, þýðingar, endurhönnun, kóðahreinsun eða miklar kóðabreytingar. Því fleiri, því betra! Skoða á GitHub - Gefa pening - Gefa + Styrkja + Gefa til baka Vefsíða Lesa persónuverndarstefnu Áhorf Áhorf - Lesa leyfi + Lesa notkunarleyfi Nýlega spilað Mest spilað Aðalsíða diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e915bb809..5fc287e20 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -101,15 +101,15 @@ 検索候補の表示 検索時に表示する候補を選択します 最高 - NewPipe について - サードパーティー ライセンス + NewPipeについて + サードパーティライセンス © %1$s 作者 %2$s ライセンス %3$s - バージョン情報とよくある質問 + 概要とよくある質問 ライセンス - Android 向けのフリーで軽量なストリーミング。 - GitHub で表示 - NewPipe のライセンス - 翻訳、デザインの変更、コードの整理、動作の重いコードの変更など、アイデアをお持ちではありませんか?ヘルプはいつでも歓迎します。より良いものを一緒に作り上げましょう! + Android向けの自由で軽量なストリーミングアプリ。 + GitHubで見る + NewPipeのライセンス + 翻訳、デザインの変更、コードの整理、大規模なコード変更など、どんな形の協力もいつでも歓迎します。手を加えるほど、より良いものになります! ライセンスを読む 貢献する チャンネル登録 @@ -138,26 +138,26 @@ 一致する結果はありませんでした チャンネル登録者なし 動画がありません - 保存 + ダウンロード ファイル名に使用可能な文字 無効な文字はここで指定した文字に置き換えられます ファイル名の自動修正 文字と数字 文字と数字と、多くの特殊文字 - 寄付 - NewPipe は、あなたに最高の体験を提供するために、ボランティアが自分たちの時間を使って開発しています。開発者たちがコーヒーを飲みながら NewPipe を継続的に改良できるよう、ご支援をお願いします。 - Webサイト - NewPipe の詳しい情報や最新情報については、ウェブサイトをご覧ください。 + 寄付する + NewPipeは、最高のユーザー体験を届けるために、ボランティアが自由時間を使って開発しています。開発者がコーヒーを楽しみながらNewPipeをさらに良くできるよう、ぜひ支援してください。 + ウェブサイト + 詳しい情報や最新ニュースについては、NewPipeのウェブサイトをご覧ください。 履歴 履歴 このアイテムを検索履歴から削除しますか? メインページのコンテンツ 空白ページ - Kioskページ + キオスクページ チャンネルページ チャンネルを選択 登録しているチャンネルはありません - Kioskを選択 + キオスクを選択 人気 トップ50 削除 @@ -245,8 +245,8 @@ チャンネル プレイリスト ユーザー - NewPipe プライバシーポリシー - プライバシーポリシーを確認 + NewPipeのプライバシーポリシー + プライバシーポリシーを読む おおまかなシーク おおまかなシークを使用することで精度が下がる代わりに高速にシークができます。5 秒、15 秒または 25 秒間隔のシークはできません キューに関連動画を追加して再生を続ける (繰り返ししない場合) @@ -262,9 +262,8 @@ 1 つのアイテムが削除されました。 支援する - NewPipe プロジェクトはあなたのプライバシーを非常に大切にしています。あなたの同意がない限り、アプリはいかなるデータも収集しません。 -\nNewPipe のプライバシー・ポリシーでは、クラッシュリポート送信時にどのような種類のデータが送信・記録されるかを詳細に説明しています。 - NewPipe はコピーレフトなソフトウェアです。あなたは自由にそれを使用し、研究し、共有し、そして改善することができます。あなたは、GNU フリーソフトウェア財団が公開する GNU General Public ライセンス バージョン3以降の下に、自由に再配布・修正を行うことができます。 + NewPipeプロジェクトは、ユーザーのプライバシーを非常に重視しています。そのため、このアプリがユーザーの同意なくデータを収集することはありません。\nNewPipeのプライバシーポリシーでは、クラッシュレポートを送信した際に、どのようなデータが送信および保存されるかを詳しく説明しています。 + NewPipeは、コピーレフトの自由ソフトウェアです。自由に使用、研究、共有、改良できます。具体的には、フリーソフトウェア財団が公開しているGNU General Public Licenseのバージョン3、またはそれ以降の任意のバージョンの条件に従って、再配布や改変を行えます。 最終再生日時 最も再生された動画 拡大 @@ -320,7 +319,7 @@ 音階 登録解除 タブを選択 - アプリの更新 + 更新 イベント 新しい NewPipe バージョンの通知 外部記憶装置は利用できません @@ -406,7 +405,7 @@ %s本の動画 - デフォルトのKiosk + デフォルトのキオスク 誰も見ていません %s人が視聴中 @@ -437,7 +436,7 @@ アプリの言語 システムの既定 解けたら「完了」を押してください - 完了 + 閉じる 動画 %d 秒 @@ -497,7 +496,7 @@ この動画には年齢制限があります。 \n \n閲覧したい場合、設定から \"%1$s\" を有効化してください。 - プレイリストに追加される前も追加された後も視聴した動画はプレイリストから削除されます。 \nよろしいですか?この操作は元に戻せません! + プレイリストへの追加前または追加後に視聴済みとなった動画が削除されます。\nよろしいですか? はい、部分的に視聴した動画も削除します 視聴済みの動画を削除しますか? 視聴済みを削除 @@ -684,11 +683,11 @@ 外部プレイヤーで利用可能な動画ストリームがありません 外部プレイヤーでの品質を選択 並び替え - ウェブサイトを表示 + ウェブサイトで見る タップして%sをダウンロード あなたはNewPipeの最新版を起動しています よくある質問 - アプリの使い方に困ったときは、よくある質問に答えていますので、ぜひご覧ください! + アプリの使用中に問題が発生した場合は、よくある質問への回答をご確認ください! %sがテーマに選択された場合のみ、この選択肢が利用可能です 高速モード 3点メニューから登録チャンネルの読み込みまたは書き出しが可能 @@ -804,8 +803,53 @@ インポートされているエクスポートの設定は、NewPipe 0.27.0以降は非推奨であった脆弱な形式を使用します。 インポートされているエクスポートは信頼できる情報源からであり、将来的にはNewPipe 0.27.0かこれより新しいバージョンから得られるエクスポートのみを優先して使用します。 この脆弱な形式で設定をインポートするための対応はすぐに完全に削除され、新しいバージョンからエクスポートの設定をインポートすることは出来ません。 YouTubeの一時的なプレイリストとして共有 二次的 - Google は、2026/2027 年から、認定 Android デバイス上のすべてのアプリについて、開発者が個人の身元情報を直接 Google に提出することを必須にすると発表しました。本アプリの開発者はこの要件に同意していないため、このアプリはその時点以降、認定 Android デバイス上で動作しなくなります。 + 2025年8月、Googleは、2026年9月以降、Playストア以外からインストールするアプリを含め、認定済み端末上のすべてのAndroidアプリのインストールに開発者の確認が必要になると発表しました。NewPipeの開発者はこの要件に同意していないため、それ以降、NewPipeは認定済みAndroid端末で動作しなくなります。 詳細 解決 %sB + %1$sを検索 + %1$s(%2$s)を検索 + プレイリスト + ポップアッププレーヤーを使用するには、次のAndroid設定メニューで%1$sを選択し、%2$sを有効にしてください。 + 「他のアプリの上に表示」を許可 + %sK + %sM + ファイルを削除 + エントリを削除 + フィードグループを選択 + フィードグループはまだ作成されていません + + %d件の登録チャンネルをエクスポートしています… + + + %d件の登録チャンネルを読み込んでいます… + + + %d件の登録チャンネルをインポートしています… + + 登録チャンネルをインポート + 登録チャンネルをエクスポート + 以前エクスポートした.jsonファイルから登録チャンネルをインポート + 登録チャンネルを.jsonファイルにエクスポート + 以前のエクスポートからインポート + チャンネルグループページ + アカウントは停止されました\n\n%1$sによる理由: %2$s + 高評価 + SoundCloudのトップ50ページを削除しました + SoundCloudは従来のトップ50チャートを終了しました。該当するタブはメインページから削除されました。 + YouTubeの統合トレンドを削除しました + YouTubeは2025年7月21日をもって、統合トレンドページを終了しました。NewPipeでは、デフォルトのトレンドページをトレンドのライブ配信に置き換えました。\n\n設定 > コンテンツ > メインページのコンテンツから、別のトレンドページを選択することもできます。 + ゲームのトレンド + トレンドのポッドキャスト + トレンドの映画と番組 + トレンドの音楽 + エントリを削除しました + 再生中にサーバーからHTTPエラー403を受信しました。ストリーミングURLの有効期限切れまたはIPアドレスのブロックが原因である可能性があります + 再生中にサーバーからHTTPエラー%1$sを受信しました + 再生中にサーバーからHTTPエラー403を受信しました。IPアドレスのブロックまたはストリーミングURLの難読化解除に関する問題が原因である可能性があります + %1$sは、リクエスト元がボットではないことを確認するためにログインを求め、データの提供を拒否しました。\n\nお使いのIPアドレスが%1$sによって一時的にブロックされている可能性があります。しばらく待つか、別のIPアドレスに切り替えてください(たとえば、VPNのオンとオフを切り替えるか、Wi-Fiからモバイルデータ通信に切り替えます)。\n\n詳しくは こちらのFAQ項目 をご覧ください。 + このコンテンツは、現在選択されているコンテンツの国では利用できません。\n\n設定 > コンテンツ > デフォルトのコンテンツの国から選択を変更してください。 + NewPipeはAndroid 5のサポートを終了します + 残念ながら、NewPipeが依存している一部のライブラリでAndroid 5.0および5.1のサポートが終了しました。そのため、次回リリースのNewPipeはAndroid 6以降の端末でのみ動作します。詳しくはブログ記事をご覧ください。 + ブログ記事 diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index b494e990e..bed536d37 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -74,7 +74,7 @@ Este vídeo está restringido a idades. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. - Ver licença + Ler licença Apenas os URL HTTPS são suportados Falha ao validar a instância Limpar histórico de descargas @@ -120,7 +120,7 @@ %d selecionados Partilhar - Ver política de privacidade + Leia a política de privacidade Ocorreu um erro compulsivo do reprodutor Ativar \"Modo restrito\" do YouTube Pasta inexistente @@ -166,7 +166,7 @@ Miniatura da lista de reprodução alterada. Não foi possível carregar os comentários País padrão para conteúdo - Aplicação livre de reprodução de transmissões para Android. + Streaming livre e gratuito no Android. Idioma padrão para conteúdo Importar subscrições do YouTube do Google Takeout: \n @@ -181,7 +181,7 @@ Desafio reCAPTCHA solicitado Reprodução automática Instância já existe - NewPipe é desenvolvido por voluntários que utilizam o seu tempo livre para nos proporcionar a melhor experiência. Retribua para ajudar os programadores a tornarem NewPipe ainda melhor. + O NewPipe é desenvolvido por voluntários que passam o seu tempo livre a trazer-lhe a melhor experiência de utilizador. Retribua para ajudar os programadores a fazer o NewPipe ainda melhor enquanto tomam uma chávena de café. Continuar (sem repetição) a fila de reprodução anexando um vídeo relacionado Sempre Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. @@ -203,7 +203,7 @@ Ação a executar ao trocar para outra aplicação a partir do menu principal - %s Utilizar reprodutor de vídeo externo O quê:\nPedido:\nIdioma do conteúdo:\nPaís do conteúdo\nIdioma da aplicação\nServiço:\nHora GMT:\nPacote:\nVersão:\nSO Versão: - Se tem ideias para: tradução, alterações de desenho, limpeza de código, ou alterações significativas no código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará! + Caso tenha ideias; tradução, alterações de design, limpeza de código ou alterações realmente pesadas de código, a ajuda é sempre bem-vinda. Quanto mais for feito, melhor será! Limpar dados Apenas uma vez Não carregado: %d @@ -242,7 +242,7 @@ Escolha a pasta para colocar os ficheiros de áudio Atualização NewPipe disponível! Eventos - Política de privacidade do NewPipe + Política de Privacidade do NewPipe Não foi possível carregar todas as miniaturas Áudio Cancelar @@ -264,7 +264,7 @@ Duração da pesquisa de avanço/recuo rápido Ficheiro movido ou eliminado Última reprodução - Visite o site NewPipe para obter mais informação e novidades. + Visite o site do NewPipe para mais informações e novidades. Importe o seu perfil SoundCloud digitando o URL ou a ID.: \n \n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis) @@ -310,10 +310,10 @@ Mais caracteres especiais Pasta para ficheiros de áudio Detalhes: - Transferências + Descarregar Fonte Página da lista de reprodução - Definições + Configurações Mais reproduzido A mostrar resultados para: %s Mudar para segundo plano @@ -368,7 +368,7 @@ Aplicação terminou em erro Deseja remover este item do histórico de pesquisas\? Continuar reprodução - NewPipe é um software livre \"copyleft\": pode utilizar, estudar, partilhar e melhorar a aplicação. Especificamente, pode redistribuir e/ou modificar a aplicação nos termos da GNU General Public License, conforme publicada pela Free Software Foundation, tanto a versão 3 da licença ou (por opção) qualquer versão posterior. + NewPipe é um software copyleft libre: pode usá-lo, estudá-lo, partilhá-lo e melhorá-lo à vontade. Especificamente, pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (ao seu critério) qualquer versão posterior. ∞ vídeos A exportar… Mais apreciados @@ -386,7 +386,7 @@ Existe uma descarga pendente com este nome Aceitar O que ocorreu: - Participar + Contribuir Segundo plano [Desconhecido] Encontre as instâncias que gosta em %s @@ -430,9 +430,9 @@ Não foi possível ler as guias gravadas, portanto usando as guias predefinidas Fechar Sem legendas - Site oficial + Site Subscrições - Contribuir + Retribuir Formato padrão de áudio O ficheiro não existe ou não tem permissões para ler e/ou escrever O nome do grupo está vazio @@ -491,7 +491,7 @@ Conteúdo indisponível Subscrito Cache de imagens limpa - Sobre e perguntas frequentes + Sobre & Perguntas Frequentes Contagem de subscrições indisponível Ação padrão ao abrir o conteúdo — %s Repor @@ -710,7 +710,7 @@ Selecione a qualidade para reprodutores externos Tamanho do intervalo de carregamento da reprodução Perguntas frequentes - Se está a ter problemas a usar a aplicação, veja estas respostas para perguntas mais comuns! + Se tem problemas a usar a app, verifique estas respostas para perguntas comuns! Ver no site Modo rápido Importar ou exportar subscrições do menu de 3 pontos @@ -826,7 +826,7 @@ \nTem certeza que deseja continuar? Sim Não - Cópia de segurança e restauro + Backup e restauração Repor definições Não há espaço suficiente no aparelho As configurações na exportação a serem importadas usam um formato vulnerável depreciado desde NewPipe 0.27.0. Certifique-se de que a exportação que é importada é de uma fonte confiável e prefira usar apenas as exportações obtidas do NewPipe 0.27.0 ou mais recentes no futuro. O suporte para importar configurações neste formato vulnerável será removido em breve completamente e, em seguida, versões antigas do NewPipe não serão capazes de importar configurações de exportações de novas versões. diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 1b2f94adc..40821530e 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -8,7 +8,7 @@ Partilhar Descarregar Pesquisar - Definições + Configurações Será que queria dizer \"%1$s\"\? Partilhar com Utilizar reprodutor de vídeo externo @@ -104,14 +104,14 @@ Sobre o NewPipe Licenças de terceiros © %1$s de %2$s nos termos da %3$s - Sobre e perguntas frequentes + Sobre & Perguntas Frequentes Licenças - Aplicação de reprodução para Android. + Streaming livre e gratuito no Android. Ver no GitHub Licença do NewPipe - Se tem ideias para: tradução, alterações de desenho, limpeza de código, ou alterações significativas no código fonte - todas as ajudas são bem-vindas. Quanto mais se faz, melhor ficará! - Ver licença - Participar + Caso tenha ideias; tradução, alterações de design, limpeza de código ou alterações realmente pesadas de código, a ajuda é sempre bem-vinda. Quanto mais for feito, melhor será! + Ler licença + Contribuir Subscrever Subscrito Canal não subscrito @@ -151,7 +151,7 @@ %s vídeos %s vídeos - Descargas + Descarregar Carateres permitidos no nome dos ficheiros Os carateres inválidos são substituídos por este valor Carácter de substituição @@ -212,8 +212,8 @@ Ocorreu um erro: %1$s Não existem vídeos para descarregar Rejeitar - Site oficial - Visite o site NewPipe para obter mais informação e novidades. + Site + Visite o site do NewPipe para mais informações e novidades. Página \'kiosk\' Exportado Importado @@ -291,14 +291,14 @@ Remover todo o histórico de pesquisas\? Histórico de pesquisa removido 1 item eliminado. - NewPipe é desenvolvido por voluntários que utilizam o seu tempo livre para nos proporcionar a melhor experiência. Retribua para ajudar os programadores a tornarem NewPipe ainda melhor. - Contribuir - Política de privacidade do NewPipe + O NewPipe é desenvolvido por voluntários que passam o seu tempo livre a trazer-lhe a melhor experiência de utilizador. Retribua para ajudar os programadores a fazer o NewPipe ainda melhor enquanto tomam uma chávena de café. + Retribuir + Política de Privacidade do NewPipe O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe dados sem o seu consentimento. \nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro. - Ver política de privacidade + Leia a política de privacidade Adicionar o próximo vídeo à fila automaticamente - NewPipe é um software livre \"copyleft\": pode utilizar, estudar, partilhar e melhorar a aplicação. Especificamente, pode redistribuir e/ou modificar a aplicação nos termos da GNU General Public License, conforme publicada pela Free Software Foundation, tanto a versão 3 da licença ou (por opção) qualquer versão posterior. + NewPipe é um software copyleft libre: pode usá-lo, estudá-lo, partilhá-lo e melhorá-lo à vontade. Especificamente, pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (ao seu critério) qualquer versão posterior. Também deseja importar as definições\? Toque longo para colocar na fila Ação de \'Abrir\' preferida @@ -447,7 +447,7 @@ Idioma da aplicação Predefinição do sistema Prima \"Feito\" ao resolver - Feito + Concluído Acha que a fonte demora muito tempo a carregar? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). \n \nNewPipe oferece duas estratégias de carregamento: @@ -710,7 +710,7 @@ Tamanho do intervalo de carregamento da reprodução Perguntas frequentes Ver no site - Se está a ter problemas a usar a aplicação, veja estas respostas para as perguntas mais comuns! + Se tem problemas a usar a app, verifique estas respostas para perguntas comuns! Ordem Modo rápido Importe ou exporte subscrições no menu 3 pontos @@ -821,7 +821,7 @@ Sim Não Repor valores originais de todas as definições - Cópia de segurança e restauro + Backup e restauração Repor definições A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará a aplicação. \n diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index d92f0596c..e2f3b6b56 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -2,7 +2,7 @@ Tryck på förstoringsglaset för att komma igång. Publicerad den %1$s - Ingen strömspelare hittades. Vill du installera VLC? + Ingen extern spelare hittades. Vill du installera VLC? Installera Avbryt Öppna i webbläsare @@ -14,7 +14,7 @@ Menade du: %1$s\? Dela med Använd extern videospelare - Tar bort ljud vid vissa upplösningar + Ljud saknas vid vissa upplösningar Använd extern ljudspelare Bakgrund Popup @@ -39,13 +39,13 @@ Ljust Mörkt Svart - Kom ihåg popupinställningar - Kom ihåg popup-rutans senaste storlek och position + Kom ihåg popupfönstrets inställningar + Kom ihåg popupfönstrets senaste storlek och placering Sökförslag - Välj förslag att visa i samband med sökning + Välj vilka förslag som ska visas när du söker Hämta - Visa \'Nästa\' och \'Liknande\' videor - Webbadressen stöds inte + Visa ”Nästa” och ”Liknande videor” + URL:en stöds inte Standardinnehållsspråk Video och ljud Utseende @@ -67,21 +67,21 @@ Det gick inte att analysera webbplatsen Innehållet är inte tillgängligt Det gick inte att ställa in hämtningsmenyn - App/Användargränssnittet kraschade + Appens användargränssnitt kraschade Oj, det där skulle inte ha hänt. Tyvärr gick någonting fel. Rapportera - Info: - Vad som skedde: + Information: + Vad hände: Din kommentar (på engelska): Detaljer: - Gillar - Ogillar + Gilla-markeringar + Ogilla-markeringar Prenumerera Prenumererar Prenumeration avslutad - Kunde inte ändra prenumeration - Kunde inte uppdatera prenumeration + Det gick inte att ändra prenumerationen + Det gick inte att uppdatera prenumerationen Prenumerationer Vad är nytt Sökhistorik @@ -90,8 +90,8 @@ Håll koll på videor som du tittat på Återuppta uppspelning Fortsätt uppspelning efter avbrott (t.ex. telefonsamtal) - Visa \"Håll för att köa\"-tips - Visa tips när bakgrunds- eller popup-knappen trycks på sidan för video \"Detaljer:\" + Visa tipset ”Håll ned för att köa” + Visa ett tips när du trycker på knappen för bakgrunds- eller popupuppspelning på videons detaljsida Spelare Beteende Historik och cacheminne @@ -100,15 +100,15 @@ NewPipe-avisering Aviseringar för NewPipes spelare [Okänd] - Misslyckades med att spela denna ström - Allvarligt spelarfel inträffade - Återhämtar sig från spelarfel + Det gick inte att spela upp strömmen + Ett allvarligt spelarfel inträffade + Försöker återställa uppspelningen efter ett spelarfel Rapportera via e-post - Vad:\nBegäran:\nInnehållsspråk:\nInnehållsland:\nApp-språk:\nTjänst:\nGMT-tid:\nPaket:\nVersion:\nOS-version: - Spela video, längd: - Uppladdarens avatar-miniatyrbild + Vad:\nBegäran:\nInnehållsspråk:\nInnehållsland:\nAppspråk:\nTjänst:\nGMT-tid:\nPaket:\nVersion:\nOS-version: + Spela upp video, längd: + Uppladdarens profilbild Inga resultat - Här va\' det tomt + Här var det tomt Video Ljud Försök igen @@ -131,19 +131,19 @@ Pausa Ta bort Kontrollsumma - Okej + OK Filnamn Trådar Fel - NewPipe-hämtning - Tryck för detaljer + Hämtning i NewPipe + Tryck för att visa detaljer Vänta… - Kopierat till urklipp + Kopierat till urklippet Ange en hämtningsmapp senare i inställningarna - Denna behörighet krävs för att \nöppna i popup-läge + Den här behörigheten krävs för att \nöppna popupfönstret reCAPTCHA-utmaning reCAPTCHA-utmaning begärd - Hämtning + Hämtningar Tillåtna tecken i filnamn Ogiltiga tecken ersätts med detta värde Ersättningstecken @@ -152,13 +152,13 @@ Om NewPipe Tredjepartslicenser © %1$s av %2$s under %3$s - Om & vanliga frågor + Om och vanliga frågor Licenser - Lättviktsströmning på Android med fri programvara. + Lättviktig strömning på Android med fri programvara. Visa på GitHub NewPipes licens - Oavsett om du har idéer kring översättning, designändringar, uppstädning av kod eller riktigt tunga kodändringar är hjälp alltid välkommen. Ju mer som görs, desto bättre blir det! - Läs licens + Oavsett om du har idéer om översättningar, designförbättringar, kodstädning eller omfattande kodändringar är all hjälp välkommen. Ju fler som bidrar, desto bättre blir NewPipe! + Läs hela licensen Bidra Historik Historik @@ -184,23 +184,23 @@ Ge tillbaka Webbplats Besök NewPipes webbplats för mer information och nyheter. - Visa info + Visa information Bokmärkta spellistor Lägg till i - Använd snabb icke-exakt sökning - Cacheminnet för bilder rensat + Använd snabb, ungefärlig spolning + Bildcachen har rensats Felsökning Alltid Bara en gång Fil - Rensa metadata i cacheminnet - Ingen strömspelare hittades (du kan installera VLC för att spela upp). - Hämta strömfil - Inexakt sökning gör det möjligt att söka snabbare med mindre precision. Att hoppa 5, 15 eller 25 sekunder fungerar inte med detta val - Ta bort alla cachade webbsidor + Rensa metadatacachen + Ingen extern spelare hittades. Du kan installera VLC för att spela upp innehållet. + Hämta strömmen + Ungefärlig spolning går snabbare men är mindre exakt. Hopp på 5, 15 eller 25 sekunder fungerar inte när alternativet är aktiverat. + Ta bort all cachelagrad metadata Metadatacachen har rensats - Köa nästa strömning automatiskt - Fortsätt en avslutad (icke-upprepande) uppspelningskö genom att lägga till en relaterad ström + Köa nästa ström automatiskt + Fortsätt en avslutad uppspelningskö som inte upprepas genom att lägga till en relaterad ström Standardinnehållsland Kanaler Spellistor @@ -211,10 +211,10 @@ Växla till huvudspelare Importera databas Exportera databas - Skriver över din nuvarande historik, prenumerationer, spellistor och (valbart) inställningar + Skriver över din nuvarande historik, dina prenumerationer och spellistor samt, valfritt, dina inställningar Exportera historik, prenumerationer, spellistor och inställningar Rensa visningshistorik - Tar bort historiken för spelade videoklipp och uppspelningspositioner + Tar bort historiken över uppspelade videor och sparade uppspelningspositioner Ta bort hela visningshistoriken\? Visningshistorik borttagen Rensa sökhistorik @@ -225,31 +225,31 @@ Inga videoströmningar hittades Inga ljudspår hittades 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 + Filen eller innehållskällan finns inte + Filen finns inte eller saknar läs- eller skrivbehörighet Filnamnet får inte vara tomt Ett fel uppstod: %1$s - Inga strömningar tillgängliga för hämtning + Inga strömmar är tillgängliga för hämtning Dra för att ändra ordning Skapa Avfärda Byt namn 1 objekt borttaget. NewPipes integritetspolicy - NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. \nNewPipes sekretesspolicy förklarar i detalj vad för data som skickas och lagras när du skickar en kraschrapport + NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. \nNewPipes integritetspolicy beskriver vilka uppgifter som skickas och lagras när du skickar en kraschrapport. Läs integritetspolicyn - NewPipe är copyleft-licensierad fri programvara: du får använda, studera, dela och förbättra den som du vill. Mer specifikt får du distribuera och/eller modifiera den enligt villkoren i GNU General Public License, såsom den publicerats av Free Software Foundation, antingen version 3 av licensen eller, om du så önskar, någon senare version. + NewPipe är fri programvara under en copyleft-licens: du får använda, studera, dela och förbättra programmet. Du får distribuera och ändra det enligt villkoren i GNU General Public License, version 3 eller, om du föredrar det, en senare version. 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. + Det här skriver över dina nuvarande inställningar. Vill du också importera inställningar? Öppna navigationspanelen Stäng navigationspanelen - Föredragen \"öppna\" åtgärd + Föredragen öppningsåtgärd Standardåtgärden när du öppnar innehåll — %s Videospelare Bakgrundsspelare @@ -267,101 +267,86 @@ Ta bort spellista\? Spellistan skapades Tillagd i spellistan - Spellistans miniatyrbild förändrades. + Spellistans miniatyrbild har ändrats. Ingen textning Passa Fyll Zoom Automatiskt genererad Textning - Ändra spelarens textskala och bakgrundsstil. Kräver att appen startas om för att träda i kraft - 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 + Ändra spelarens textstorlek och bakgrundsstil. Appen måste startas om innan ändringarna börjar gälla. + Övervakning av minnesläckor kan göra att appen inte svarar när en heap-dump skapas + Rapportera fel utanför livscykeln + Tvinga rapportering av otillåtna Rx-undantag utanför fragmentets eller aktivitetens livscykel efter rensning Importera Importera från Exportera till - Importera… + Importerar… Exporterar… Importera fil Föregående export - Kunde inte importera prenumerationer - kunde inte exportera prenumerationer - Importera YouTube-prenumerationer från Google takeout: -\n -\n1. Gå till följande webbadress: %1$s -\n2. Logga in när du blir tillfrågad -\n3. Klicka på \"All YouTube-data tas med\", sen på \"Avmarkera alla\", välj sen bara \"prenumerationer\" och klicka på \"OK\" -\n4. Klicka på \"Nästa steg\" och sen på \"Skapa export\" -\n5. Klicka på \"Hämta\"-knappen när den kommer fram -\n6. Klicka på IMPORTERA FIL nedan och välj den nedladdade zip-filen -\n7. [Om zip-importen misslyckas] Packa upp .csv-filen (vanligtvis under \"YouTube och YouTube Musik/subscriptions/subscriptions.csv\"), klicka på IMPORTERA FIL nedan och välj den uppackade csv-filen - Importera en SoundCloud-profil genom att skriva in webbadressen eller ditt ID: -\n -\n1. Aktivera \"skrivbordsläge\" i en webbläsare (sidan är inte tillgänglig för mobila enheter) -\n2. Gå till följande webbadress: %1$s -\n3. Logga in när du blir tillfrågad -\n4. Kopiera profilens webbadress som du blev omdirigerad till. + Det gick inte att importera prenumerationerna + Det gick inte att exportera prenumerationerna + Importera YouTube-prenumerationer från Google Takeout: \n \n1. Gå till följande URL: %1$s \n2. Logga in när du blir ombedd \n3. Klicka på ”All YouTube-data tas med”, sedan på ”Avmarkera alla”, välj endast ”prenumerationer” och klicka på ”OK” \n4. Klicka på ”Nästa steg” och sedan på ”Skapa export” \n5. Klicka på knappen ”Hämta” när den visas \n6. Klicka på IMPORTERA FIL nedan och välj den hämtade ZIP-filen \n7. [Om ZIP-importen misslyckas] Packa upp CSV-filen, klicka på IMPORTERA FIL nedan och välj den uppackade filen + Importera en SoundCloud-profil genom att ange profilens URL eller ditt ID: \n \n1. Aktivera skrivbordsläget i en webbläsare eftersom sidan inte är tillgänglig för mobila enheter \n2. Gå till följande URL: %1$s \n3. Logga in när du blir ombedd \n4. Kopiera URL:en till profilen som du omdirigerades till. dittID, soundcloud.com/dittid - Tänk på att denna operation kan vara nätverksintensiv. -\n -\nVill du fortsätta\? + Den här åtgärden kan använda mycket nätverksdata. \n \nVill du fortsätta? Kontroller för uppspelningshastighet Tempo Tonhöjd - Avlänka (kan orsaka förvrängning) - Snabbspola vid frånvaro av ljud + Koppla isär (kan orsaka distorsion) + Hoppa över tystnad Steg Återställ - För att uppfylla EU:s allmänna dataskyddsförordning (GDPR), uppmärksammar vi härmed NewPipes sekretesspolicy. Var god och läs den noggrant. \nDu måste acceptera den för att kunna skicka felrapporten. + Läs NewPipes integritetspolicy noggrant. \nDu måste godkänna den för att kunna 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 - Åtgärd när du växlar till andra applikationer från huvudvideospelare — %s + Begränsa upplösningen när mobildata används + Minimera när du lämnar appen + Åtgärd när du växlar från huvudvideospelaren till en annan app — %s Ingen Minimera till bakgrundsspelare Minimera till popup-spelare Sluta prenumerera Välj flik Uppdateringar - Fil raderad + Filen har tagits bort Avisering för appuppdatering Aviseringar för nya NewPipe-versioner Extern lagring otillgänglig - Fel vid läsning av sparade flikar, använder standardflikar + Det gick inte att läsa in de sparade flikarna. Standardflikarna används. Återställ standardvärden - Vill du återställa till standard\? + Vill du återställa standardvärdena? Antalet prenumeranter är otillgängligt Vilka flikar visas på huvudsidan Uppdateringar - Visa avisering för att uppdatera appen när en ny version finns tillgänglig + Visa en avisering när en ny version av appen finns tillgänglig Listvy Lista Rutnät Automatisk En NewPipe-uppdatering är tillgänglig! - Färdig + Slutförda pausad köad efterbehandling Köa - Åtgärden nekas av systemet + Systemet nekade åtgärden Hämtningen misslyckades Generera unikt namn Skriv över Det finns en pågående hämtning med det namnet Visa fel - Kunde inte fastställa en säker anslutning - Kunde inte hitta servern - Kunde inte ansluta till servern + Det gick inte att upprätta en säker anslutning + Det gick inte att hitta servern + Det gick inte att ansluta till servern Servern skickar ingen data - Servern accepterar inte flertrådade hämtningar, försök igen med @string/msg_threads = 1 + Servern stöder inte flertrådade hämtningar. Försök igen med @string/msg_threads = 1. Hittades inte - Efterbehandling misslyckades - Stanna - Max försök + Efterbehandlingen misslyckades + Stoppa + Maximalt antal försök Maximalt antal försök innan hämtningen avbryts Händelser Konferenser @@ -372,11 +357,11 @@ Positioner i listor Spela automatiskt Rensa data - Spola framåt/bakåt sökvaraktighet + Hoppintervall framåt och bakåt Visa indikatorer för uppspelningsposition i listor Ta bort uppspelningspositioner PeerTube-instanser - Välj dina favoritpeertube-instanser + Välj dina favoritinstanser på PeerTube Hitta de instanser du gillar på %s Lägg till instans Ange instansens URL @@ -387,7 +372,7 @@ Ta bort alla uppspelningspositioner\? Tar bort alla uppspelningspositioner Filen har flyttats eller tagits bort - Hämtning till externt SD-kort är inte möjligt. Återställ hämtningsmappens plats\? + Det går inte att hämta till det externa SD-kortet. Vill du återställa hämtningsmappens plats? Uppspelningspositionerna har tagits bort Artister Album @@ -396,7 +381,7 @@ \n \nOm du vill visa den aktiverar du \"%1$s\" i inställningarna. Inga kommentarer - Tryck på \"Klar\" när det är löst + Tryck på ”Klar” när du är färdig ∞ videor 100+ videor @@ -420,8 +405,8 @@ En fil med det namnet finns redan återhämtar Väntande - Originaltexter från tjänster kommer att synas i streamobjekt - Visa ursprungstid på objekt + Visa tjänsternas ursprungliga tidsangivelser för strömmar + Visa ursprungliga tidsangivelser Automatiskt genererad (ingen uppladdare hittades) Slå på ljudet Tysta @@ -433,11 +418,11 @@ Det gick inte att läsa in kommentarerna Inaktivera snabbläge Aktivera snabbläge - Det är tillgängligt i vissa tjänster och är vanligtvis mycket snabbare, men kan returnera en begränsad mängd objekt och ofta ofullständig information (t.ex. ingen speltid, objekttyp, ingen live-status) - Hämta från dedikerat flöde när det finns tillgängligt + Funktionen finns för vissa tjänster och är vanligtvis mycket snabbare, men kan ge färre objekt och ofullständig information, till exempel utan speltid, objekttyp eller direktsändningsstatus + Använd ett särskilt snabbflöde när det är tillgängligt Uppdatera alltid - Tid efter senaste uppdatering innan en prenumeration anses vara föråldrad — %s - Tröskel för uppdatering av flöde + Tid sedan den senaste uppdateringen innan en prenumeration betraktas som inaktuell — %s + Tidsgräns för flödesuppdatering Flöde Ny Vill du ta bort den här gruppen\? @@ -469,35 +454,34 @@ %d sekund %d sekunder - På grund av ExoPlayer-begränsningar sattes söktiden till %d sekunder + På grund av begränsningar i ExoPlayer sattes hoppintervallet till %d sekunder Ja, och delvis tittade videor - Strömningar som har spelats före och efter att de har lagts till i spellistan kommer att tas bort. \nÄr du säker? + Strömmar som har spelats upp både före och efter att de lades till i spellistan tas bort. \nVill du fortsätta? Ta bort tittade strömningar? Ta bort tittade - Systemstandard + Systemets standardspråk Appspråk Välj en instans - \"Storage Access Framework\" möjliggör hämtningar till ett externt SD-kort + Med Storage Access Framework kan filer hämtas till ett externt SD-kort Använd systemmappväljaren (SAF) - Du kommer att bli tillfrågad var du vill spara varje hämtning. -\nAktivera systemmappväljaren (SAF) om du vill hämta till ett externt SD-kort + Du får välja var varje hämtning ska sparas. \nAktivera systemmappväljaren (SAF) om du vill hämta till ett externt SD-kort Fråga var filen ska sparas Pausa hämtningar Starta hämtningar En hämtning körs samtidigt Begränsa hämtningskön - Stäng ner - Användbart vid byte till mobildata, även om vissa hämtningar inte kan avbrytas - Avbryt på uppmätta nätverk + Stäng + Användbart vid byte till mobildata, även om vissa hämtningar inte kan pausas + Pausa i nätverk med datagräns Ta bort hämtade filer Vill du rensa din hämtningshistorik eller ta bort alla hämtade filer\? Rensa hämtningshistorik Kan inte återställa den här hämtningen - Anslutningsavbrott - Förloppet gick förlorat eftersom filen togs bort + Tidsgränsen för anslutningen överskreds + Hämtningsförloppet gick förlorat eftersom filen togs bort Inget utrymme kvar på enheten - NewPipe stängdes under arbete med en fil - Vänligen kontrollera om en felrapport som tar upp din krasch redan finns. Att skapa ärenden när en felrapport redan finns, tar av den tid som vi annars kunde ha ägnat åt att fixa den faktiska buggen. + NewPipe stängdes medan en fil bearbetades + Kontrollera först om det redan finns en felrapport om kraschen. Dubbletter tar tid från arbetet med att åtgärda själva felet. Rapportera på GitHub Kopiera formaterad felrapport Visar resultat för: %s @@ -508,14 +492,14 @@ Visa endast prenumerationer som inte grupperats Beskär miniatyrbild till 1:1-bildförhållande Endast över Wi-Fi - Beskär videominiatyrbilden som visas i aviseringen från 16:9 till 1:1 bildförhållande + Beskär videominiatyrbilden i aviseringen från bildförhållandet 16:9 till 1:1 Starta uppspelning automatiskt — %s Uppspelningskö - Kunde inte känna igen URL:en. Vill du öppna med annan app\? + URL:en kunde inte identifieras. Vill du öppna den med en annan app? Köa automatiskt Den aktiva uppspelningskön kommer att ersättas Att byta från en spelare till en annan kan ersätta din kö - Fråga om bekräftelse innan en kö töms + Bekräfta innan uppspelningskön ersätts Buffring Upprepa Femte åtgärdsknappen @@ -523,9 +507,7 @@ Tredje åtgärdsknappen Andra åtgärdsknappen Första åtgärdsknappen - Detta innehåll stöds ännu inte av NewPipe. -\n -\nDetta kommer förhoppningsvis ändras i en kommande version. + NewPipe stöder ännu inte det här innehållet. \n \nDet kan ändras i en kommande version. Spellistesida Aldrig Ingenting @@ -547,10 +529,10 @@ Tycker du att inläsningen av flödet är för långsamt? Testa i så fall att aktivera snabbinläsning (du kan ändra det i inställningarna eller genom att trycka på knappen nedan). \n \nNewPipe erbjuder två strategier för att ladda flödet: \n• Att hämta hela den prenumererade kanalen, vilket är långsamt, men komplett. \n• Att använda en \"särskild tjänsteslutpunkt\", vilket är snabbt, men vanligtvis inte komplett. \n \nSkillnaden mellan de två är att den snabba varianten ofta saknar viss information, som objektets speltid eller typ (kan inte skilja på livevideor och vanliga videor) och den kan returnera färre objekt. \n \nYouTube är ett exempel på en tjänst som erbjuder denna snabba metod genom sitt RSS-flöde. \n \nSå valet handlar i grunden om vad du föredrar: hastighet eller precis information. Inaktivera för att dölja rutor med metainformation som ytterligare information om strömmens skapare, strömmens innehåll eller sökord Inaktivera för att dölja videobeskrivning och ytterligare information - Visa meta-information + Visa metainformation Använd miniatyrbild som bakgrund till både låsskärm och aviseringar Redigera varje aviseringsåtgärd nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger. - Låt Android färglägga varje avisering individuellt utifrån miniatyrbildens huvudsakliga färg (notera att detta inte är tillgängligt på alla enheter) + Låt Android färglägga varje avisering utifrån miniatyrbildens huvudsakliga färg. Funktionen finns inte på alla enheter. Färglägg avisering Du kan som mest välja tre åtgärder att visa i den kompakta aviseringen! Lös @@ -576,15 +558,13 @@ Denna video är endast tillgänglig för YouTube Music Premium-medlemmar, så den kan inte strömmas eller hämtas av NewPipe. Detta innehåll är privat, så det kan inte strömmas eller hämtas av NewPipe. Detta innehåll är inte tillgängligt i ditt land. - Ingen app på din enhet kan öppna detta + Det finns ingen app på enheten som kan öppna detta Kapitel Det gick inte att läsa in flödet för \"%s\". - Innehållsskaparens konto har avslutats. -\nNewPipe kommer framöver inte kunna läsa in detta flöde. -\nVill du avsluta din prenumeration på denna kanal\? + Innehållsskaparens konto har avslutats. \nNewPipe kommer inte längre att kunna läsa in flödet. \nVill du avsluta prenumerationen på kanalen? Du kommer att tillfrågas var varje hämtning ska sparas Visa kanaldetaljer - Ingen hämtningsmapp har ställts in ännu, välj standardmapp för hämtning nu + Ingen hämtningsmapp har angetts. Välj en standardmapp för hämtningar. Beräknar hash Visa inte Låg kvalitet (mindre) @@ -599,20 +579,20 @@ Visa beskrivning Öppna med Visa miniatyrer - Kanalens visningsminiatyr + Underkanalens miniatyrbild Det snabba flödesläget ger inte mer information om detta. Fel vid inläsning av flödet Markera som sedd - Ej listad + Olistad Aktuellt - Natt-tema + Nattema Aviseringar för videohashningsframsteg Inaktivera medietunnel om du upplever en svart skärm eller att videouppspelningen hackar. Inaktivera medietunnel Hjärtmärkt av innehållsskaparen - Du kan välja det natt-tema du föredrar nedan - Välj det natt-tema du föredrar — %s - Sökradens förhandsvisningsminiatyr + Du kan välja önskat nattema nedan + Välj önskat nattema — %s + Förhandsvisning i sökfältet Lokala sökförslag Tog bort %1$s nedladdning @@ -629,7 +609,7 @@ Senaste Svep objekt för att ta bort dem Förslag via fjärrsökning - Starta inte videor i minispelaren, utan byt till helskärmsläge direkt, om automatisk rotation är låst. Du kan fortfarande komma åt minispelaren genom att gå ut ur helskärmsläge + Starta videor direkt i helskärmsläge i stället för i minispelaren när automatisk rotation är låst. Du kan fortfarande öppna minispelaren genom att lämna helskärmsläget. Sök efter uppdateringar Sök manuellt efter nya versioner Söker efter uppdateringar… @@ -637,41 +617,40 @@ Visa \"Krascha spelaren\" Krascha spelaren Visar ett kraschalternativ vid användning av spelaren - Felrapport-avisering - Aviseringar om att rapportera fel - NewPipe stötte på ett fel, tryck för att rapportera - Ett fel uppstod, se aviseringen - Visa ett felmeddelande i snackbar + Aviseringar om felrapporter + Aviseringar för rapportering av fel + NewPipe stötte på ett fel. Tryck för att rapportera det. + Ett fel inträffade. Se aviseringen. + Visa ett tillfälligt felmeddelande Skapa en felavisering - Ingen lämplig filhanterare hittades för denna åtgärd. -\nInstallera en filhanterare eller testa att inaktivera \'%s\' i nedladdningsinställningarna + Ingen lämplig filhanterare hittades för åtgärden. \nInstallera en filhanterare eller prova att inaktivera \'%s\' i hämtningsinställningarna Ingen lämplig filhanterare hittades för denna åtgärd. \nInstallera en filhanterare som är kompatibel med Storage Access Framework Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer-standard - Ändra storleken på laddningsintervallet för progressivt innehåll (för närvarande %s). Ett lägre värde kan påskynda den första laddningen + Ändra storleken på inläsningsintervallet för progressivt innehåll (för närvarande %s). Ett lägre värde kan påskynda den första inläsningen. Uppdateringsintervall Nödvändig nätverksanslutning Alla nätverk Radera alla nedladdade filer från disken\? Aviseringar är avstängda - Bli meddelad + Aktivera aviseringar Du prenumererar nu på denna kanal Aviseringar om nya strömningar för prenumerationer %s ny strömning %s nya strömningar - Konfigurera meddelande om aktuell ström som spelas upp + Konfigurera aviseringen för strömmen som spelas upp Sök efter nya strömningar Meddela om nya strömningar från prenumerationer Aviseringar Nya strömningar - Laddar strömdetaljer… + Läser in information om strömmen… Aviseringar om nya strömningar , - Spelaravisering + Spelaraviseringar Växla alla Procent Halvton @@ -680,63 +659,63 @@ Inga ljudströmningar tillgängliga för externa spelare Okänt format Videoströmningar som ännu inte stöds av nedladdaren visas inte - Inläsningsintervallsstorlek + Storlek på inläsningsintervall Välj kvalitet för externa spelare Den valda videoströmmen stöds inte av externa spelare - Om du har problem med att använda appen, se till att läsa dessa svar på några vanliga frågor! + Läs svaren på vanliga frågor om du har problem med att använda appen. Vanliga frågor Visa på webbplatsen Sortera - Importera eller exportera prenumerationer från 3-punktsmenyn - Snabbt läge + Importera eller exportera prenumerationer från trepunktsmenyn + Snabbläge Du använder den senaste versionen av NewPipe - Tryck för att ladda ner %s - Det här alternativet är endast tillgängligt om %s har valts som Tema - Inaktivera permanent miniatyrbild + Tryck för att hämta %s + Det här alternativet är endast tillgängligt när %s har valts som tema + Ta bort den permanenta miniatyrbilden Det gick inte att kopiera till urklipp Kort - Dubblett tillagd %d gång(er) + Antal tillagda dubbletter: %d Spellistor som är gråmarkerade innehåller redan det här objektet. Användbart om du till exempel använder ett headset med trasiga fysiska knappar Ignorera hårdvarans mediaknappar Ta bort dubbletter\? Visa följande strömningar Delvis sedd - Vill du ta bort alla duplicerade strömningar i den här spellistan\? + Vill du ta bort alla dubbletter i den här spellistan? Ta bort dubbletter - Visa/Dölj strömningar + Visa eller dölj strömmar Fullständigt sedd Kommande Volym Ingen - Välj en gest för den vänstra halvan av spelarskärmen + Välj gest för vänstra halvan av spelarskärmen Ljusstyrka - Åtgärd för vänstergest - Välj en gest för den högra halvan av spelarskärmen - Åtgärd för högergest + Gest på vänster sida + Välj gest för högra halvan av spelarskärmen + Gest på höger sida Ljud: %s Ljudspår - Ett ljudspår bör redan finnas i denna ström + Det finns redan ett ljudspår i den här strömmen Välj ljudspår för externa spelare Okänt ExoPlayer-inställningar - Hantera vissa ExoPlayer-inställningar. Ändringarna kräver att spelaren startas om för att träda i kraft + Hantera vissa ExoPlayer-inställningar. Spelaren måste startas om innan ändringarna börjar gälla. Använd alltid ExoPlayers lösning för inställning av videoutgångsyta Föredra originalljud Välj originalljudspåret oavsett språk - Föredra beskrivande ljud - Välj ett ljudspår med beskrivningar för synskadade personer om det finns tillgängligt - Använd ExoPlayers reservfunktion för avkodare + Föredra syntolkning + Välj ett syntolkat ljudspår för personer med synnedsättning när ett sådant finns + Använd ExoPlayers reservavkodare Aktivera det här alternativet om du har problem med att initiera avkodare. ExoPlayer försöker då använda avkodare med lägre prioritet om de primära avkodarna inte kan initieras. Detta kan ge sämre uppspelningsprestanda än när de primära avkodarna används Denna lösning frigör och skapar om videokodekar när videoytan ändras, i stället för att ställa in ytan direkt i kodeken. ExoPlayer använder redan detta på vissa enheter med det här problemet, så inställningen har bara effekt på Android 6 och senare.\n\nOm du aktiverar alternativet kan det förhindra uppspelningsfel när du byter videospelare eller växlar till fullskärm %1$s %2$s original beskrivande dubbad - Flytta huvudfliksväljaren längst ned - Huvudflikarnas position + Placera väljaren för huvudflikar längst ned + Huvudflikarnas placering Inga strömningar - Inga live-strömningar + Inga direktsändningar Medietunnel har inaktiverats som standard på din enhet eftersom enhetsmodellen inte stöder funktionen. Bildkvalitet Videor @@ -746,12 +725,12 @@ Kanalflikar Shorts Laddar metadata… - Aktivera skärmorientering + Växla skärmorientering Låg kvalitet - Aktivera helskärm + Växla helskärmsläge Hämta kanalflikar Nästa strömning - Öppna spelkö + Öppna uppspelningskön Ladda inte bilder Hög kvalitet Om @@ -769,25 +748,25 @@ Längd Kanaler Föregående strömning - Live + Direktsändningar \? Dela med titlar %1$s \n%2$s - Visningsbilder - Underkanalens visningsbilder + Profilbilder + Underkanalens profilbilder Flikar att hämta när flödet uppdateras. Det här alternativet har ingen effekt om en kanal uppdateras i snabbt läge. - Uppladdarens visningsbilder + Uppladdarens profilbilder Banderoller - %1$s: %2$s - Välj bildkvalitet och om bilder överhuvudtaget ska laddas för att minska data- och minnesanvändningen. Ändringar rensar både i minnet och bildcachen på disk – %s + Välj bildkvalitet eller inaktivera bildinläsning för att minska data- och minnesanvändningen. När inställningen ändras rensas både minnescachen och bildcachen på lagringsenheten — %s Visa mer %s svar %s svar Visa mindre - Redigera varje aviseringsåtgärd nedan genom att trycka på den. De tre första åtgärderna (spela/pausa, föregående och nästa) är satta av systemet och kan inte ändras. + Redigera aviseringsåtgärderna genom att trycka på dem. De tre första åtgärderna – spela/pausa, föregående och nästa – bestäms av systemet och kan inte ändras. Inte tillräckligt med ledigt utrymme på enheten Nej Säkerhetskopiering och återställning @@ -795,10 +774,8 @@ NewPipe kan automatiskt söka efter nya versioner då och då och meddela dig när de är tillgängliga. \nVill du aktivera det? Återställ inställningar Återställ alla inställningar till deras standardvärden - Om du återställer alla inställningar försvinner alla dina föredragna inställningar och appen startas om. -\n -\nÄr du säker på att du vill fortsätta? - Inställningarna i exporten du importerar använder ett sårbart format som fasades ut i NewPipe 0.27.0. Kontrollera att exporten kommer från en betrodd källa och överväg att framöver bara använda exporter från NewPipe 0.27.0 eller senare. Stödet för att importera inställningar i det här sårbara formatet kommer snart att tas bort helt. Då kommer äldre versioner av NewPipe inte längre att kunna importera inställningsexporter från nyare versioner. + Om du återställer alla inställningar försvinner dina anpassningar och appen startas om. \n \nVill du fortsätta? + Inställningarna i exporten använder ett sårbart format som fasades ut i NewPipe 0.27.0. Kontrollera att exporten kommer från en betrodd källa och använd framöver exporter från NewPipe 0.27.0 eller senare. Stödet för det äldre formatet kommer snart att tas bort helt. sekundär Dela som tillfällig YouTube-spellista Spellistor @@ -814,22 +791,22 @@ SoundCloud Topp 50-sida borttagen SoundCloud har lagt ner de ursprungliga topp 50-listorna. Motsvarande flik har tagits bort från din startsida. YouTubes kombinerade trender har tagits bort - YouTube har upphört med den kombinerade trendsidan från och med den 21 juli 2025. NewPipe ersatte standardtrendsidan med trendiga livestreams.\n\nDu kan också välja olika trendsidor i \"Inställningar > Innehåll > Innehåll på huvudsidan\". + YouTube tog bort den kombinerade trendsidan den 21 juli 2025. NewPipe ersatte standardtrendsidan med populära direktsändningar. \nDu kan välja andra trendsidor under ”Inställningar > Innehåll > Innehåll på huvudsidan”. Speltrender - Trendiga poddar + Populära poddar Populära filmer och serier Populär musik - För att använda popupspelaren, välj %1$s i följande Android-inställningsmeny och aktivera %2$s. + För att använda popupspelaren väljer du %1$s i Android-inställningarna och aktiverar %2$s. \"Tillåt visning över andra appar\" Ta bort fil Ta bort post Konto avslutat\n\n%1$s anger denna anledning: %2$s Posten borttagen - HTTP-fel 403 mottogs från servern under uppspelning, troligen orsakat av att strömnings-URL:en har löpt ut eller att en IP-adress har blockerats - HTTP-fel %1$s mottogs från servern under uppspelning - HTTP-fel 403 mottogs från servern under uppspelning, troligen orsakat av en IP-blockering eller problem med deobfuskering av strömnings-URL:er - %1$s vägrade att lämna ut data och bad om en inloggning för att bekräfta att den som begärde detta inte är en bot.\n\nDin IP-adress kan ha blivit tillfälligt avstängd av %1$s. Du kan vänta en stund eller byta till en annan IP-adress (till exempel genom att slå på/av ett VPN eller genom att byta från Wi-Fi till mobildata).\n\nSe denna FAQ-post för mer information. - Detta innehåll är inte tillgängligt för det valda innehållslandet.\n\nÄndra ditt val från \"Inställningar > Innehåll > Standardinnehållsland\". + Servern svarade med HTTP-fel 403 under uppspelningen. Strömnings-URL:en kan ha löpt ut eller IP-adressen kan ha blockerats. + Servern svarade med HTTP-fel %1$s under uppspelningen + Servern svarade med HTTP-fel 403 under uppspelningen, troligen på grund av en IP-blockering eller problem med avobfuskering av strömnings-URL:er + %1$s vägrade att lämna ut uppgifter och krävde inloggning för att bekräfta att begäran inte kommer från en robot.\n\nDin IP-adress kan ha blockerats tillfälligt av %1$s. Vänta en stund eller byt IP-adress, till exempel genom att slå av och på en VPN-anslutning eller växla mellan Wi-Fi och mobildata.\n\nLäs avsnittet i vanliga frågor för mer information. + Innehållet är inte tillgängligt i det valda innehållslandet. \nÄndra valet under ”Inställningar > Innehåll > Standardinnehållsland”. I augusti 2025 meddelade Google att från och med september 2026 kommer installation av appar att kräva utvecklarverifiering för alla Android-appar på certifierade enheter, inklusive de som installerats utanför Play Store. Eftersom utvecklarna av NewPipe inte godkänner detta krav kommer NewPipe inte längre att fungera på certifierade Android-enheter efter den tiden. Detaljer Lösning @@ -843,14 +820,14 @@ Importera prenumerationer Exportera prenumerationer - Importera prenumerationer från en tidigare .json-export - Exportera dina prenumerationer till en .json-fil + Importera prenumerationer från en tidigare JSON-export + Exportera prenumerationerna till en JSON-fil Importera från tidigare export Läser in %d prenumeration… Läser in %d prenumerationer… - NewPipe slutar stödja Android 5 + NewPipe upphör med stödet för Android 5 Tyvärr är NewPipe beroende av ett fåtal bibliotek som slutat stödja Android 5.0 och 5.1. Nästa NewPipe-utgåva kommer därför tyvärr bara att fungera på enheter med Android 6 eller senare. Läs mer i blogginlägget. Blogginlägg diff --git a/app/src/main/res/values-tok/strings.xml b/app/src/main/res/values-tok/strings.xml index 9004a656d..8b6fef40b 100644 --- a/app/src/main/res/values-tok/strings.xml +++ b/app/src/main/res/values-tok/strings.xml @@ -48,4 +48,5 @@ nasin lipu kalama mute nasin lipu pi sitelen tawa mute walo - \ No newline at end of file + open + From 7c42c8612ab747632ab03245a752c3af2a6a7013 Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Wed, 22 Jul 2026 07:55:35 +0530 Subject: [PATCH 004/155] Replace KeyboardUtil with library helper class --- .../fragments/list/search/SearchFragment.java | 7 +- .../newpipe/settings/SettingsActivity.java | 7 +- .../org/schabi/newpipe/util/KeyboardUtil.java | 65 ------------------- 3 files changed, 7 insertions(+), 72 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/util/KeyboardUtil.java diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 5c0d7d321..e37226c00 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -36,6 +36,7 @@ import androidx.appcompat.app.AlertDialog; import androidx.appcompat.widget.TooltipCompat; import androidx.collection.SparseArrayCompat; import androidx.core.text.HtmlCompat; +import androidx.core.view.SoftwareKeyboardControllerCompat; import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -68,7 +69,6 @@ import org.schabi.newpipe.settings.NewPipeSettings; import org.schabi.newpipe.util.Constants; import org.schabi.newpipe.util.DeviceUtils; import org.schabi.newpipe.util.ExtractorHelper; -import org.schabi.newpipe.util.KeyboardUtil; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; @@ -683,15 +683,14 @@ public class SearchFragment extends BaseListFragment - * See also https://stackoverflow.com/q/1109022 - *

- */ -public final class KeyboardUtil { - - /** - * Flag for {@link #hideKeyboard(Activity, EditText)} to force the keyboard to hide. - * This is required for non-touch devices like Fire TV where the system - * flags the focus as an explicit user action. - */ - private static final int CLEAR_SOFT_INPUT_FORCED = 0; - - private KeyboardUtil() { - } - - public static void showKeyboard(final Activity activity, final EditText editText) { - if (activity == null || editText == null) { - return; - } - - if (editText.requestFocus()) { - final InputMethodManager imm = ContextCompat.getSystemService(activity, - InputMethodManager.class); - - if (!imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED)) { - /* - * Sometimes the keyboard can't be shown because Android's ImeFocusController is in - * a incorrect state e.g. when animations are disabled or the unfocus event of the - * previous view arrives in the wrong moment (see #7647 for details). - * The invalid state can be fixed by to re-focusing the editText. - */ - editText.clearFocus(); - editText.requestFocus(); - - // Try again - imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED); - } - } - } - - public static void hideKeyboard(final Activity activity, final EditText editText) { - if (activity == null || editText == null) { - return; - } - - final InputMethodManager imm = ContextCompat.getSystemService(activity, - InputMethodManager.class); - if (imm != null) { - imm.hideSoftInputFromWindow(editText.getWindowToken(), CLEAR_SOFT_INPUT_FORCED); - } - - editText.clearFocus(); - } -} From a9f91e692870acfafcbbf1ef4bd43e210746cebb Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Wed, 22 Jul 2026 20:45:55 +0530 Subject: [PATCH 005/155] Fixed cursor issue --- .../org/schabi/newpipe/fragments/list/search/SearchFragment.java | 1 + .../main/java/org/schabi/newpipe/settings/SettingsActivity.java | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index e37226c00..a84f95855 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -691,6 +691,7 @@ public class SearchFragment extends BaseListFragment Date: Wed, 15 Jul 2026 17:39:55 +0200 Subject: [PATCH 006/155] Mention word mark in README --- README.md | 2 ++ doc/README.de.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 65a219481..02a75ab83 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ > THIS APP IS IN BETA, SO YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE IN OUR GITHUB REPOSITORY BY FILLING OUT THE ISSUE TEMPLATE. > > PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS. +> +> "NewPipe" IS A REGISTERED WORD MARK SUBJECT TO [ITS TRADEMARK POLICY](https://newpipe-ev.de/policy/trademark/). INFINGING APPLICATIONS ARE NOT TOLERATED. ## Screenshots diff --git a/doc/README.de.md b/doc/README.de.md index 2c5a8849e..9ebd52957 100644 --- a/doc/README.de.md +++ b/doc/README.de.md @@ -28,6 +28,8 @@ > DIESE APP BEFINDET SICH IN EINER BETA-PHASE, DAHER KÖNNTEST DU BUGS BEGEGNEN. FALLS DIES PASSIERT, ERSTELLE EIN ISSUE (AUF ENGLISCH) IN UNSEREM GITHUB REPOSITORY, INDEM DU DIE VORLAGE DORT AUSFÜLLST. > > NEWPIPE, ODER JEGLICHEN FORK DAVON, IM GOOGLE PLAYSTORE ANZUBIETEN, VERLETZT DESSEN GESCHÄFTSBEDINGUNGEN. +> +> "NewPipe" IST EINE EINGETRAGENE WORTMARKE UND UNTERLIEGT [EINER MARKENRICHTLINIE](https://newpipe-ev.de/policy/trademark/). DAGEGEN VERSTOẞENDE APPS WERDEN NICHT TOLERIERT. ## Screenshots From c0524d7c3133f32eeab8441334ce66c1ebe26515 Mon Sep 17 00:00:00 2001 From: fynngodau Date: Wed, 15 Jul 2026 17:59:51 +0200 Subject: [PATCH 007/155] Improve word mark phrasing in README Co-authored-by: Clippy <22662897+absurdlylongusername@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 02a75ab83..b95bdd97a 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ > > PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS. > -> "NewPipe" IS A REGISTERED WORD MARK SUBJECT TO [ITS TRADEMARK POLICY](https://newpipe-ev.de/policy/trademark/). INFINGING APPLICATIONS ARE NOT TOLERATED. +> "NewPipe" IS A REGISTERED WORD MARK SUBJECT TO [ITS TRADEMARK POLICY](https://newpipe-ev.de/policy/trademark/). INFINGING APPLICATIONS WILL NOT BE TOLERATED. ## Screenshots From 10144cbf9ce52409ec39329558ec1e7f4109fe6a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 30 Jul 2026 05:48:45 -0700 Subject: [PATCH 008/155] Improve look of search menu "titles" (#13605) (#13738) (cherry picked from commit 3a3eac0cf242a855165a3c064e890aeed7e61792) Co-authored-by: Thompson3142 <115718208+Thompson3142@users.noreply.github.com> --- .../fragments/list/search/SearchFragment.java | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index a84f95855..bb703d4f3 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -10,12 +10,19 @@ import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.graphics.Color; +import android.graphics.Typeface; import android.os.Bundle; import android.text.Editable; import android.text.Html; +import android.text.Layout; +import android.text.SpannableString; import android.text.TextUtils; import android.text.TextWatcher; +import android.text.style.AlignmentSpan; import android.text.style.CharacterStyle; +import android.text.style.ForegroundColorSpan; +import android.text.style.StyleSpan; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -453,22 +460,28 @@ public class SearchFragment extends BaseListFragment Date: Sun, 1 Feb 2026 17:05:44 +0900 Subject: [PATCH 009/155] Fix audio ducking issue by using Android's automatic audio focus management Previously, manual audio focus handling caused volume to not be restored after transient ducking on some devices. This change removes manual AudioFocusRequest management and relies on ExoPlayer's built-in audio focus handling (handleAudioFocus=true), which properly manages automatic ducking as recommended in: https://developer.android.com/media/optimize/audio-focus#automatic-ducking Fixes #9710 --- .../org/schabi/newpipe/player/Player.java | 23 ++--- .../newpipe/player/helper/AudioReactor.java | 95 +------------------ 2 files changed, 10 insertions(+), 108 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index e458b707e..0605b262a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -634,6 +634,15 @@ public final class Player implements PlaybackListener, Listener { simpleExoPlayer.setWakeMode(C.WAKE_MODE_NETWORK); simpleExoPlayer.setHandleAudioBecomingNoisy(true); + // Enable automatic audio focus management - let Android handle ducking automatically + simpleExoPlayer.setAudioAttributes( + new com.google.android.exoplayer2.audio.AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .setContentType(C.AUDIO_CONTENT_TYPE_MUSIC) + .build(), + true // handleAudioFocus = true for automatic management + ); + audioReactor = new AudioReactor(context, simpleExoPlayer); registerBroadcastReceiver(); @@ -1173,10 +1182,6 @@ public final class Player implements PlaybackListener, Listener { } UIs.call(PlayerUi::onPrepared); - - if (playWhenReady && !isMuted()) { - audioReactor.requestAudioFocus(); - } } private void onBlocked() { @@ -1324,11 +1329,6 @@ public final class Player implements PlaybackListener, Listener { public void toggleMute() { final boolean wasMuted = isMuted(); simpleExoPlayer.setVolume(wasMuted ? 1 : 0); - if (wasMuted) { - audioReactor.requestAudioFocus(); - } else { - audioReactor.abandonAudioFocus(); - } UIs.call(playerUi -> playerUi.onMuteUnmuteChanged(!wasMuted)); notifyPlaybackUpdateToListeners(); } @@ -1740,10 +1740,6 @@ public final class Player implements PlaybackListener, Listener { return; } - if (!isMuted()) { - audioReactor.requestAudioFocus(); - } - if (currentState == STATE_COMPLETED) { if (playQueue.getIndex() == 0) { seekToDefault(); @@ -1771,7 +1767,6 @@ public final class Player implements PlaybackListener, Listener { return; } - audioReactor.abandonAudioFocus(); simpleExoPlayer.pause(); saveStreamProgressState(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java index 084336d54..2ec33dc0f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java @@ -1,54 +1,36 @@ package org.schabi.newpipe.player.helper; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ValueAnimator; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.audiofx.AudioEffect; -import android.util.Log; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; -import androidx.media.AudioFocusRequestCompat; import androidx.media.AudioManagerCompat; import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.analytics.AnalyticsListener; -public class AudioReactor implements AudioManager.OnAudioFocusChangeListener, AnalyticsListener { +public class AudioReactor implements AnalyticsListener { private static final String TAG = "AudioFocusReactor"; - private static final int DUCK_DURATION = 1500; - private static final float DUCK_AUDIO_TO = .2f; - - private static final int FOCUS_GAIN_TYPE = AudioManagerCompat.AUDIOFOCUS_GAIN; private static final int STREAM_TYPE = AudioManager.STREAM_MUSIC; private final ExoPlayer player; private final Context context; private final AudioManager audioManager; - private final AudioFocusRequestCompat request; - public AudioReactor(@NonNull final Context context, @NonNull final ExoPlayer player) { this.player = player; this.context = context; this.audioManager = ContextCompat.getSystemService(context, AudioManager.class); player.addAnalyticsListener(this); - - request = new AudioFocusRequestCompat.Builder(FOCUS_GAIN_TYPE) - //.setAcceptsDelayedFocusGain(true) - .setWillPauseWhenDucked(true) - .setOnAudioFocusChangeListener(this) - .build(); } public void dispose() { - abandonAudioFocus(); player.removeAnalyticsListener(this); notifyAudioSessionUpdate(false, player.getAudioSessionId()); } @@ -57,14 +39,6 @@ public class AudioReactor implements AudioManager.OnAudioFocusChangeListener, An // Audio Manager //////////////////////////////////////////////////////////////////////////*/ - public void requestAudioFocus() { - AudioManagerCompat.requestAudioFocus(audioManager, request); - } - - public void abandonAudioFocus() { - AudioManagerCompat.abandonAudioFocusRequest(audioManager, request); - } - public int getVolume() { return audioManager.getStreamVolume(STREAM_TYPE); } @@ -77,73 +51,6 @@ public class AudioReactor implements AudioManager.OnAudioFocusChangeListener, An return AudioManagerCompat.getStreamMaxVolume(audioManager, STREAM_TYPE); } - /*////////////////////////////////////////////////////////////////////////// - // AudioFocus - //////////////////////////////////////////////////////////////////////////*/ - - @Override - public void onAudioFocusChange(final int focusChange) { - Log.d(TAG, "onAudioFocusChange() called with: focusChange = [" + focusChange + "]"); - switch (focusChange) { - case AudioManager.AUDIOFOCUS_GAIN: - onAudioFocusGain(); - break; - case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: - onAudioFocusLossCanDuck(); - break; - case AudioManager.AUDIOFOCUS_LOSS: - case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: - onAudioFocusLoss(); - break; - } - } - - private void onAudioFocusGain() { - Log.d(TAG, "onAudioFocusGain() called"); - player.setVolume(DUCK_AUDIO_TO); - animateAudio(DUCK_AUDIO_TO, 1.0f); - - if (PlayerHelper.isResumeAfterAudioFocusGain(context)) { - player.play(); - } - } - - private void onAudioFocusLoss() { - Log.d(TAG, "onAudioFocusLoss() called"); - player.pause(); - } - - private void onAudioFocusLossCanDuck() { - Log.d(TAG, "onAudioFocusLossCanDuck() called"); - // Set the volume to 1/10 on ducking - player.setVolume(DUCK_AUDIO_TO); - } - - private void animateAudio(final float from, final float to) { - final ValueAnimator valueAnimator = new ValueAnimator(); - valueAnimator.setFloatValues(from, to); - valueAnimator.setDuration(AudioReactor.DUCK_DURATION); - valueAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(final Animator animation) { - player.setVolume(from); - } - - @Override - public void onAnimationCancel(final Animator animation) { - player.setVolume(to); - } - - @Override - public void onAnimationEnd(final Animator animation) { - player.setVolume(to); - } - }); - valueAnimator.addUpdateListener(animation -> - player.setVolume(((float) animation.getAnimatedValue()))); - valueAnimator.start(); - } - /*////////////////////////////////////////////////////////////////////////// // Audio Processing //////////////////////////////////////////////////////////////////////////*/ From f9bfd268a5dd72f49af565a09509756e009afb01 Mon Sep 17 00:00:00 2001 From: Yubi Lee Date: Sat, 28 Mar 2026 09:14:30 +0900 Subject: [PATCH 010/155] Fix broken mute It should play video with mute on even though another app is playing audio. --- .../org/schabi/newpipe/player/Player.java | 27 +++++++++++++++++++ .../newpipe/player/helper/AudioReactor.java | 25 +++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 0605b262a..7ce5244fa 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -1328,7 +1328,34 @@ public final class Player implements PlaybackListener, Listener { public void toggleMute() { final boolean wasMuted = isMuted(); + final boolean wasPlaying = simpleExoPlayer.isPlaying(); + Log.d(TAG, "toggleMute: wasMuted=" + wasMuted + ", wasPlaying=" + wasPlaying); simpleExoPlayer.setVolume(wasMuted ? 1 : 0); + if (wasMuted) { + Log.d(TAG, "toggleMute: enabling audio focus, willPlay=" + wasPlaying); + simpleExoPlayer.setAudioAttributes( + new com.google.android.exoplayer2.audio.AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .setContentType(C.AUDIO_CONTENT_TYPE_MUSIC) + .build(), + true // handleAudioFocus = true - ExoPlayer handles focus automatically + ); + if (wasPlaying) { + Log.d(TAG, "toggleMute: calling play(), isPlaying=" + simpleExoPlayer.isPlaying()); + simpleExoPlayer.play(); + Log.d(TAG, "toggleMute: after play(), isPlaying=" + simpleExoPlayer.isPlaying()); + } + } else { + Log.d(TAG, "toggleMute: disabling audio focus, abandoning focus"); + simpleExoPlayer.setAudioAttributes( + new com.google.android.exoplayer2.audio.AudioAttributes.Builder() + .setUsage(C.USAGE_MEDIA) + .setContentType(C.AUDIO_CONTENT_TYPE_MUSIC) + .build(), + false // handleAudioFocus = false + ); + audioReactor.abandonAudioFocus(); + } UIs.call(playerUi -> playerUi.onMuteUnmuteChanged(!wasMuted)); notifyPlaybackUpdateToListeners(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java index 2ec33dc0f..a0cfea2c4 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java @@ -4,9 +4,11 @@ import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.audiofx.AudioEffect; +import android.util.Log; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; +import androidx.media.AudioFocusRequestCompat; import androidx.media.AudioManagerCompat; import com.google.android.exoplayer2.ExoPlayer; @@ -16,11 +18,13 @@ public class AudioReactor implements AnalyticsListener { private static final String TAG = "AudioFocusReactor"; + private static final int FOCUS_GAIN_TYPE = AudioManagerCompat.AUDIOFOCUS_GAIN; private static final int STREAM_TYPE = AudioManager.STREAM_MUSIC; private final ExoPlayer player; private final Context context; private final AudioManager audioManager; + private final AudioFocusRequestCompat request; public AudioReactor(@NonNull final Context context, @NonNull final ExoPlayer player) { @@ -28,13 +32,34 @@ public class AudioReactor implements AnalyticsListener { this.context = context; this.audioManager = ContextCompat.getSystemService(context, AudioManager.class); player.addAnalyticsListener(this); + + request = new AudioFocusRequestCompat.Builder(FOCUS_GAIN_TYPE) + .setWillPauseWhenDucked(true) + .setOnAudioFocusChangeListener(focusChange -> { + }) + .build(); } public void dispose() { + abandonAudioFocus(); player.removeAnalyticsListener(this); notifyAudioSessionUpdate(false, player.getAudioSessionId()); } + /*////////////////////////////////////////////////////////////////////////// + // Audio Focus + //////////////////////////////////////////////////////////////////////////*/ + + public void requestAudioFocus() { + Log.d(TAG, "requestAudioFocus() called"); + AudioManagerCompat.requestAudioFocus(audioManager, request); + } + + public void abandonAudioFocus() { + Log.d(TAG, "abandonAudioFocus() called"); + AudioManagerCompat.abandonAudioFocusRequest(audioManager, request); + } + /*////////////////////////////////////////////////////////////////////////// // Audio Manager //////////////////////////////////////////////////////////////////////////*/ From 9ff614f2fc328d64291cd8abfb05e5f96c87cd37 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sat, 1 Aug 2026 16:44:00 +0200 Subject: [PATCH 011/155] Refactor automatic audio focus, drop unneeded manual focus The automatic audio focus can be just disabled when muting by updating ExoPlayer audio attributes. It makes no sense to create a manual audio focus request which is never used but only unregistered. There should be no need to manually play when content is already playing, to log each action for all build types and to duplicate the code updating ExoPlayer audio attributes. --- .../org/schabi/newpipe/player/Player.java | 42 ++++++------------- .../newpipe/player/helper/AudioReactor.java | 27 ------------ 2 files changed, 13 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 7ce5244fa..7e72ff015 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -634,14 +634,13 @@ public final class Player implements PlaybackListener, Listener { simpleExoPlayer.setWakeMode(C.WAKE_MODE_NETWORK); simpleExoPlayer.setHandleAudioBecomingNoisy(true); - // Enable automatic audio focus management - let Android handle ducking automatically + // Enable ExoPlayer automatic audio focus management simpleExoPlayer.setAudioAttributes( new com.google.android.exoplayer2.audio.AudioAttributes.Builder() .setUsage(C.USAGE_MEDIA) .setContentType(C.AUDIO_CONTENT_TYPE_MUSIC) .build(), - true // handleAudioFocus = true for automatic management - ); + true); audioReactor = new AudioReactor(context, simpleExoPlayer); @@ -1328,34 +1327,19 @@ public final class Player implements PlaybackListener, Listener { public void toggleMute() { final boolean wasMuted = isMuted(); - final boolean wasPlaying = simpleExoPlayer.isPlaying(); - Log.d(TAG, "toggleMute: wasMuted=" + wasMuted + ", wasPlaying=" + wasPlaying); simpleExoPlayer.setVolume(wasMuted ? 1 : 0); - if (wasMuted) { - Log.d(TAG, "toggleMute: enabling audio focus, willPlay=" + wasPlaying); - simpleExoPlayer.setAudioAttributes( + + // Update audio focus + // When wasMuted is true, we want to play sound, so ExoPlayer has to handle audio focus in + // this case; when wasMuted is false, we don't want to play sound, so no audio focus should + // be done + simpleExoPlayer.setAudioAttributes( new com.google.android.exoplayer2.audio.AudioAttributes.Builder() - .setUsage(C.USAGE_MEDIA) - .setContentType(C.AUDIO_CONTENT_TYPE_MUSIC) - .build(), - true // handleAudioFocus = true - ExoPlayer handles focus automatically - ); - if (wasPlaying) { - Log.d(TAG, "toggleMute: calling play(), isPlaying=" + simpleExoPlayer.isPlaying()); - simpleExoPlayer.play(); - Log.d(TAG, "toggleMute: after play(), isPlaying=" + simpleExoPlayer.isPlaying()); - } - } else { - Log.d(TAG, "toggleMute: disabling audio focus, abandoning focus"); - simpleExoPlayer.setAudioAttributes( - new com.google.android.exoplayer2.audio.AudioAttributes.Builder() - .setUsage(C.USAGE_MEDIA) - .setContentType(C.AUDIO_CONTENT_TYPE_MUSIC) - .build(), - false // handleAudioFocus = false - ); - audioReactor.abandonAudioFocus(); - } + .setUsage(C.USAGE_MEDIA) + .setContentType(C.AUDIO_CONTENT_TYPE_MUSIC) + .build(), + wasMuted); + UIs.call(playerUi -> playerUi.onMuteUnmuteChanged(!wasMuted)); notifyPlaybackUpdateToListeners(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java index a0cfea2c4..eb6727da6 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java @@ -4,11 +4,9 @@ import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.audiofx.AudioEffect; -import android.util.Log; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; -import androidx.media.AudioFocusRequestCompat; import androidx.media.AudioManagerCompat; import com.google.android.exoplayer2.ExoPlayer; @@ -16,15 +14,11 @@ import com.google.android.exoplayer2.analytics.AnalyticsListener; public class AudioReactor implements AnalyticsListener { - private static final String TAG = "AudioFocusReactor"; - - private static final int FOCUS_GAIN_TYPE = AudioManagerCompat.AUDIOFOCUS_GAIN; private static final int STREAM_TYPE = AudioManager.STREAM_MUSIC; private final ExoPlayer player; private final Context context; private final AudioManager audioManager; - private final AudioFocusRequestCompat request; public AudioReactor(@NonNull final Context context, @NonNull final ExoPlayer player) { @@ -32,34 +26,13 @@ public class AudioReactor implements AnalyticsListener { this.context = context; this.audioManager = ContextCompat.getSystemService(context, AudioManager.class); player.addAnalyticsListener(this); - - request = new AudioFocusRequestCompat.Builder(FOCUS_GAIN_TYPE) - .setWillPauseWhenDucked(true) - .setOnAudioFocusChangeListener(focusChange -> { - }) - .build(); } public void dispose() { - abandonAudioFocus(); player.removeAnalyticsListener(this); notifyAudioSessionUpdate(false, player.getAudioSessionId()); } - /*////////////////////////////////////////////////////////////////////////// - // Audio Focus - //////////////////////////////////////////////////////////////////////////*/ - - public void requestAudioFocus() { - Log.d(TAG, "requestAudioFocus() called"); - AudioManagerCompat.requestAudioFocus(audioManager, request); - } - - public void abandonAudioFocus() { - Log.d(TAG, "abandonAudioFocus() called"); - AudioManagerCompat.abandonAudioFocusRequest(audioManager, request); - } - /*////////////////////////////////////////////////////////////////////////// // Audio Manager //////////////////////////////////////////////////////////////////////////*/ From 07421aaa6268a21255aa5e426747e5c7a2da1518 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 4 Aug 2026 14:38:53 +0200 Subject: [PATCH 012/155] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (German) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Montenegrin) Currently translated at 50.0% (19 of 38 strings) Added translation using Weblate (Montenegrin) Translated using Weblate (Arabic) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Santali) Currently translated at 7.8% (3 of 38 strings) Co-authored-by: Hmomam Lazaref Co-authored-by: Hosted Weblate Co-authored-by: Jeff Huang Co-authored-by: Oleh Hishak Co-authored-by: Prasanta-Hembram Co-authored-by: VfBFan Co-authored-by: bogdan jasovic Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/cnr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sat/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hant/ Translation: NewPipe/compose --- .../composeResources/values-ar/strings.xml | 2 + .../composeResources/values-cnr/strings.xml | 27 +++++++++++++ .../composeResources/values-de/strings.xml | 2 +- .../composeResources/values-sat/strings.xml | 5 ++- .../composeResources/values-uk/strings.xml | 40 ++++++++++++++++++- .../values-zh-rTW/strings.xml | 11 +++++ 6 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 shared/src/commonMain/composeResources/values-cnr/strings.xml diff --git a/shared/src/commonMain/composeResources/values-ar/strings.xml b/shared/src/commonMain/composeResources/values-ar/strings.xml index 850da900a..280183c95 100644 --- a/shared/src/commonMain/composeResources/values-ar/strings.xml +++ b/shared/src/commonMain/composeResources/values-ar/strings.xml @@ -36,4 +36,6 @@ المظهر التحديثات النسخ الاحتياطي والاستعادة + السجل والملفات المؤقتة + تصحيح الأخطاء diff --git a/shared/src/commonMain/composeResources/values-cnr/strings.xml b/shared/src/commonMain/composeResources/values-cnr/strings.xml new file mode 100644 index 000000000..582a0667b --- /dev/null +++ b/shared/src/commonMain/composeResources/values-cnr/strings.xml @@ -0,0 +1,27 @@ + + + Gornja Traka sa akcijama + Ekran o nama + Licence trećih strana + Obljavnjeno od %1$s pod %2$s + O Nama & Ćesto postavljana pitanja + Licence + Libre lako strimanje na Androidu + Doprinesi + Ako imate ideje; translacije, izmjene dizajnsa, ćistenje koda ili prave teske dizajna -- pomoc je uvijek dobrodośla. Śto viśe uradimo bolje će biti + Pogledajte na GitHub-u + Doniraj + Vrati Nazad + Website + Pogledaj NewPipe Website za viśe informacije i novosti. + Politka Privatnosti + Proćitaj politiku privatnosti + NewPipe License + Proćitaj License + Ćesto postavljana pitanja + Ako imate probleme koriśteći aplikaciju, budite sigurnu da pogledate odgovore na iobičajna pitanja + Pogledajte na Website + Otvorite u browser + Gotovo + Nije dostupno + diff --git a/shared/src/commonMain/composeResources/values-de/strings.xml b/shared/src/commonMain/composeResources/values-de/strings.xml index d3007cb0c..8aaa9c57f 100644 --- a/shared/src/commonMain/composeResources/values-de/strings.xml +++ b/shared/src/commonMain/composeResources/values-de/strings.xml @@ -21,7 +21,7 @@ Website Besuche die NewPipe-Website für weitere Informationen und Neuigkeiten. NewPipes Datenschutzerklärung - Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Deshalb sammelt diese App keine Daten ohne deine Zustimmung.\nNewPipes Datenschutzerklärung erklären im Detail, welche Daten beim Absenden eines Absturzberichtes verschickt und gespeichert werden. + Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Daher sammelt die App keinerlei Daten ohne deine Zustimmung.\nNewPipes Datenschutzerklärung erläutert ausführlich, welche Daten beim Senden eines Absturzberichts übermittelt und gespeichert werden. Datenschutzerklärung lesen NewPipes Lizenz NewPipe ist freie Copyleft-Software: Du kannst sie nach Belieben benutzen, untersuchen, mit anderen teilen und verbessern. Insbesondere kannst du sie unter den von der Free Software Foundation veröffentlichten Bedingungen der GNU General Public License, in der Version 3 der Lizenz oder (nach deiner Wahl) jeder späteren Version, weitergeben und/oder verändern. diff --git a/shared/src/commonMain/composeResources/values-sat/strings.xml b/shared/src/commonMain/composeResources/values-sat/strings.xml index 55344e519..16aa94002 100644 --- a/shared/src/commonMain/composeResources/values-sat/strings.xml +++ b/shared/src/commonMain/composeResources/values-sat/strings.xml @@ -1,3 +1,6 @@ - \ No newline at end of file + ᱛᱟᱭᱚᱢ + NewPipe ᱵᱚᱵᱚᱛ + ᱮᱱᱰᱨᱳᱭᱮᱰ ᱨᱮ ᱞᱤᱵᱽᱨᱮ ᱦᱟᱞᱠᱟ ᱚᱡᱚᱱ ᱥᱴᱨᱤᱢᱤᱝ ᱾ + diff --git a/shared/src/commonMain/composeResources/values-uk/strings.xml b/shared/src/commonMain/composeResources/values-uk/strings.xml index 55344e519..d612c4bea 100644 --- a/shared/src/commonMain/composeResources/values-uk/strings.xml +++ b/shared/src/commonMain/composeResources/values-uk/strings.xml @@ -1,3 +1,41 @@ - \ No newline at end of file + Назад + Про NewPipe + Ліцензії третіх сторін + Про нас і ЧаПи + Ліцензії + Libre — легкий стримінг на Android + Зробіть внесок + Незалежно від того, чи у вас є ідеї щодо перекладу, змін дизайну, очищення коду або серйозних доопрацювань — будь-яка допомога завжди вітається. Чим більше зроблено, тим кращим стає проєкт! + Переглянути на GitHub + Пожертвувати + NewPipe розробляють волонтери, які у вільний час створюють для вас найкращий користувацький досвід. Підтримайте розробників, щоб допомогти зробити NewPipe ще кращим, поки вони насолоджуються чашкою кави. + Віддячити + Вебсайт + Відвідайте вебсайт NewPipe, щоб дізнатися більше інформації та новин. + Політика конфіденційності NewPipe + Проєкт NewPipe дуже серйозно ставиться до вашої конфіденційності. Тому застосунок не збирає жодних даних без вашої згоди.\nПолітика конфіденційності NewPipe детально пояснює, які дані надсилаються та зберігаються, коли ви надсилаєте звіт про збій. + Ознайомитися з політикою конфіденційності + Ліцензія NewPipe + NewPipe — це copyleft libre програмне забезпечення: ви можете вільно використовувати, вивчати, поширювати та вдосконалювати його. Зокрема, ви можете розповсюджувати та/або змінювати його на умовах GNU General Public License, опублікованої Free Software Foundation, версії 3 або (на ваш вибір) будь-якої пізнішої версії. + Ознайомитися з ліцензією + Поширені запитання + Якщо у вас виникають труднощі з використанням застосунку, обов’язково перегляньте відповіді на поширені запитання! + Переглянути на сайті + Відкрити в браузері + Готово + Недоступно + Налаштування + Пошук + Вміст + Сповіщення + Відео та аудіо + Завантажити + Зовнішній вигляд + Історія та кеш + Оновлення + Резервна копія та відновлення + Налагодження + %1$s за ліцензією %2$s + diff --git a/shared/src/commonMain/composeResources/values-zh-rTW/strings.xml b/shared/src/commonMain/composeResources/values-zh-rTW/strings.xml index ac53eefde..b857424d0 100644 --- a/shared/src/commonMain/composeResources/values-zh-rTW/strings.xml +++ b/shared/src/commonMain/composeResources/values-zh-rTW/strings.xml @@ -27,4 +27,15 @@ 以瀏覽器開啟 完成 不可用 + 設定 + 搜尋 + 內容 + 通知 + 影片與音訊 + 下載 + 外觀 + 歷史紀錄與快取 + 更新 + 備份與還原 + 除錯 From 89d2423692918653134e79a841d96e065175e976 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 4 Aug 2026 14:38:36 +0200 Subject: [PATCH 013/155] Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (Montenegrin) Currently translated at 2.3% (18 of 776 strings) Added translation using Weblate (Montenegrin) Translated using Weblate (Arabic) Currently translated at 99.8% (775 of 776 strings) Translated using Weblate (Ukrainian) Currently translated at 99.8% (775 of 776 strings) Translated using Weblate (Santali) Currently translated at 14.5% (113 of 776 strings) Co-authored-by: Hmomam Lazaref Co-authored-by: Hosted Weblate Co-authored-by: Jeff Huang Co-authored-by: Oleh Hishak Co-authored-by: Prasanta-Hembram Co-authored-by: bogdan jasovic --- app/src/main/res/values-ar/strings.xml | 4 +- app/src/main/res/values-cnr/strings.xml | 24 +++++++++ app/src/main/res/values-sat/strings.xml | 4 +- app/src/main/res/values-uk/strings.xml | 62 +++++++++++++++------- app/src/main/res/values-zh-rTW/strings.xml | 30 +++++------ 5 files changed, 87 insertions(+), 37 deletions(-) create mode 100644 app/src/main/res/values-cnr/strings.xml diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 2e34a1de9..ed22ebe0b 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -53,7 +53,7 @@ في الخلفية أسود سجل المشاهدة - سجل المشاهدة و ذاكرة التخزين المؤقت + السجل والملفات المؤقتة المحتوى التحميلات الملفات المحملة @@ -212,7 +212,7 @@ تصدير السجل، وقوائم تشغيل، والإعدادات، والاشتراكات عرض المعلومات إضافة إلى - تحليل + تصحيح الأخطاء لم يتم العثور على أي بث مرئي لم يتم العثور على أي بث صوتي اسحب لإعادة ترتيب diff --git a/app/src/main/res/values-cnr/strings.xml b/app/src/main/res/values-cnr/strings.xml new file mode 100644 index 000000000..625723f2a --- /dev/null +++ b/app/src/main/res/values-cnr/strings.xml @@ -0,0 +1,24 @@ + + + Ekran o nama + Licence trećih strana + O Nama & Ćesto postavljana pitanja + Licence + Libre lako strimanje na Androidu + Doprinesi + Ako imate ideje; translacije, izmjene dizajnsa, ćistenje koda ili prave teske dizajna -- pomoc je uvijek dobrodośla. Śto viśe uradimo bolje će biti + Pogledajte na GitHub-u + Doniraj + Vrati Nazad + Website + Pogledaj NewPipe Website za viśe informacije i novosti. + Politka Privatnosti + Proćitaj politiku privatnosti + NewPipe License + Proćitaj License + Ćesto postavljana pitanja + Ako imate probleme koriśteći aplikaciju, budite sigurnu da pogledate odgovore na iobičajna pitanja + Pogledajte na Website + Otvorite u browser + Gotovo + diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 47ac2c53d..4f376cdfb 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -478,7 +478,7 @@ ᱚᱵᱷᱤᱱᱮᱛᱟᱨ ᱵᱟᱹᱱᱩᱜᱼᱟ ᱚᱠᱚᱭ ᱦᱚᱸ ᱵᱟᱝ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ ᱜᱚᱴᱟ ᱟᱠᱟᱱᱟ - ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱵᱟᱵᱚᱛ + NewPipe ᱵᱚᱵᱚᱛ ᱯᱮᱨᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ ᱰᱳᱱᱮᱴ ᱢᱮ ᱡᱟᱦᱟᱸᱭ ᱜᱮᱭ ᱟᱸᱡᱚᱢᱟ @@ -697,7 +697,7 @@ ᱭᱩᱴᱭᱩᱵᱽ ᱨᱮᱱᱟᱜ \"Restricted Mode\" ᱚᱞ ᱢᱮ ᱡᱚᱛᱚ ᱱᱮᱴᱣᱟᱨᱠ ᱵᱷᱩᱞ - ᱟᱱᱰᱨᱚᱭᱮᱰ ᱨᱮ ᱞᱤᱵᱨᱮ ᱞᱟᱭᱤᱴᱣᱮᱴ ᱥᱴᱨᱤᱢᱤᱝ + ᱮᱱᱰᱨᱳᱭᱮᱰ ᱨᱮ ᱞᱤᱵᱽᱨᱮ ᱦᱟᱞᱠᱟ ᱚᱡᱚᱱ ᱥᱴᱨᱤᱢᱤᱝ ᱾ ᱴᱮᱜᱥ ᱥᱚᱨᱠᱟᱨᱤ ᱚᱱᱚᱞ ᱨᱮ ᱡᱟᱭᱜᱟ ᱵᱟᱹᱱᱩᱜᱼᱟ diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index c3595ebec..a64a6722f 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -4,7 +4,7 @@ Програвач потокового відео не знайдений. Встановити VLC\? Встановити Скасувати - Відкрити в оглядачі + Відкрити в браузері Поширити Завантажити Пошук @@ -33,7 +33,7 @@ Показувати «Наступне» і «Схожі» відео URL не підтримується Переважна мова вмісту - Відео та звук + Відео та аудіо Зовнішній вигляд Відтворення у фоновому режимі Вміст @@ -139,7 +139,7 @@ Немає відео Цей дозвіл потрібен для перегляду \nу віконному режимі - Завантаження + Завантажити Допустимі символи в назвах файлів Недопустимі символи замінюватимуться цим значенням Замінні символи @@ -147,9 +147,9 @@ Більшість спеціальних символів Про NewPipe Ліцензії - Посприяти + Зробіть внесок Переглянути на GitHub - Фінансова допомога + Пожертвувати Вебсайт Історія Експортовано @@ -190,9 +190,9 @@ Відхилити Перейменувати Ліцензії третіх сторін - Про застосунок і ЧаП - Вільне та легке потокове програвання на Android. - Які б не були ваші ідеї: переклад, дизайн, легкий чи глобальний рефакторинг — будь-яка допомога завжди у пригоді. Що більше зроблено, то ліпшим стає NewPipe! + Про нас і ЧаПи + Libre — легкий стримінг на Android + Незалежно від того, чи у вас є ідеї щодо перекладу, змін дизайну, очищення коду або серйозних доопрацювань — будь-яка допомога завжди вітається. Чим більше зроблено, тим кращим стає проєкт! Налагодження Нічого немає… чути лише цвіркунів Немає переглядів @@ -203,12 +203,12 @@ Перевірка reCAPTCHA Запит перевірки reCAPTCHA - © %1$s, %2$s під %3$s - NewPipe розроблений добровольцями, які витрачають власний час заради вашого задоволення. Допоможіть розробникам зробити NewPipe ще ліпшим, насолоджуючись філіжанкою кави. - Ваша допомога - Завітайте на офіційний сайт NewPipe, щоб отримати більше інформації та новин. + © %1$s від %2$s за ліцензією %3$s + NewPipe розробляють волонтери, які у вільний час створюють для вас найкращий користувацький досвід. Підтримайте розробників, щоб допомогти зробити NewPipe ще кращим, поки вони насолоджуються чашкою кави. + Віддячити + Відвідайте вебсайт NewPipe, щоб дізнатися більше інформації та новин. Ліцензія NewPipe - Прочитати ліцензію + Ознайомитися з ліцензією Історія Видалити цей елемент з історії пошуку\? Відтворювалося останнім @@ -310,12 +310,12 @@ Видалити всю історію пошуку\? Історію пошуку видалено Видалено 1 елемент. - NewPipe є вільним (копілефт) застосунком: ви можете використовувати, поширювати та вдосконалювати його на власний розсуд. Зокрема ви можете розповсюджувати та/або змінювати його за умов дотримання вимог GNU General Public License 3-ї версії або (на ваш вибір) будь-якої пізнішої версії, опублікованої Free Software Foundation. + NewPipe — це copyleft libre програмне забезпечення: ви можете вільно використовувати, вивчати, поширювати та вдосконалювати його. Зокрема, ви можете розповсюджувати та/або змінювати його на умовах GNU General Public License, опублікованої Free Software Foundation, версії 3 або (на ваш вибір) будь-якої пізнішої версії. Імпортувати разом з налаштуваннями\? - Політика приватності NewPipe + Політика конфіденційності NewPipe Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає ніяких даних без вашої згоди. \nПолітика приватності докладно NewPipe пояснює, які дані надсилаються і зберігаються у звіті про збій. - Читати політику приватності + Ознайомитися з політикою конфіденційності З метою дотримання Загального регламенту про захист даних ЄС (General Data Protection Regulation, GDPR) ми звертаємо вашу увагу на політику приватності NewPipe. Будь ласка, прочитайте уважно. \nВи маєте прийняти її, аби надіслати нам звіт про помилку. Прийняти @@ -715,7 +715,7 @@ Розмір інтервалу завантаження відтворення Переглянути на сайті Поширені запитання - Якщо у вас виникли проблеми з використанням застосунку, обов\'язково ознайомтеся з відповідями на поширені запитання! + Якщо у вас виникають труднощі з використанням застосунку, обов’язково перегляньте відповіді на поширені запитання! Сортувати Ви використовуєте найновішу версію NewPipe Торкніться, щоб завантажити %s @@ -825,7 +825,7 @@ Показати менше Недостатньо вільного простору на пристрої Скинути налаштування - Резервне копіювання і відновлення + Резервна копія та відновлення NewPipe може час від часу автоматично перевіряти наявність нових версій і сповіщати вас про їх появу. \nХочете увімкнути цю функцію? Так @@ -869,4 +869,30 @@ У серпні 2025 року, Google анонсувала, що з вересня 2026 року, для встановлення застосунків буде потрібна верифікація розробника для всіх Android застосунків на сертифікованих пристроях, включаючи ті, що були встановлені не через Play Store. Оскільки розробники NewPipe не згодні з цією вимогою, NewPipe перестане працювати на сертифікованих Android пристроях після цієї дати. Детальніше Вирішення + + Експорт %d підписки… + Експорт %d підписок… + Експорт %d підписок… + Експорт %d підписок… + + + Завантаження %d підписки… + Завантаження %d підписок… + Завантаження %d підписок… + Завантаження %d підписок… + + + Імпорт %d підписки… + Імпорт %d підписок… + Імпорт %d підписок… + Імпорт %d підписок… + + Імпорт підписок + Експорт підписок + Імпорт підписок із попереднього експорту .json + Експорт підписок у файл .json + Імпорт із попереднього експорту + NewPipe припиняє підтримку Android 5 + На жаль, NewPipe залежить від кількох бібліотек, які припинили підтримку Android 5.0 і 5.1. Тому наступна версія NewPipe працюватиме лише на пристроях з Android 6 або новішою версією. Докладніше читайте в дописі в блозі. + Допис у блозі diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index a6c6c4bb2..cf732dd24 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -108,15 +108,15 @@ 無法更新訂閱 訂閱清單 新鮮事 - 搜尋記錄 - 在本機儲存搜尋記錄 - 觀看記錄 + 搜尋歷史紀錄 + 在本機儲存搜尋紀錄 + 觀看歷史紀錄 記錄已觀看的影片 恢復播放 在干擾結束後繼續播放 (例如有來電) 播放器 行為 - 歷史記錄與快取 + 歷史紀錄與快取 復原 NewPipe 通知 NewPipe 播放器的通知 @@ -148,9 +148,9 @@ 不管您有什麼點子 ── 翻譯、設計、清理或撰寫大量程式碼 ── 我們永遠歡迎您來幫忙。做得越多,NewPipe 就會更好! 閱讀授權條款 貢獻 - 歷史記錄 - 歷史記錄 - 確定要刪除此項搜尋記錄嗎? + 歷史紀錄 + 歷史紀錄 + 確定要刪除此項搜尋紀錄嗎? 找不到串流播放器 (您可以安裝 VLC 來播放)。 顯示「長按以新增」提示 預設內容國家 @@ -172,8 +172,8 @@ 網站 匯入資料庫 匯出資料庫 - 覆寫您目前的歷史記錄、訂閱與設定 (選用) - 匯出歷史記錄、訂閱內容、播放清單、設定 + 覆寫您目前的歷史紀錄、訂閱與設定(選擇性) + 匯出歷史紀錄、訂閱內容、播放清單、設定 回饋 如欲了解更多有關 NewPipe 的資訊和新聞,請造訪我們的網站。 首頁內容 @@ -281,12 +281,12 @@ 調整播放器字幕文字大小與背景樣式。必須重新啟動應用程式才會生效 清除觀看歷史 刪除播放過的串流與播放位置歷史 - 刪除所有觀看歷史記錄? + 刪除所有觀看歷史紀錄? 觀看歷史已刪除 清除搜尋歷史 - 刪除搜尋關鍵字的記錄 - 刪除所有搜尋歷史記錄? - 搜尋記錄已刪除 + 刪除搜尋關鍵字的紀錄 + 刪除所有搜尋歷史紀錄? + 搜尋紀錄已刪除 已刪除一個項目。 NewPipe 是一個 Copyleft 的自由軟體:您可以隨意使用、研究、分享並改進它。在遵守由自由軟體基金會所發佈的 GNU 通用公共授權條款的狀況下,您可以自由地再散佈及/或修改它;授權條款預設使用第三版,但您也可以選擇更新的版本。 您是否要同時匯入設定? @@ -381,7 +381,7 @@ NewPipe 在處理檔案時被關閉 裝置上沒有剩餘的空間 進度遺失,因為檔案已被刪除 - 您想要清除您的下載歷史記錄,還是刪除所有已下載的檔案? + 您想要清除您的下載歷史紀錄,還是刪除所有已下載的檔案? 限制下載佇列 一次執行一個下載 開始下載 @@ -423,7 +423,7 @@ 正在恢復 無法恢復此下載 選擇一個實例 - 清除下載歷史記錄 + 清除下載歷史紀錄 刪除已下載的檔案 給予顯示在其他應用程式上層的權限 應用程式語言 From 4fb9c9c88b8e40ff0946fe7fb271efc3dcdb9a1b Mon Sep 17 00:00:00 2001 From: Tyler Sweat Date: Tue, 11 Aug 2026 20:20:59 -0700 Subject: [PATCH 014/155] fix: blacklist JMGO N1S 4K and TCL 65Q651G for media tunneling (#13756) --- .../org/schabi/newpipe/util/DeviceUtils.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java index 83152a36d..e54426a08 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java @@ -44,7 +44,7 @@ public final class DeviceUtils { * support media tunneling to match the upcoming version code.

* @see #shouldSupportMediaTunneling() */ - public static final int MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION = 994; + public static final int MEDIA_TUNNELING_DEVICE_BLACKLIST_VERSION = 1015; // region: devices not supporting media tunneling / media tunneling blacklist /** @@ -120,6 +120,16 @@ public final class DeviceUtils { * #10122

*/ private static final boolean HMB9213NW = Build.DEVICE.equals("HMB9213NW"); + /** + *

JMGO N1S 4K.

+ *

Blacklist reason: fullscreen crash

+ */ + private static final boolean LONAVLA = Build.DEVICE.equals("lonavla"); + /** + *

TCL 65Q651G.

+ *

Blacklist reason: fullscreen crash

+ */ + private static final boolean G10 = Build.DEVICE.equals("G10"); // endregion private DeviceUtils() { @@ -334,7 +344,9 @@ public final class DeviceUtils { && !BRAVIA_ATV3_4K && !PH7M_EU_5596 && !TX_50JXW834 - && !HMB9213NW; + && !HMB9213NW + && !LONAVLA + && !G10; } /** From 219324d9d757b225f27987dd16d64681e557476e Mon Sep 17 00:00:00 2001 From: Isira Seneviratne Date: Thu, 13 Aug 2026 06:22:03 +0530 Subject: [PATCH 015/155] Handle Description conversion to record class --- .../detail/BaseDescriptionFragment.java | 16 +++++----------- .../fragments/detail/DescriptionFragment.java | 7 +++---- .../list/channel/ChannelAboutFragment.java | 4 ++-- .../list/playlist/PlaylistFragment.java | 7 +++---- .../org/schabi/newpipe/util/ExtractorHelper.java | 2 +- .../schabi/newpipe/util/text/TextLinkifier.java | 15 ++++++++------- gradle/libs.versions.toml | 2 +- 7 files changed, 23 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java index bd174a121..462fbdc4a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/BaseDescriptionFragment.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.fragments.detail; -import static android.text.TextUtils.isEmpty; import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import static org.schabi.newpipe.util.text.TextLinkifier.SET_LINK_MOVEMENT_METHOD; @@ -66,7 +65,7 @@ public abstract class BaseDescriptionFragment extends BaseFragment { * Get the description to display. * @return description object, if available */ - @Nullable + @NonNull protected abstract Description getDescription(); /** @@ -105,8 +104,7 @@ public abstract class BaseDescriptionFragment extends BaseFragment { private void setupDescription() { final Description description = getDescription(); - if (description == null || isEmpty(description.getContent()) - || description == Description.EMPTY_DESCRIPTION) { + if (Description.EMPTY_DESCRIPTION.equals(description)) { binding.detailDescriptionView.setVisibility(View.GONE); binding.detailSelectDescriptionButton.setVisibility(View.GONE); return; @@ -137,13 +135,9 @@ public abstract class BaseDescriptionFragment extends BaseFragment { private void disableDescriptionSelection() { // show description content again, otherwise some links are not clickable - final Description description = getDescription(); - if (description != null) { - TextLinkifier.fromDescription(binding.detailDescriptionView, - description, HtmlCompat.FROM_HTML_MODE_LEGACY, - getService(), getStreamUrl(), - descriptionDisposables, SET_LINK_MOVEMENT_METHOD); - } + TextLinkifier.fromDescription(binding.detailDescriptionView, getDescription(), + HtmlCompat.FROM_HTML_MODE_LEGACY, getService(), getStreamUrl(), + descriptionDisposables, SET_LINK_MOVEMENT_METHOD); binding.detailDescriptionNoteView.setVisibility(View.GONE); binding.detailDescriptionView.setTextIsSelectable(false); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java index 2b0d22a32..0c636de24 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/DescriptionFragment.java @@ -8,7 +8,6 @@ import android.view.View; import android.widget.LinearLayout; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.annotation.StringRes; import com.evernote.android.state.State; @@ -34,11 +33,11 @@ public class DescriptionFragment extends BaseDescriptionFragment { // keep empty constructor for State when resuming fragment from memory } - - @Nullable + @NonNull @Override protected Description getDescription() { - return streamInfo.getDescription(); + return streamInfo.getDescription() != null ? streamInfo.getDescription() + : Description.EMPTY_DESCRIPTION; } @NonNull diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java index e3a398139..f0efe409a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelAboutFragment.java @@ -40,10 +40,10 @@ public class ChannelAboutFragment extends BaseDescriptionFragment { binding.constraintLayout.setPadding(0, DeviceUtils.dpToPx(8, requireContext()), 0, 0); } - @Nullable + @NonNull @Override protected Description getDescription() { - return new Description(channelInfo.getDescription(), Description.PLAIN_TEXT); + return Description.of(channelInfo.getDescription(), Description.Type.PLAIN_TEXT); } @NonNull diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 8f0c3ac98..8a3dfda5a 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -1,6 +1,5 @@ package org.schabi.newpipe.fragments.list.playlist; -import static org.schabi.newpipe.extractor.utils.Utils.isBlank; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; import static org.schabi.newpipe.util.ServiceHelper.getServiceById; @@ -328,9 +327,9 @@ public class PlaylistFragment extends BaseListInfoFragment 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 066d5f570..78fb52b1a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ExtractorHelper.java @@ -315,7 +315,7 @@ public final class ExtractorHelper { .append(Localization.DOT_SEPARATOR); } - String content = metaInfo.getContent().getContent().trim(); + String content = metaInfo.getContent().content().trim(); if (content.endsWith(".")) { content = content.substring(0, content.length() - 1); // remove . at end } diff --git a/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java index 4221da398..da195d0f1 100644 --- a/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java +++ b/app/src/main/java/org/schabi/newpipe/util/text/TextLinkifier.java @@ -67,17 +67,18 @@ public final class TextLinkifier { @Nullable final String relatedStreamUrl, @NonNull final CompositeDisposable disposables, @Nullable final Consumer onCompletion) { - switch (description.getType()) { - case Description.HTML: - TextLinkifier.fromHtml(textView, description.getContent(), htmlCompatFlag, + switch (description.type()) { + case Description.Type.HTML: + TextLinkifier.fromHtml(textView, description.content(), htmlCompatFlag, relatedInfoService, relatedStreamUrl, disposables, onCompletion); break; - case Description.MARKDOWN: - TextLinkifier.fromMarkdown(textView, description.getContent(), + case Description.Type.MARKDOWN: + TextLinkifier.fromMarkdown(textView, description.content(), relatedInfoService, relatedStreamUrl, disposables, onCompletion); break; - case Description.PLAIN_TEXT: default: - TextLinkifier.fromPlainText(textView, description.getContent(), + case Description.Type.PLAIN_TEXT: + default: + TextLinkifier.fromPlainText(textView, description.content(), relatedInfoService, relatedStreamUrl, disposables, onCompletion); break; } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 896dc6c98..d2e338ef1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "4de221bf67ec0bf8dbdf573fbc9d4412a8561cb0" +teamnewpipe-newpipe-extractor = "55cd9d7155ae92ec6b06886f86908294b78c25f3" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" From 9e8be091560a69f35d44bd252eb00bc7911c977b Mon Sep 17 00:00:00 2001 From: tobigr Date: Thu, 13 Aug 2026 11:33:53 +0200 Subject: [PATCH 016/155] Update extractor --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d2e338ef1..e681ea6d5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "55cd9d7155ae92ec6b06886f86908294b78c25f3" +teamnewpipe-newpipe-extractor = "1ee1f8e38313d891deb9f4a3ed0d7e30780ed71a" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" From 88468415ccb9f3380dec6d368247dcdd265dbb55 Mon Sep 17 00:00:00 2001 From: gajgaje2000 Date: Thu, 13 Aug 2026 18:05:09 +0530 Subject: [PATCH 017/155] Fix black video delay when entering fullscreen --- .../fragments/detail/VideoDetailFragment.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) 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 ee93e3138..4780f7567 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 @@ -1295,9 +1295,15 @@ public final class VideoDetailFragment player.UIs().get(MainPlayerUi.class).ifPresent(playerUi -> { // sometimes binding would be null here, even though getView() != null above u.u if (binding != null) { - // prevent from re-adding a view multiple times - playerUi.removeViewFromParent(); - binding.playerPlaceholder.addView(playerUi.getBinding().getRoot()); + // Only reparent the view if it's not already in the playerPlaceholder. + // Removing and re-adding a SurfaceView destroys its native surface, + // causing a black screen until the video decoder hits the next + // keyframe (2-5 seconds on typical DASH/HLS streams). + if (playerUi.getBinding().getRoot().getParent() + != binding.playerPlaceholder) { + playerUi.removeViewFromParent(); + binding.playerPlaceholder.addView(playerUi.getBinding().getRoot()); + } playerUi.setupVideoSurfaceIfNeeded(); } }); From a652ee28c7ddc50b698cd76673d439b3c4585850 Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 14 Aug 2026 09:40:35 +0200 Subject: [PATCH 018/155] Update Piped and Invidious instances --- app/src/main/AndroidManifest.xml | 31 ++++++------------------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 67a33742b..2fc5ce26b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -273,34 +273,15 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + From 429ee2f6da5822412354f873b60bc09ee6ccf3c5 Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 14 Aug 2026 19:56:53 +0200 Subject: [PATCH 019/155] Remove Hooktube support --- app/src/main/AndroidManifest.xml | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2fc5ce26b..31ebc123b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -240,28 +240,6 @@ - - - - - - - - - - - - - - - - - - - - - - From a28859c941d7cdbc0d9a242c9b26d00ce42e7593 Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 14 Aug 2026 12:49:43 +0200 Subject: [PATCH 020/155] Update extractor --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b15a61d42..0f518b3ae 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "7adafe2519cd4376ddb9c9bbf96237314e25725b" +teamnewpipe-newpipe-extractor = "01fdde08af40f39f5736c921303218209bc9c13e" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" From 5969042163a06652e9695c94e5b7f45ab58a36b7 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 18 Aug 2026 05:51:45 +0200 Subject: [PATCH 021/155] Translated using Weblate (Estonian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (French) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Czech) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Italian) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (German) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Icelandic) Currently translated at 98.9% (768 of 776 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (776 of 776 strings) Translated using Weblate (Hebrew) Currently translated at 100.0% (776 of 776 strings) Co-authored-by: Fjuro Co-authored-by: Hmomam Lazaref Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: Jeff Huang Co-authored-by: Mickaël Binos Co-authored-by: Milan Co-authored-by: Oğuz Ersen Co-authored-by: Priit Jõerüüt Co-authored-by: Simone Ognibene Co-authored-by: Sveinn í Felli Co-authored-by: VfBFan Co-authored-by: Yaron Shahrabani Co-authored-by: ginger-co Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/et/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/tr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/zh_Hant/ Translation: NewPipe/Metadata --- app/src/main/res/values-ar/strings.xml | 287 +++++++++--------- app/src/main/res/values-he/strings.xml | 52 +++- app/src/main/res/values-is/strings.xml | 21 ++ app/src/main/res/values-uk/strings.xml | 7 +- .../metadata/android/cs/changelogs/1015.txt | 1 + .../metadata/android/de/changelogs/1015.txt | 1 + .../metadata/android/et/changelogs/1015.txt | 1 + .../metadata/android/fr/changelogs/1015.txt | 1 + .../metadata/android/it/changelogs/1015.txt | 1 + .../android/pt-BR/changelogs/1015.txt | 1 + .../metadata/android/sk/changelogs/1015.txt | 1 + .../metadata/android/tr/changelogs/1015.txt | 1 + .../android/zh-Hans/changelogs/1015.txt | 1 + .../android/zh-Hant/changelogs/1015.txt | 1 + 14 files changed, 215 insertions(+), 162 deletions(-) create mode 100644 fastlane/metadata/android/cs/changelogs/1015.txt create mode 100644 fastlane/metadata/android/de/changelogs/1015.txt create mode 100644 fastlane/metadata/android/et/changelogs/1015.txt create mode 100644 fastlane/metadata/android/fr/changelogs/1015.txt create mode 100644 fastlane/metadata/android/it/changelogs/1015.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/1015.txt create mode 100644 fastlane/metadata/android/sk/changelogs/1015.txt create mode 100644 fastlane/metadata/android/tr/changelogs/1015.txt create mode 100644 fastlane/metadata/android/zh-Hans/changelogs/1015.txt create mode 100644 fastlane/metadata/android/zh-Hant/changelogs/1015.txt diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index ed22ebe0b..edb4f142f 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -18,7 +18,7 @@ اختر مجلد التنزيل لملفات الفيديو يتم تخزين ملفات الفيديو التي تم تنزيلها هنا مجلد تحميل الفيديو - ثبيت + تثبيت تطبيق Kore غير موجود. هل تريد تثبيته؟ فاتح خطأ في الشبكة @@ -27,7 +27,7 @@ الصوت تشغيل بواسطة كودي بحث - اللغة الإفتراضية للمحتوى + اللغة الافتراضية للمحتوى الإعدادات المظهر الفيديو والصوت @@ -61,8 +61,8 @@ الفيديو تنزيل حول و الأسئلة الشائعة - التاريخ - التاريخ + السجل + السجل فتح في الوضع المنبثق يزيل الصوت في بعض الجودات تم إلغاء الاشتراك في القناة @@ -108,8 +108,8 @@ عذرًا، حدث خطأ ما. أبلِغ معلومات: - ماذا حدث: - ماذا:\nطلب:\nلغة المحتوى:\nبلد المحتوى:\nلغة التطبيق:\nالخدمات:\nتوقيت جرينتش:\nالحزمة:\nالإصدار:\nOS نسخة: + مإذا حدث: + مإذا:\nطلب:\nلغة المحتوى:\nبلد المحتوى:\nلغة التطبيق:\nالخدمات:\nتوقيت جرينتش:\nالحزمة:\nالإصدار:\nOS نسخة: تعليقك (باللغة الإنجليزية): التفاصيل: لم يتم العثور على نتائج @@ -118,15 +118,15 @@ إعادة المحاولة ليس هناك مشترِكون - %s مشارك - %s مشارك - %s مشاركين - %s مشترك - %s مشترك + لا مشتركون + مشترك واحد + مشتركان + %s مشتركين + %s مشتركًا %s مشترك - دون مشاهدات - لاتوجد فيديوهات + لا توجد مشاهدات + لا توجد فيديوهات ابدأ إيقاف مؤقت احذف @@ -137,7 +137,7 @@ الخطأ يقوم نيوبايب بالتنزيل انقر للحصول على التفاصيل - يُرجى الإنتظار… + يُرجى الانتظار… تم نسخه إلى الحافظة يرجى تحديد مجلد التنزيل لاحقا في الإعدادات هذا الإذن مطلوب @@ -153,7 +153,7 @@ بث مباشر خفيف الوزن مجاني على نظام أندرويد. ساهم سواءً كانت لديك أفكارٌ حول الترجمة، أو تغييرات التصميم، أو تنظيف الكود، أو حتى تغييرات جذرية فيه — فإن المساعدة مرحب بها دائمًا. كلما زاد العمل، كان ذلك أفضل! - عرض علي GitHub + عرض على GitHub تبرع تم تطوير NewPipe بواسطة متطوعين يقضون أوقات فراغهم لتقديم أفضل تجربة مستخدم لكم. ساهموا في دعم المطورين لجعل NewPipe أفضل بينما يستمتعون بفنجان قهوة. رد الجميل @@ -169,7 +169,7 @@ لم يتم الاشتراك في أي قناة بعد الشائعة أفضل ٥٠ - جديد وساخن + جديد ورائج أحذف التفاصيل إعدادات الصوت @@ -177,33 +177,33 @@ تحدي الكابتشا ضغط مطول للإدراج الى قائمة الانتظار - %s مشاهد - %s مشاهد - %s مشاهدة - %s مشاهدة + لا مشاهدات + مشاهدة واحدة + مشاهدتان + %s مشاهدات %s مشاهدة %s مشاهدة - %s فيديو - %s أشرطة فيديو - %s أشرطة فيديو - %s أشرطة فيديو - %s أشرطة فيديو - %s أشرطة فيديو + لا فيديوهات + فيديو واحد + فيديوهان + %s فيديوهات + %s فيديو + %s فيديو طلب اختبار الكابتشا مطلوب © %1$sبواسطة%2$sتحت%3$s صفحة الكشك حدد كشك بدأ التشغيل في الخلفية - المحتوى الإفتراضي حسب البلد - الإنتقال إلى التشغيل في الخلفية - الإنتقال إلى التشغيل في النافذة المنبثقة - الإنتقال إلى الرئيسية + المحتوى الافتراضي حسب البلد + الانتقال إلى التشغيل في الخلفية + الانتقال إلى التشغيل في النافذة المنبثقة + الانتقال إلى الرئيسية فتح الدرج إغلاق الدرج - دائماً + دائمًا مرة واحدة فقط لم يتم العثور على مشغل بث (يمكنك تثبيت VLC لتشغيله). استيراد قاعدة البيانات @@ -220,10 +220,10 @@ إلغاء إعادة التسمية تمت عملية التصدير - تمَّت عملية الإستيراد + تمَّت عملية الاستيراد تنبيه: تعذر استيراد كافة الملفات. مشغل الفيديو - السؤال دائماً + السؤال دائمًا الحصول على المعلومات… تحميل المحتوى المطلوب إنشاء قائمة تشغيل جديدة @@ -237,29 +237,29 @@ تكبير تنزيل ملف البث الإشارات المرجعية - استعمال التقديم السريع الغير دقيق - خاصية التقديم الغير دقيق تسمح للمشغل بالقفز خلال الفديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز الغير دقيق + استعمال التقديم السريع غير دقيق + خاصية التقديم غير دقيق تسمح للمشغل بالقفز خلال الفيديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز غير دقيق تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور الملف - لا يوجد مثل هذا المجلد + لا يوجد المجلد لا يمكن أن يكون اسم الملف فارغًا حدث خطأٌ ما: %1$s ملف مضغوط ZIP غير صالح إزالة الإشارة المرجعية تناسب مع الشاشة توليد تلقائي - إستيراد + استيراد استعادة مِن تصدير إلى عملية الاستعادة جارية … عملية التصدير جارية … - إستيراد ملف + استيراد ملف معرفك, soundcloud.com/هويتك امسح البيانات الوصفيّة المخزّنة مؤقّتًا إزالة جميع بيانات صفحات الويب المخزنة مؤقّتًا تم محو ذاكرة التخزين المؤقتّة للبيانات الوصفيّة - وضع البث القادم تلقائيا في قائمة الإنتظار - استمر عند إنهاء قائمة التشغيل (الغير المتكررة) من خلال إلحاق التدفق المرتبط + وضع البث القادم تلقائيا في قائمة الانتظار + استمر عند إنهاء قائمة التشغيل (غير المتكررة) من خلال إلحاق البث المرتبط تعيين كصورة مصغرة لقائمة التشغيل تفضيل قائمة التشغيل تم تغيير الصورة المصغرة لقائمة التشغيل. @@ -278,7 +278,7 @@ حذف سِجل البحث بالكامل؟ تم حذف سجل البحث المشغل الخارجي لا يدعم هذه الأنواع من الروابط - لا يوجد مثل هذا الملف/مصدر المحتوى + لا يوجد الملف/مصدر المحتوى الملف غير موجود أو الإذن بالقراءة أو الكتابة إليه غير موجود لا يوجد بث متاح للتنزيل تم حذف عنصر واحد. @@ -308,13 +308,11 @@ \n2. انتقل إلى عنوان URL هذا: %1$s \n3. تسجيل الدخول عندما يطلب منك \n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه. - ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة اذا كنت تستخدم بيانات اشتراك انترنت. -\n -\nهل تريد الاستمرار؟ + ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة إذا كنت تستخدم بيانات اشتراك انترنت. \n \nهل تريد الاستمرار؟ ضوابط سرعة التشغيل سرعة الأداء تردد الصوت - إلغاء الإرتباط (قد يسبب تشويه) + إلغاء الارتباط (قد يسبب تشويه) هل تريد أيضا استيراد الإعدادات؟ سياسة خصوصية NewPipe يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك. @@ -331,7 +329,7 @@ إعادة تعيين تصغير عند تبديل التطبيق الإجراء عند التبديل إلى تطبيق آخر من مشغل الفيديو الرئيسي — %s - لاشيء + لا شيء تصغير إلى مشغل الخلفية تصغير إلى مشغل منبثق القنوات @@ -425,20 +423,20 @@ لا توجد مشاهدة لا أحد يستمع - %s مشاهدة - %s مشاهدة - %s مشاهدة - %s مشاهدات - %s مشاهدات - %s مشاهدات + لا يشاهد أحد + يشاهدها شخص واحد + يشاهدها شخصان + يشاهدها %s أشخاص + يشاهدها %s شخصًا + يشاهدها %s شخص - %s الاستماع - %s الاستماع - %s مستمعين - %s مستمعين - %s مستمعين - %s مستمعين + لا يستمع أحد + يستمع إليها شخص واحد + يستمع إليها شخصان + يستمع إليها %s أشخاص + يستمع إليها %s شخصًا + يستمع إليها %s شخص تسريع إلى الأمام/-ترجيع وقت البحث مثيلات خوادم پيرتيوب @@ -466,9 +464,9 @@ الفيديوهات %d ثانية - %d ثانية - %d ثانية - %d ثواني + ثانية واحدة + ثانيتان + %d ثوانٍ %d ثانية %d ثانية @@ -495,12 +493,12 @@ هل تريد حذف هذه المجموعة؟ اسم المجموعة فارغ - %d تحديد - %d المحدد - %d المحدد - %d المحدد - %d المحدد - %d المحدد + لا تحديد + عنصر واحد محدَّد + عنصران محدَّدان + %d عناصر محدَّدة + %d عنصرًا محدَّدًا + %d عنصر محدَّد لم يتم تحديد اشتراك حدد الاشتراكات @@ -512,7 +510,7 @@ %d يوم %d يوم - %d أيام + يومان %d أيام %d يومًا %d يومًا @@ -520,7 +518,7 @@ %d ساعة %d ساعة - %d ساعة + ساعتان %d ساعات %d ساعة %d ساعة @@ -528,12 +526,12 @@ %d دقيقة %d دقيقة - %d دقيقة + دقيقتان %d دقائق %d دقيقة %d دقيقة - نظرا لقيود مشغل ExoPlayer مدة التقديم تم ضبطها الى %d ثانية + نظرًا لقيود مشغل ExoPlayer مدة التقديم تم ضبطها الى %d ثانية إلغاء الكتم كتم الصوت هذا المحتوى ليس مدعومًا من قبل NewPipe. @@ -541,8 +539,8 @@ \nنأمل أن يكون مدعومًا في التحديثات القادمة. ∞ فيديو +100 فيديو - الفنانين - الالبومات + الفنانون + الألبومات الأغاني هذا الفيديو مقيد بالفئة العمرية. \n @@ -561,13 +559,13 @@ إظهار الاشتراكات غير المجمعة فقط لا توجد إشارات مرجعية لقائمة التشغيل حتى الآن اختر قائمة تشغيل - يرجى مراجعة ما إذا توجد بالفعل مشكلة تناقش التحطم الموجود بالفعل. عند إنشاء تذاكر مكررة، فإنك تستغرق منا وقتًا يمكن أن نقضيه في إصلاح الخطأ الفعلي. + يرجى التحقق أولًا مما إذا كانت هناك مشكلة (issue) مطروحة بالفعل تتناول هذا العطل. إنشاء تذاكر مكررة يستهلك وقتًا كان يمكن استثماره في إصلاح الخطأ نفسه. تقرير على GitHub نسخ التقرير مُنسق عرض نتائج ل: %s أبدا فقط على شبكة Wi-Fi - بدء التشغيل تلقائياً — %s + بدء التشغيل تلقائيًا — %s تشغيل قائمة الانتظار تعذر التعرف على الرابط. فتح باستخدام تطبيق آخر؟ قائمة انتظار تلقائيّة @@ -615,12 +613,11 @@ افتح باستخدام يتوفر هذا المحتوى فقط للمستخدمين الذين قاموا بالدفع، لذلك لا يمكن بثه أو تنزيله عبر NewPipe. يتوفر هذا الفيديو فقط لأعضاء YouTube Music Premium، لذلك لا يمكن بثه أو تنزيله من قبل NewPipe. - هذا المحتوى خاص، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. - هذا مسار SoundCloud Go+، على الأقل في بلدك، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. + هذا المحتوى خاص، لذلك لا يمكن بثّه أو تنزيله بواسطة NewPipe. + هذا مسار SoundCloud Go+، على الأقل في بلدك، لذلك لا يمكن بثّه أو تنزيله بواسطة NewPipe. هذا المحتوى غير متوفر في بلدك. - اغلق التطبيق قسريا - هذا الفيديو مقيد بالفئة العمرية. -\nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـ NewPipe الوصول إلى أي من تدفقات الفيديو الخاصة به، وبالتالي لا يتمكن من تشغيلها. + أغلق التطبيق قسريًا + هذا الفيديو مقيد بالفئة العمرية. \nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـ NewPipe الوصول إلى أي من بثوث الفيديو الخاصة به، وبالتالي لا يتمكن من تشغيلها. إذاعة المميزة حل @@ -672,18 +669,18 @@ اقتراحات البحث المحلية اسحب العناصر لإزالتها - اكتمل %1$s تنزيل - اكتمل %1$s تنزيل - اكتمل %1$s تنزيل + لم يكتمل أي تنزيل + اكتمل تنزيل واحد + اكتمل تنزيلان اكتملت %1$s تنزيلات - اكتمل %1$s تنزيل + اكتمل %1$s تنزيلًا اكتمل %1$s تنزيل - اكتمل التنزيل - اكتمل التنزيل - اكتمل التنزيل - اكتمل تنزيل%s + اكتمل التنزيل%s + اكتمل التنزيل%s + اكتمل التنزيلان%s + اكتملت التنزيلات%s اكتملت التنزيلات%s اكتملت التنزيلات%s @@ -693,7 +690,7 @@ تم وضع التالي على قائمة الانتظار جاري المعالجة ... قد يستغرق لحظة التحقق من وجود تحديثات - التحقق يدويا من وجود إصدارات جديدة + التحقق يدويًا من وجود إصدارات جديدة جاري التحقق من وجود تحديثات… عناصر تغذية جديدة إظهار خيار تعطل عند استخدام المشغل @@ -719,10 +716,10 @@ بث جديد إشعار المشغل لقد اشتركت الآن في هذه القناة - الإخطارات حول التدفقات الجديدة للاشتراكات + الإخطارات حول البثوث الجديدة للاشتراكات إشعارات أحداث البث الجديدة الإخطار بأحداث البث الجديدة من الاشتراكات - تشغيل التحقق من وجود تدفقات جديدة + تشغيل التحقق من وجود بثوث جديدة معدل البحث مطلوب اتصال الشبكة أي شبكة @@ -731,19 +728,19 @@ , تبديل الكل - %s دفق جديد - %s دفق جديد - %s دفق جديد - %s دفوق جديدة - %s دفق جديد - %s دفق جديد + لا بثوث جديدة + بث جديد واحد + بثّان جديدان + %s بثوث جديدة + %s بثًا جديدًا + %s بث جديد النسبة المئوية سيميتون - لا يتم عرض التدفقات التي لم يدعمها برنامج التنزيل بعد - الدفق المحدد غير مدعوم من قبل المشغلون الخارجيون - لا توجد تدفقات صوتية متاحة للمشغلات الخارجية - لا تتوفر تدفقات فيديو للاعبين الخارجيين + لا تُعرض البثوث التي لم يدعمها برنامج التنزيل بعد + البث المحدد غير مدعوم من المشغلات الخارجية + لا توجد بثوث صوتية متاحة للمشغلات الخارجية + لا تتوفر بثوث فيديو للمشغلات الخارجية حدد الجودة للمشغلين الخارجيين تنسيق غير معروف جودة غير معروفة @@ -763,17 +760,17 @@ تمت إضافة وقت (أوقات) مكررة %d تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر. مفيد ، على سبيل المثال ، إذا كنت تستخدم سماعة رأس بأزرار مادية مكسورة - تجاهل أحداث ازرار الوسائط الأجهزة - هل تريد إزالة جميع التدفقات المكررة في قائمة التشغيل هذه؟ - إظهار/إخفاء التدفقات + تجاهل ضغطات أزرار الوسائط الفعلية على الجهاز + هل تريد إزالة جميع البثوث المكررة في قائمة التشغيل هذه؟ + إظهار/إخفاء البثوث تمت مشاهدته جزئيا القادمة إزالة التكرارات إزالة التكرارات؟ - إظهار التدفقات التالية + إظهار البثوث التالية شاهدت بالكامل إجراء الإيماءة اليسرى - اجراء الإيماءة اليمنى + إجراء الإيماءة اليمنى السطوع بدون اختر إيماءة للنصف الأيسر من شاشة المشغل @@ -804,19 +801,19 @@ انقل محدد علامة التبويب الرئيسي إلى الأسفل موضع علامات التبويب الرئيسية تم تعطيل نفق وسائل الإعلام عن طريق التقصير على جهازك لأن نموذج جهازك معروف بأنه لا يدعمه. - لاتوجد بثوث - لاتوجد بثوث مباشرة - الفيديوات + لا توجد بثوث + لا توجد بثوث مباشرة + الفيديوهات المشتركون ما هي التبويبات المعروضة على صفحات القناة تبويبات القنوات - الفديوهات القصيرة + الفيديوهات القصيرة جلب البيانات الوصفية… تبديل تدوير الشاشة - الانتقال إلى وضع ملئ الشاشة + الانتقال إلى وضع ملء الشاشة اجلب تبويبات القنوات البث التالي - فتح قائمة انتظار التسغيل + فتح قائمة انتظار التشغيل حول تقديم المحتوى الألبومات @@ -850,12 +847,12 @@ مشاركة قائمة التشغيل - %1$s: %2$s - رد %s - رد %s - ردان%s - ردود%s - ردود %s - ردود %s + لا ردود + رد واحد + ردّان + %s ردود + %s ردًا + %s رد عرض المزيد عرض أقل @@ -885,14 +882,14 @@ أوقفت SoundCloud صفحة أفضل 50 الأصلية. تمت إزالة علامة التبويب المقابلة من صفحتك الرئيسية. تمت إزالة تريندات YouTube المجمعة أوقف YouTube صفحة الترند المدمجة اعتبارًا من 21 يوليو 2025. استبدلت NewPipe صفحة الموضوعات المتداولة الافتراضية بصفحة الموضوعات المتداولة الشائعة مع البث المباشر المتداول.\n\nيمكنك أيضًا تحديد صفحات رائجة مختلفة في \"الإعدادات > المحتوى > محتوى الصفحة الرئيسية\". - توجهات الألعاب - توجهات البث الصوتي - الأفلام والعروض الأكثر رواجاً + الألعاب الرائجة + البودكاست الرائج + الأفلام والعروض الأكثر رواجًا الموسيقى الرائجة %s الف %s مليون %sمليار - لاستخدام المشغل المنبثق، يرجى تحديد %1$s في قائمة إعدادات اندرويد التالية وتمكين %2$s. + لاستخدام المشغل المنبثق، يرجى تحديد %1$s في قائمة إعدادات أندرويد التالية وتمكين %2$s. “السماح بالعرض فوق التطبيقات الاخرى” حذف ملف حذف المدخلات @@ -907,35 +904,35 @@ تفاصيل حل - تصدير %d إشتراك… - تصدير %d إشتراكات… - تصدير %d إشتراكات… - تصدير %d إشتراكات… - تصدير %d إشتراك… - تصدير %d إشتراك… + تصدير الاشتراكات… + تصدير اشتراك واحد… + تصدير اشتراكين… + تصدير %d اشتراكات… + تصدير %d اشتراكًا… + تصدير %d اشتراك… - إستيراد الإشتراكات - تصدير الإشتراكات - إسترد الإشتراكات من ملف JSON تم تصديره مسبقاً - قم بتصدير إشتراكاتك إلى ملف بصيغة .json - الإستيراد من التصدير السابق + استيراد الاشتراكات + تصدير الاشتراكات + إسترد الاشتراكات من ملف JSON تم تصديره مسبقاً + قم بتصدير اشتراكاتك إلى ملف بصيغة .json + الاستيراد من التصدير السابق سيوقف NewPipe الدعم لنظام أندرويد 5 لسوء الحظ، يعتمد تطبيق NewPipe على بعض المكتبات التي توقفت عن دعم نظامي Android 5.0 و5.1. لذا، سيعمل الإصدار القادم من NewPipe فقط على الأجهزة التي تعمل بنظام Android 6 أو أحدث. اقرأ المزيد في المقالة. المدونة - تحميل %d إشتراكات… - تحميل %d إشتراكات… - تحميل %d إشتراك… - تحميل %d إشتراكات… - تحميل %d إشتراك… - تحميل %d إشتراك… + تحميل الاشتراكات… + تحميل اشتراك واحد… + تحميل اشتراكين… + تحميل %d اشتراكات… + تحميل %d اشتراكًا… + تحميل %d اشتراك… - إستيراد %d إشتراكات… - إستيراد %d إشتراكات… - إستيراد %d إشتراك… - إستيراد %d إشتراكات… - إستيراد %d إشتراك… - إستيراد %d إشتراك… + استيراد الاشتراكات… + استيراد اشتراك واحد… + استيراد اشتراكين… + استيراد %d اشتراكات… + استيراد %d اشتراكًا… + استيراد %d اشتراك… diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index cfcf05e6d..e54663a4f 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -47,8 +47,8 @@ להציג סרטונים דומים והבאים בתור כתובת לא נתמכת שפת התוכן המועדפת - סרטונים ושמע - תצוגה + וידאו ושמע + מראה מתנגן ברקע מתנגן בחלון צף תוכן @@ -156,20 +156,20 @@ תו חלופי אותיות וספרות רוב התווים המיוחדים - על אודות NewPipe - רישיונות צד שלישי + על NewPipe + רישיונות צד־שלישי © %1$s ע״י %2$s תחת %3$s על אודות ושו״ת רישיונות - נגן קל וחופשי להזרמת מדיה עבור Android. + הזרמה חופשית וקלילה ב־Android. התנדבות - אם יש לך רעיון כלשהו בנוגע לתרגום, שינויי עיצוב, ניקוי הקוד או שינויים מהותיים בקוד - אנו תמיד שמחים לקבל עזרה. ככל שיותר דברים מתבצעים כך היישומון משתפר! + אם יש לך רעיונות ליכולות מסוימות, בא לך לתרגם, לשנות את העיצוב או לבצע שינויים מהותיים בקוד - אנו תמיד שמחים לקבל עזרה. ככל שיותר דברים נעשים ככה הוא נהיה טוב יותר! הצגה ב־GitHub תרומה - הפיתוח של NewPipe נערך ע״י מתנדבים שמשקיעים את זמנם הפנוי כדי להגיש לך את חווית השימוש הטובה ביותר. באפשרותך להעניק בחזרה כדי לסייע למפתחים לשפר את NewPipe בעודם נהנים מכוס קפה. - לתרום בחזרה - אתר הבית - מומלץ לבקר באתר של NewPipe לפרטים נוספים ולחדשות. + NewPipe מפותח על ידי מתנדבים שמשקיעים את זמן החופשי כדי לספק לך את חוויית המשתמש הטובה ביותר. אפשר לתת בחזרה כדי לסייע למפתחים לשפר את NewPipe עוד יותר תוך שהם נהנים מכוס קפה. + לתת בחזרה + אתר + יש לבקר באתר של NewPipe למידע נוסף ולחדשות. הרישיון של NewPipe הצגת הרישיון היסטוריה @@ -724,8 +724,8 @@ גודל משך טעינת נגינה מיון הצגה באתר - תשובות לשאלות נפוצות - אם נתקלת בתקלות כשניסית להשתמש ביישומון, כדאי לעיין בתשובות לשאלות הנפוצות! + שאלות נפוצות + אם נתקלת בבעיות בשימוש ביישומון, חשוב לעיין בתשובות האלו לשאלות נפוצות! ניתן לייבא או לייצא מינויים מתפריט 3 הנקודות נגיעה כאן תוריד את %s מצב מהיר @@ -872,6 +872,32 @@ שגיאת HTTP 403 שהתקבלה מהשרת בזמן השמעה, ככל הנראה נגרמת עקב פקיעת כתובת URL של סטרימינג או חסימת IP שגיאת HTTP %1$s התקבלה מהשרת בזמן הניגון שגיאת HTTP‏ 403 שהתקבלה מהשרת בזמן הניגון, ככל הנראה נגרמה עקב חסימת IP או בעיות בהסרת ערפול כתובת תזרים - %1$s סירב לספק נתונים, וביקש התחברות כדי לאשר שהמבקש אינו בוט.\n\nכנראה שה־IP שלך נחסם זמנית על ידי %1$s, ניתן להמתין זמן מה או לעבור ל־IP אחר (לדוגמה על ידי הפעלה/כיבוי של VPN, או על ידי מעבר מרשת אלחוטית לתקשורת נתונים סלולרית). + %1$s סירב לספק נתונים, וביקש התחברות כדי לאשר שהמבקש אינו בוט.\n\nכנראה שה־IP שלך נחסם זמנית על ידי %1$s, ניתן להמתין זמן מה או לעבור ל־IP אחר (לדוגמה על ידי הפעלה/כיבוי של VPN, או על ידי מעבר מרשת אלחוטית לתקשורת נתונים סלולרית).\n\nנא לקרוא את רשומת FAQ הזאת למידע נוסף. תוכן זה אינו זמין עבור מדינת התוכן שנבחרה כעת.\n\nניתן לשנות את בחירתך דרך „הגדרות > תוכן > מדינת תוכן ברירת מחדל”. + + מייצא מנוי %d … + מייצא %d מנויים… + מייצא %d מנויים… + + + טוען מנוי %d … + טוען %d מנויים… + טוען %d מנויים… + + + מייבא מנוי %d … + מייבא %d מנויים… + מייבא %d מנויים… + + ייבוא מנויים + ייצוא מנויים + ייבוא מנויים מייצוא קודם בקובץ .json + ייצא את המינויים שלך לקובץ .json + ייבוא מייצוא קודם + באוגוסט 2025, גוגל הודיעה כי החל מספטמבר 2026, התקנת יישומים תדרוש אימות מפתח עבור כל יישומי אנדרואיד במכשירים מוסמכים, כולל אלה שהותקנו מחוץ לחנות Play. מכיוון שהמפתחים של NewPipe אינם מסכימים לדרישה זו, NewPipe כבר לא יעבוד על מכשירי אנדרואיד מוסמכים לאחר זמן זה. + פרטים + פתרון + NewPipe מורידה את התמיכה באנדרואיד 5 + למרבה הצער, NewPipe תלויה במספר ספריות שהורידו את התמיכה באנדרואיד 5.0 ו־5.1. הגירסה החדשה הבאה תעבוד רק על מכשירים עם אנדרואיד 6 ומעלה, למרבה הצער. קרא עוד בבלוג. + פוסט בבלוג diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index 854259735..a36968de3 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -821,4 +821,25 @@ Tók við HTTP-villu %1$s frá þjóni á meðan afspilun stóð Tók við HTTP-villu 403 frá þjóni á meðan afspilun stóð, líklega vegna banns á IP-vistfang eða vandamála með afkóðun URL-slóðar streymis Þetta efni er ekki í boði fyrir valið landsvæði efnis.\n\nBreyttu valinu með því að fara í \"Stillingar > Efni > Sjálfgefið landsvæði efnis\". + + Flyt út %d áskrift… + Flyt út %d áskriftir… + + + Hleð inn %d áskrift… + Hleð inn %d áskriftum… + + + Flyt út %d áskrift… + Flyt út %d áskriftir… + + Flytja inn áskriftir + Flytja út áskriftir + Flytja áskriftir inn úr fyrri .json útflutningsskrá + Flytja áskriftirnar þínar í .json-skrá + Flytja inn úr fyrri útflutningsskrá + Nánar + Lausn + NewPipe er að hætta stuðningi við Android 5 + Bloggfærsla diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index a64a6722f..0fbeb67d4 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -191,7 +191,7 @@ Перейменувати Ліцензії третіх сторін Про нас і ЧаПи - Libre — легкий стримінг на Android + Libre — легкий стримінг на Android. Незалежно від того, чи у вас є ідеї щодо перекладу, змін дизайну, очищення коду або серйозних доопрацювань — будь-яка допомога завжди вітається. Чим більше зроблено, тим кращим стає проєкт! Налагодження Нічого немає… чути лише цвіркунів @@ -313,8 +313,7 @@ NewPipe — це copyleft libre програмне забезпечення: ви можете вільно використовувати, вивчати, поширювати та вдосконалювати його. Зокрема, ви можете розповсюджувати та/або змінювати його на умовах GNU General Public License, опублікованої Free Software Foundation, версії 3 або (на ваш вибір) будь-якої пізнішої версії. Імпортувати разом з налаштуваннями\? Політика конфіденційності NewPipe - Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає ніяких даних без вашої згоди. -\nПолітика приватності докладно NewPipe пояснює, які дані надсилаються і зберігаються у звіті про збій. + Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає жодних даних без вашої згоди. \nПолітика приватності NewPipe докладно описує, які дані надсилаються і зберігаються у звіті про збій. Ознайомитися з політикою конфіденційності З метою дотримання Загального регламенту про захист даних ЄС (General Data Protection Regulation, GDPR) ми звертаємо вашу увагу на політику приватності NewPipe. Будь ласка, прочитайте уважно. \nВи маєте прийняти її, аби надіслати нам звіт про помилку. @@ -864,7 +863,7 @@ Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через закінчення терміну дії URL-адреси потокової передачі або заборону IP-адреси Помилка HTTP %1$s отримана від сервера під час відтворення Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через заборону IP-адреси або проблеми з деобфускацією URL-адреси потокової передачі - %1$s відмовився надати дані, запитуючи логін для підтвердження того, що запитувач не є ботом.\n\nВаша IP-адреса могла бути тимчасово заблокована %1$s. Ви можете почекати деякий час або перейти на іншу IP-адресу (наприклад, увімкнувши/вимкнувши VPN або переключившись з Wi-Fi на мобільні дані). + %1$s відмовляється надати дані та запитує пароль для підтвердження, що запитувач не бот.\n\n%1$s міг тимчасово заблокувати вашу IP-адресу. Ви можете почекати деякий час або перейти на іншу IP-адресу (наприклад, увімкнувши/вимкнувши VPN або перемкнувшись з Wi-Fi на мобільні дані).\n\nЩоб дізнатися докладніше, перегляньте цю довідку. Цей контент недоступний для вибраної країни контенту.\n\nЗмініть свій вибір у розділі \"Налаштування > Контент > Країна контенту за замовчуванням\". У серпні 2025 року, Google анонсувала, що з вересня 2026 року, для встановлення застосунків буде потрібна верифікація розробника для всіх Android застосунків на сертифікованих пристроях, включаючи ті, що були встановлені не через Play Store. Оскільки розробники NewPipe не згодні з цією вимогою, NewPipe перестане працювати на сертифікованих Android пристроях після цієї дати. Детальніше diff --git a/fastlane/metadata/android/cs/changelogs/1015.txt b/fastlane/metadata/android/cs/changelogs/1015.txt new file mode 100644 index 000000000..46d1965f3 --- /dev/null +++ b/fastlane/metadata/android/cs/changelogs/1015.txt @@ -0,0 +1 @@ +Toto je opravné vydání opravující živé přenosy na media.ccc.de. Šťastné hackování! diff --git a/fastlane/metadata/android/de/changelogs/1015.txt b/fastlane/metadata/android/de/changelogs/1015.txt new file mode 100644 index 000000000..d9bc5c754 --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/1015.txt @@ -0,0 +1 @@ +Dies ist ein Hotfix, der Probleme mit den Live-Streams auf media.ccc.de behebt. Viel Spaß beim Hacken! diff --git a/fastlane/metadata/android/et/changelogs/1015.txt b/fastlane/metadata/android/et/changelogs/1015.txt new file mode 100644 index 000000000..df86a00d2 --- /dev/null +++ b/fastlane/metadata/android/et/changelogs/1015.txt @@ -0,0 +1 @@ +See on kiirparandus media.ccc.de voogedastuse jaoks. Jätkame samas stiilis! diff --git a/fastlane/metadata/android/fr/changelogs/1015.txt b/fastlane/metadata/android/fr/changelogs/1015.txt new file mode 100644 index 000000000..884960417 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/1015.txt @@ -0,0 +1 @@ +Il s'agit d'un correctif visant à résoudre les problèmes liés aux diffusions en direct sur media.ccc.de. Bon hacking ! diff --git a/fastlane/metadata/android/it/changelogs/1015.txt b/fastlane/metadata/android/it/changelogs/1015.txt new file mode 100644 index 000000000..4e10dc1f4 --- /dev/null +++ b/fastlane/metadata/android/it/changelogs/1015.txt @@ -0,0 +1 @@ +Si tratta di un aggiornamento che risolve i problemi relativi agli streaming live su media.ccc.de. Buon hacking! diff --git a/fastlane/metadata/android/pt-BR/changelogs/1015.txt b/fastlane/metadata/android/pt-BR/changelogs/1015.txt new file mode 100644 index 000000000..e5d33d25a --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/1015.txt @@ -0,0 +1 @@ +Este é um hotfix que corrige transmissões ao vivo de media.ccc.de. Feliz Hacking! diff --git a/fastlane/metadata/android/sk/changelogs/1015.txt b/fastlane/metadata/android/sk/changelogs/1015.txt new file mode 100644 index 000000000..615e94f4b --- /dev/null +++ b/fastlane/metadata/android/sk/changelogs/1015.txt @@ -0,0 +1 @@ +Toto je verzia s opravou, ktorá rieši problémy so živými prenosmi na media.ccc.de. Príjemné hakovanie! diff --git a/fastlane/metadata/android/tr/changelogs/1015.txt b/fastlane/metadata/android/tr/changelogs/1015.txt new file mode 100644 index 000000000..04329c6ca --- /dev/null +++ b/fastlane/metadata/android/tr/changelogs/1015.txt @@ -0,0 +1 @@ +Bu, media.ccc.de için canlı yayın sorunlarını gideren bir düzeltme sürümüdür. Keyifli kodlamalar! diff --git a/fastlane/metadata/android/zh-Hans/changelogs/1015.txt b/fastlane/metadata/android/zh-Hans/changelogs/1015.txt new file mode 100644 index 000000000..f02367bd2 --- /dev/null +++ b/fastlane/metadata/android/zh-Hans/changelogs/1015.txt @@ -0,0 +1 @@ +这是热修复版本,修复 media.ccc.de 直播。Happy Hacking! diff --git a/fastlane/metadata/android/zh-Hant/changelogs/1015.txt b/fastlane/metadata/android/zh-Hant/changelogs/1015.txt new file mode 100644 index 000000000..7f7a84741 --- /dev/null +++ b/fastlane/metadata/android/zh-Hant/changelogs/1015.txt @@ -0,0 +1 @@ +這是針對 media.ccc.de 直播功能所釋出的快速修復版本。祝您愉快! From ff4a7b383e8c9421158273a562d26a5a369bb16e Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 15 Aug 2026 16:38:32 +0200 Subject: [PATCH 022/155] Translated using Weblate (Hebrew) Currently translated at 97.3% (37 of 38 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Italian) Currently translated at 100.0% (38 of 38 strings) Co-authored-by: Hmomam Lazaref Co-authored-by: Hosted Weblate Co-authored-by: Ihor Hordiichuk Co-authored-by: Random Co-authored-by: Yaron Shahrabani Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/he/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/uk/ Translation: NewPipe/compose --- .../composeResources/values-ar/strings.xml | 2 +- .../composeResources/values-it/strings.xml | 2 +- .../composeResources/values-iw/strings.xml | 39 ++++++++++++++++++- .../composeResources/values-uk/strings.xml | 4 +- 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/shared/src/commonMain/composeResources/values-ar/strings.xml b/shared/src/commonMain/composeResources/values-ar/strings.xml index 280183c95..6b8ade022 100644 --- a/shared/src/commonMain/composeResources/values-ar/strings.xml +++ b/shared/src/commonMain/composeResources/values-ar/strings.xml @@ -9,7 +9,7 @@ بث مباشر خفيف الوزن مجاني على نظام أندرويد. ساهم سواءً كانت لديك أفكارٌ حول الترجمة، أو تغييرات التصميم، أو تنظيف الكود، أو حتى تغييرات جذرية فيه — فإن المساعدة مرحب بها دائمًا. كلما زاد العمل، كان ذلك أفضل! - عرض علي GitHub + عرض على GitHub تبرع تم تطوير NewPipe بواسطة متطوعين يقضون أوقات فراغهم لتقديم أفضل تجربة مستخدم لكم. ساهموا في دعم المطورين لجعل NewPipe أفضل بينما يستمتعون بفنجان قهوة. رد الجميل diff --git a/shared/src/commonMain/composeResources/values-it/strings.xml b/shared/src/commonMain/composeResources/values-it/strings.xml index 800a1e776..d862ef661 100644 --- a/shared/src/commonMain/composeResources/values-it/strings.xml +++ b/shared/src/commonMain/composeResources/values-it/strings.xml @@ -25,7 +25,7 @@ Fatto Non disponibile NewPipe è sviluppato da volontari che impiegano il loro tempo libero per offrirti un'esperienza d'uso migliore. Restituisci il favore, aiutandoli a rendere NewPipe ancora più piacevole mentre si gustano una tazza di caffè. - Il progetto NewPipe tiene molto seriamente alla tua privacy. Perciò, l'app non raccoglie alcun dato senza il tuo consenso. \nL'informativa sulla privacy spiega nel dettaglio quali dati vengono trattati e memorizzati durante l'invio di segnalazioni per arresti anomali. + Il progetto NewPipe tiene molto alla tua privacy. Perciò, l'app non raccoglie alcun dato senza il tuo consenso. \nL'informativa sulla privacy spiega nel dettaglio quali dati vengono trattati e memorizzati durante l'invio di segnalazioni per arresti anomali. NewPipe è software libre copyleft: puoi utilizzare, studiare, condividere e migliorare a volontà il suo codice sorgente. Nello specifico è possibile ridistribuirlo e/o modificarlo in base ai termini della GNU General Public License come pubblicato dalla Free Software Foundation, sia la versione 3 della licenza sia (a vostra scelta) qualsiasi versione successiva. Impostazioni Cerca diff --git a/shared/src/commonMain/composeResources/values-iw/strings.xml b/shared/src/commonMain/composeResources/values-iw/strings.xml index 55344e519..c64858600 100644 --- a/shared/src/commonMain/composeResources/values-iw/strings.xml +++ b/shared/src/commonMain/composeResources/values-iw/strings.xml @@ -1,3 +1,40 @@ - \ No newline at end of file + חזרה + על NewPipe + רישיונות צד־שלישי + על ידי %1$s בכפוף לרישיון %2$s + על אודות ושו״ת + רישיונות + הזרמה חופשית וקלילה ב־Android. + התנדבות + הצגה ב־GitHub + תרומה + לתת בחזרה + אתר + יש לבקר באתר של NewPipe למידע נוסף ולחדשות. + מדיניות הפרטיות של NewPipe + הצגת מדיניות הפרטיות + הרישיון של NewPipe + הצגת הרישיון + שאלות נפוצות + סיום + לא זמין + פתיחה בדפדפן + הגדרות + חיפוש + תוכן + התראות + וידאו ושמע + הורדה + מראה + היסטוריה ומטמון + עדכונים + גיבוי ושחזור + ניפוי שגיאות + אם יש לך רעיונות ליכולות מסוימות, בא לך לתרגם, לשנות את העיצוב או לבצע שינויים מהותיים בקוד - אנו תמיד שמחים לקבל עזרה. ככל שיותר דברים נעשים ככה הוא נהיה טוב יותר! + NewPipe מפותח על ידי מתנדבים שמשקיעים את זמן החופשי כדי לספק לך את חוויית המשתמש הטובה ביותר. אפשר לתת בחזרה כדי לסייע למפתחים לשפר את NewPipe עוד יותר תוך שהם נהנים מכוס קפה. + מיזם NewPIpe לוקח את הפרטיות שלך ברצינות. לכן, היישומן לא אוסף נתונים עליך ללא הסכמתך.\nמדיניות הפרטיות של NewPipe מסבירה בפירוט אילו נתונים נשלחים ומאוחסנים בעת משלוח דיווח על קריסה. + אם נתקלת בבעיות בשימוש ביישומון, חשוב לעיין בתשובות האלו לשאלות נפוצות! + הצגה באתר + diff --git a/shared/src/commonMain/composeResources/values-uk/strings.xml b/shared/src/commonMain/composeResources/values-uk/strings.xml index d612c4bea..d59fdbfc2 100644 --- a/shared/src/commonMain/composeResources/values-uk/strings.xml +++ b/shared/src/commonMain/composeResources/values-uk/strings.xml @@ -5,7 +5,7 @@ Ліцензії третіх сторін Про нас і ЧаПи Ліцензії - Libre — легкий стримінг на Android + Libre — легкий стримінг на Android. Зробіть внесок Незалежно від того, чи у вас є ідеї щодо перекладу, змін дизайну, очищення коду або серйозних доопрацювань — будь-яка допомога завжди вітається. Чим більше зроблено, тим кращим стає проєкт! Переглянути на GitHub @@ -15,7 +15,7 @@ Вебсайт Відвідайте вебсайт NewPipe, щоб дізнатися більше інформації та новин. Політика конфіденційності NewPipe - Проєкт NewPipe дуже серйозно ставиться до вашої конфіденційності. Тому застосунок не збирає жодних даних без вашої згоди.\nПолітика конфіденційності NewPipe детально пояснює, які дані надсилаються та зберігаються, коли ви надсилаєте звіт про збій. + Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає жодних даних без вашої згоди. \nПолітика приватності NewPipe докладно описує, які дані надсилаються і зберігаються у звіті про збій. Ознайомитися з політикою конфіденційності Ліцензія NewPipe NewPipe — це copyleft libre програмне забезпечення: ви можете вільно використовувати, вивчати, поширювати та вдосконалювати його. Зокрема, ви можете розповсюджувати та/або змінювати його на умовах GNU General Public License, опублікованої Free Software Foundation, версії 3 або (на ваш вибір) будь-якої пізнішої версії. From ebd71388fe2cbe520c38a2cb678ad9668fd8e254 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 23 Jul 2026 17:34:48 +0200 Subject: [PATCH 023/155] [YouTube] Add support for"podcasts" and "courses" tabs --- .../settings/migration/SettingMigrations.java | 22 ++++++++++++++++++- .../schabi/newpipe/util/ChannelTabHelper.java | 14 ++++++++++++ app/src/main/res/values/settings_keys.xml | 12 ++++++++++ app/src/main/res/values/strings.xml | 2 ++ 4 files changed, 49 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java index 92520ec7e..7350afb40 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java @@ -221,6 +221,25 @@ public final class SettingMigrations { } }; + private static final Migration MIGRATION_8_9 = new Migration(8, 9) { + @Override + protected void migrate(@NonNull final Context context) { + // Support for courses and podcasts tabs were added. + // If the user changed the displayed tabs the new ones need to be added to the list + // of displayed tabs. + final Set enabledTabs = sp.getStringSet(context.getString( + R.string.show_channel_tabs_key), null); + if (enabledTabs != null) { + enabledTabs.add(context.getString(R.string.show_channel_tabs_courses)); + enabledTabs.add(context.getString(R.string.show_channel_tabs_podcasts)); + sp.edit() + .putStringSet(context.getString(R.string.show_channel_tabs_key), + enabledTabs) + .apply(); + } + } + }; + /** * List of all implemented migrations. *

@@ -236,12 +255,13 @@ public final class SettingMigrations { MIGRATION_5_6, MIGRATION_6_7, MIGRATION_7_8, + MIGRATION_8_9, }; /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - private static final int VERSION = 8; + private static final int VERSION = 9; static void runMigrationsIfNeeded(@NonNull final Context context) { diff --git a/app/src/main/java/org/schabi/newpipe/util/ChannelTabHelper.java b/app/src/main/java/org/schabi/newpipe/util/ChannelTabHelper.java index cde6e3fef..57ed91a4d 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ChannelTabHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ChannelTabHelper.java @@ -27,6 +27,8 @@ public final class ChannelTabHelper { case ChannelTabs.LIKES: case ChannelTabs.SHORTS: case ChannelTabs.LIVESTREAMS: + case ChannelTabs.PODCASTS: + case ChannelTabs.COURSES: return true; default: return false; @@ -65,6 +67,10 @@ public final class ChannelTabHelper { return R.string.show_channel_tabs_albums; case ChannelTabs.LIKES: return R.string.show_channel_tabs_likes; + case ChannelTabs.PODCASTS: + return R.string.show_channel_tabs_podcasts; + case ChannelTabs.COURSES: + return R.string.show_channel_tabs_courses; default: return -1; } @@ -83,6 +89,10 @@ public final class ChannelTabHelper { return R.string.fetch_channel_tabs_livestreams; case ChannelTabs.LIKES: return R.string.fetch_channel_tabs_likes; + case ChannelTabs.PODCASTS: + return R.string.fetch_channel_tabs_podcasts; + case ChannelTabs.COURSES: + return R.string.fetch_channel_tabs_courses; default: return -1; } @@ -107,6 +117,10 @@ public final class ChannelTabHelper { return R.string.channel_tab_albums; case ChannelTabs.LIKES: return R.string.channel_tab_likes; + case ChannelTabs.PODCASTS: + return R.string.channel_tab_podcasts; + case ChannelTabs.COURSES: + return R.string.channel_tab_courses; default: return R.string.unknown_content; } diff --git a/app/src/main/res/values/settings_keys.xml b/app/src/main/res/values/settings_keys.xml index 60ac20d0a..d5cc13014 100644 --- a/app/src/main/res/values/settings_keys.xml +++ b/app/src/main/res/values/settings_keys.xml @@ -297,6 +297,8 @@ show_channel_tabs_playlists show_channel_tabs_albums show_channel_tabs_likes + show_channel_tabs_podcasts + show_channel_tabs_courses show_channel_tabs_about @string/show_channel_tabs_videos @@ -307,6 +309,8 @@ @string/show_channel_tabs_playlists @string/show_channel_tabs_albums @string/show_channel_tabs_likes + @string/show_channel_tabs_podcasts + @string/show_channel_tabs_courses @string/show_channel_tabs_about @@ -318,6 +322,8 @@ @string/channel_tab_playlists @string/channel_tab_albums @string/channel_tab_likes + @string/channel_tab_podcasts + @string/channel_tab_courses @string/channel_tab_about show_search_suggestions @@ -396,12 +402,16 @@ fetch_channel_tabs_shorts fetch_channel_tabs_livestreams fetch_channel_tabs_likes + fetch_channel_tabs_podcasts + fetch_channel_tabs_courses @string/fetch_channel_tabs_videos @string/fetch_channel_tabs_tracks @string/fetch_channel_tabs_shorts @string/fetch_channel_tabs_livestreams @string/fetch_channel_tabs_likes + @string/fetch_channel_tabs_podcasts + @string/fetch_channel_tabs_courses @string/channel_tab_videos @@ -409,6 +419,8 @@ @string/channel_tab_shorts @string/channel_tab_livestreams @string/channel_tab_likes + @string/channel_tab_podcasts + @string/channel_tab_courses import_export_data_path diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 912ad3f36..d8d1fadee 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -849,6 +849,8 @@ Playlists Albums Likes + Podcasts + Courses About Channel tabs What tabs are shown on the channel pages From 1d1f801f548181d55619dee04e71e0fe922f74dc Mon Sep 17 00:00:00 2001 From: Thompson3142 Date: Wed, 19 Aug 2026 22:02:54 +0200 Subject: [PATCH 024/155] Fix opening links with timestamps Fixes a regression from #13390 where the timestamp from links was immediately overridden. --- app/src/main/java/org/schabi/newpipe/player/Player.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 7e72ff015..0b4c9884b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -1762,7 +1762,6 @@ public final class Player implements PlaybackListener, Listener { if (isStopped()) { // Some phones suspend a paused player after 10 minutes. This causes the player to // enter STATE_IDLE, causing playback to fail. So we try to recover from that here. - setRecovery(); reloadPlayQueueManager(); } From 2acfbab5f43dcf1b2bb9e97fe221fdd03dc1f6cd Mon Sep 17 00:00:00 2001 From: Elitenotavailable <138232793+Elitenotavailable@users.noreply.github.com> Date: Wed, 29 Jul 2026 11:51:49 +0530 Subject: [PATCH 025/155] Fix playlist not clearing when navigating back (#8888) --- .../local/playlist/LocalPlaylistFragment.java | 129 +++------------ .../local/playlist/LocalPlaylistViewModel.kt | 148 ++++++++++++++++++ 2 files changed, 167 insertions(+), 110 deletions(-) create mode 100644 app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistViewModel.kt diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index cb38d9bae..5047d4b7d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -17,7 +17,6 @@ import android.os.Parcelable; import android.text.InputType; import android.text.TextUtils; import android.util.Log; -import android.util.Pair; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -31,6 +30,7 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; +import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -40,7 +40,6 @@ import org.reactivestreams.Subscription; import org.schabi.newpipe.NewPipeDatabase; import org.schabi.newpipe.R; import org.schabi.newpipe.database.LocalItem; -import org.schabi.newpipe.database.history.model.StreamHistoryEntry; import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; import org.schabi.newpipe.database.playlist.model.PlaylistEntity; import org.schabi.newpipe.database.stream.model.StreamEntity; @@ -55,7 +54,6 @@ import org.schabi.newpipe.fragments.list.playlist.PlaylistControlViewHolder; import org.schabi.newpipe.info_list.dialog.InfoItemDialog; import org.schabi.newpipe.info_list.dialog.StreamDialogDefaultEntry; import org.schabi.newpipe.local.BaseLocalListFragment; -import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.player.playqueue.PlayQueue; import org.schabi.newpipe.player.playqueue.SinglePlayQueue; import org.schabi.newpipe.util.DeviceUtils; @@ -72,13 +70,11 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; -import java.util.stream.Collectors; import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.CompositeDisposable; import io.reactivex.rxjava3.disposables.Disposable; -import io.reactivex.rxjava3.schedulers.Schedulers; public class LocalPlaylistFragment extends BaseLocalListFragment, Void> implements PlaylistControlViewHolder, DebounceSavable { @@ -97,6 +93,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment { + if (state instanceof LocalPlaylistViewModel.WorkState.Loading) { + showLoading(); + } else { + hideLoading(); + if (state instanceof LocalPlaylistViewModel.WorkState.Error error) { + showError(new ErrorInfo(error.getThrowable(), UserAction.REQUESTED_BOOKMARK, + "Playlist operation")); + } + } + }); + disposables = new CompositeDisposable(); isLoadingComplete = new AtomicBoolean(); @@ -369,13 +377,9 @@ public class LocalPlaylistFragment extends BaseLocalListFragment historyList.stream().map(StreamHistoryEntry::getStreamId) - .collect(Collectors.toList())); - final var streamsMaybe = playlistManager.getPlaylistStreams(playlistId) - .firstElement() - .zipWith(historyIdsMaybe, (playlist, historyStreamIds) -> { - // Remove Watched, Functionality data - final List itemsToKeep = new ArrayList<>(); - final boolean isThumbnailPermanent = playlistManager - .getIsPlaylistThumbnailPermanent(playlistId); - boolean thumbnailVideoRemoved = false; - - final var streamStates = recordManager - .loadLocalStreamStateBatch(playlist).blockingGet(); - - for (int i = 0; i < playlist.size(); i++) { - final var playlistItem = playlist.get(i); - final var streamStateEntity = streamStates.get(i); - final int indexInHistory = Collections.binarySearch(historyStreamIds, - playlistItem.getStreamId()); - final long duration = playlistItem.toStreamInfoItem().getDuration(); - - if (indexInHistory < 0 // stream is not in history - // stream is in history but the streamStateEntity is null - // if the stream was played for less than 5 seconds, see - // StreamStateEntity#PLAYBACK_SAVE_THRESHOLD_START_MILLISECONDS - || streamStateEntity == null - || (!removePartiallyWatched - && !streamStateEntity.isFinished(duration))) { - itemsToKeep.add(playlistItem); - } else if (!isThumbnailPermanent && !thumbnailVideoRemoved - && playlistManager.getPlaylistThumbnailStreamId(playlistId) - == playlistItem.getStreamEntity().getUid()) { - thumbnailVideoRemoved = true; - } - } - - return new Pair<>(itemsToKeep, thumbnailVideoRemoved); - }); - - disposables.add(streamsMaybe.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(flow -> { - final List itemsToKeep = flow.first; - final boolean thumbnailVideoRemoved = flow.second; - - itemListAdapter.clearStreamItemList(); - itemListAdapter.addItems(itemsToKeep); - debounceSaver.setHasChangesToSave(); - saveImmediate(); - - if (thumbnailVideoRemoved) { - updateThumbnailUrl(); - } - - final long videoCount = itemListAdapter.getItemsList().size(); - setStreamCountAndOverallDuration(itemListAdapter.getItemsList()); - if (videoCount == 0) { - showEmptyState(); - } - - hideLoading(); - isRewritingPlaylist = false; - }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, - "Removing watched videos, partially watched=" + removePartiallyWatched)))); + viewModel.removeWatchedStreams(playlistId, removePartiallyWatched); } @Override @@ -633,29 +564,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment { - itemListAdapter.clearStreamItemList(); - itemListAdapter.addItems(itemsToKeep); - setStreamCountAndOverallDuration(itemListAdapter.getItemsList()); - debounceSaver.setHasChangesToSave(); - saveImmediate(); - - hideLoading(); - isRewritingPlaylist = false; - }, throwable -> showError(new ErrorInfo(throwable, UserAction.REQUESTED_BOOKMARK, - "Removing duplicated streams")))); + viewModel.removeDuplicates(playlistId); } private void deleteItem(final PlaylistStreamEntry item) { diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistViewModel.kt new file mode 100644 index 000000000..954449bb4 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistViewModel.kt @@ -0,0 +1,148 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.local.playlist + +import android.app.Application +import android.util.Pair +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.disposables.CompositeDisposable +import io.reactivex.rxjava3.schedulers.Schedulers +import java.util.Collections +import org.schabi.newpipe.NewPipeDatabase +import org.schabi.newpipe.database.playlist.PlaylistStreamEntry +import org.schabi.newpipe.database.playlist.model.PlaylistEntity +import org.schabi.newpipe.local.history.HistoryRecordManager + +class LocalPlaylistViewModel(application: Application) : AndroidViewModel(application) { + private val playlistManager = LocalPlaylistManager(NewPipeDatabase.getInstance(application)) + private val recordManager = HistoryRecordManager(application) + private val disposables = CompositeDisposable() + + private val _workState = MutableLiveData(WorkState.Idle) + val workState: LiveData = _workState + + sealed class WorkState { + object Idle : WorkState() + object Loading : WorkState() + data class Error(val throwable: Throwable) : WorkState() + object Success : WorkState() + } + + /** + * Removes watched streams from the playlist. + * This operation is performed in the background and survives fragment destruction + * as it is not disposed when the ViewModel is cleared (to fix #8888). + */ + fun removeWatchedStreams(playlistId: Long, removePartiallyWatched: Boolean) { + _workState.value = WorkState.Loading + + val historyIdsMaybe = recordManager.streamHistorySortedById + .firstElement() + .map { historyList -> + historyList.map { it.streamId } + } + + val streamsMaybe = playlistManager.getPlaylistStreams(playlistId) + .firstElement() + .zipWith(historyIdsMaybe) { playlist, historyStreamIds -> + val itemsToKeep = mutableListOf() + val isThumbnailPermanent = playlistManager.getIsPlaylistThumbnailPermanent(playlistId) + var thumbnailVideoRemoved = false + + val streamStates = recordManager.loadLocalStreamStateBatch(playlist).blockingGet() + + for (i in playlist.indices) { + val playlistItem = playlist[i] + val streamStateEntity = streamStates[i] + val indexInHistory = Collections.binarySearch(historyStreamIds, playlistItem.streamId) + val duration = playlistItem.toStreamInfoItem().duration + + if (indexInHistory < 0 || streamStateEntity == null || + (!removePartiallyWatched && !streamStateEntity.isFinished(duration)) + ) { + itemsToKeep.add(playlistItem) + } else if (!isThumbnailPermanent && !thumbnailVideoRemoved && + playlistManager.getPlaylistThumbnailStreamId(playlistId) == + playlistItem.streamEntity.uid + ) { + thumbnailVideoRemoved = true + } + } + + Pair(itemsToKeep, thumbnailVideoRemoved) + } + + val disposable = streamsMaybe + .subscribeOn(Schedulers.io()) + .flatMapCompletable { flow -> + val itemsToKeep = flow.first + val thumbnailVideoRemoved = flow.second + val streamIds = itemsToKeep.map { it.streamId } + + playlistManager.updateJoin(playlistId, streamIds) + .andThen( + Completable.fromAction { + if (thumbnailVideoRemoved) { + updateThumbnailUrl(playlistId, itemsToKeep) + } + } + ) + } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { _workState.value = WorkState.Success }, + { _workState.value = WorkState.Error(it) } + ) + + disposables.add(disposable) + } + + /** + * Removes duplicate streams from the playlist. + */ + fun removeDuplicates(playlistId: Long) { + _workState.value = WorkState.Loading + + val disposable = playlistManager.getDistinctPlaylistStreams(playlistId) + .firstElement() + .subscribeOn(Schedulers.io()) + .flatMapCompletable { itemsToKeep -> + val streamIds = itemsToKeep.map { it.streamId } + playlistManager.updateJoin(playlistId, streamIds) + } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe( + { _workState.value = WorkState.Success }, + { _workState.value = WorkState.Error(it) } + ) + + disposables.add(disposable) + } + + private fun updateThumbnailUrl(playlistId: Long, itemsToKeep: List) { + if (playlistManager.getIsPlaylistThumbnailPermanent(playlistId)) { + return + } + + val thumbnailStreamId = if (itemsToKeep.isNotEmpty()) { + itemsToKeep[0].streamEntity.uid + } else { + PlaylistEntity.DEFAULT_THUMBNAIL_ID + } + + playlistManager.changePlaylistThumbnail(playlistId, thumbnailStreamId, false).blockingGet() + } + + override fun onCleared() { + super.onCleared() + // We deliberately do not clear disposables here to allow pending + // database mutations to finish even if the user leaves the screen. + } +} From 0245413725a0fec07958d1057652ef9e884ef2b7 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 20 Aug 2026 23:10:31 +0200 Subject: [PATCH 026/155] Update extractor --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f518b3ae..cb1a4836a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "01fdde08af40f39f5736c921303218209bc9c13e" +teamnewpipe-newpipe-extractor = "bf530ea1361a332964d8d0a4ec79b0e57221b7ec" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" From aa937ea269a5a7a16c8b175a13fad349901d6c40 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 20 Aug 2026 23:39:45 +0200 Subject: [PATCH 027/155] Revert "Update extractor" This reverts commit 0245413725a0fec07958d1057652ef9e884ef2b7. --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cb1a4836a..0f518b3ae 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "bf530ea1361a332964d8d0a4ec79b0e57221b7ec" +teamnewpipe-newpipe-extractor = "01fdde08af40f39f5736c921303218209bc9c13e" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" From c0e530be37cf5dffded928f20cbde133775b15f3 Mon Sep 17 00:00:00 2001 From: Maxwellm34 Date: Fri, 21 Aug 2026 16:43:12 +0000 Subject: [PATCH 028/155] =?UTF-8?q?fix:=20correct=20typo=20INFINGING=20?= =?UTF-8?q?=E2=86=92=20INFRINGING=20in=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Maxwellm34 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b95bdd97a..28a429ecb 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ > > PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS. > -> "NewPipe" IS A REGISTERED WORD MARK SUBJECT TO [ITS TRADEMARK POLICY](https://newpipe-ev.de/policy/trademark/). INFINGING APPLICATIONS WILL NOT BE TOLERATED. +> "NewPipe" IS A REGISTERED WORD MARK SUBJECT TO [ITS TRADEMARK POLICY](https://newpipe-ev.de/policy/trademark/). INFRINGING APPLICATIONS WILL NOT BE TOLERATED. ## Screenshots From 936ce4943da4fd76ef3a90f9d60b33f4ea9df902 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 21 Aug 2026 13:56:21 +0200 Subject: [PATCH 029/155] Translated using Weblate (Japanese) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 99.6% (775 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Romanian) Currently translated at 99.8% (775 of 776 strings) Co-authored-by: Agnieszka C Co-authored-by: Aster Co-authored-by: Fjuro Co-authored-by: Ghost of Sparta Co-authored-by: Graweeld - (grwd) Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Laur Co-authored-by: Laur Ioniță Co-authored-by: Mickaël Binos Co-authored-by: Oğuz Ersen Co-authored-by: Priit Jõerüüt Co-authored-by: Trunars Co-authored-by: VfBFan Co-authored-by: justcontributor Co-authored-by: ojppe Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ja/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ko/ Translation: NewPipe/Metadata --- app/src/main/res/values-bg/strings.xml | 2 + app/src/main/res/values-cs/strings.xml | 2 + app/src/main/res/values-de/strings.xml | 2 + app/src/main/res/values-et/strings.xml | 4 +- app/src/main/res/values-fr/strings.xml | 2 + app/src/main/res/values-hu/strings.xml | 2 + app/src/main/res/values-ja/strings.xml | 2 + app/src/main/res/values-ko/strings.xml | 2 + app/src/main/res/values-nl/strings.xml | 2 + app/src/main/res/values-pl/strings.xml | 2 + app/src/main/res/values-ro/strings.xml | 50 +++++++++---------- app/src/main/res/values-sk/strings.xml | 2 + app/src/main/res/values-tr/strings.xml | 2 + app/src/main/res/values-zh-rCN/strings.xml | 2 + .../metadata/android/ja/changelogs/1015.txt | 1 + .../metadata/android/ko/changelogs/1015.txt | 1 + 16 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 fastlane/metadata/android/ja/changelogs/1015.txt create mode 100644 fastlane/metadata/android/ko/changelogs/1015.txt diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 6a11d5470..dff8efa44 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -854,4 +854,6 @@ NewPipe спира поддръжката си за Android 5 За съжаление NewPipe зависи от няколко библиотеки, които спряха поддръжката за Android 5.0 и 5.1. Следователно, за съжаление, следващата версия на NewPipe ще работи само на устройства с Android 6 или по-нова версия. Прочетете повече в публикацията в блога. Публикация в блога + Подкасти + Курсове diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index cca86dacc..c77d895e0 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -890,4 +890,6 @@ NewPipe ukončuje podporu systému Android 5 NewPipe bohužel využívá několik knihoven, které již nepodporují Android 5.0 a 5.1. Příští verze NewPipe proto bude bohužel fungovat pouze na zařízeních s Androidem 6 nebo novějším. Více se dozvíte v tomto blogovém příspěvku. Blogový příspěvek + Podcasty + Kurzy diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 182135a4b..c312bd7a1 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -868,4 +868,6 @@ Blogbeitrag NewPipe stellt die Unterstützung für Android 5 ein Leider ist NewPipe auf einige Bibliotheken angewiesen, welche die Unterstützung für Android 5.0 und 5.1 eingestellt haben. Die nächste Version von NewPipe wird daher leider nur auf Geräten mit Android 6 oder höher funktionieren. Mehr dazu im Blogbeitrag. + Podcasts + Kurse diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index f3edefe57..a3b52a4b8 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -3,7 +3,7 @@ Alustamiseks toksa suurendusklaasi ikooni. Avaldatud %1$s Voogesituseks puudub pleier. Kas paigaldame VLC\? - Voogesituseks puudub pleier (selleks võid paigaldada VLC). + Voogesituseks puudub pleier (selleks saad paigaldada VLC). Paigalda Tühista Ava veebilehitsejas @@ -855,4 +855,6 @@ NewPipe loobub Android 5 toest Kahjuks sõltub NewPipe mõnest teegist, mis on lõpetanud Androidi versioonide 5.0 ja 5.1 toetamise. Seetõttu töötab järgmine NewPipe’i versioon kahjuks ainult nutiseadmetes, millel on Android 6 või uuem versioon. Lisateavet leiad ajaveebi postitusest. Postitus meie ajaveebis + Taskuhäälingud + Kursused diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 9fc9b9864..ec768fb43 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -889,4 +889,6 @@ NewPipe ne prendra plus en charge Android 5 Malheureusement, NewPipe dépend de certaines bibliothèques qui ne prennent plus en charge Android 5.0 et 5.1. La prochaine version de NewPipe ne fonctionnera donc, à notre grand regret, que sur les appareils équipés d\'Android 6 ou d\'une version ultérieure. Pour en savoir plus, consultez l\'article de blog. Article de blog + Podcasts + Cours diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 1f16890b0..21d8143ad 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -840,4 +840,6 @@ A NewPipe megszünteti az Android 5 támogatását Sajnos a NewPipe néhány olyan programkönyvtárra támaszkodik, amelyek megszüntették az Android 5.0 és 5.1 verziójának támogatását. A NewPipe következő verziója ezért sajnos csak Android 6 vagy újabb rendszerrel rendelkező eszközökön fog működni. További információt a blogbejegyzésben olvashat. Blogbejegyzés + Podcastok + Tanfolyamok diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 5fc287e20..d3760700d 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -852,4 +852,6 @@ NewPipeはAndroid 5のサポートを終了します 残念ながら、NewPipeが依存している一部のライブラリでAndroid 5.0および5.1のサポートが終了しました。そのため、次回リリースのNewPipeはAndroid 6以降の端末でのみ動作します。詳しくはブログ記事をご覧ください。 ブログ記事 + ポッドキャスト + コース diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 0d7b5ef7d..73825fb10 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -853,4 +853,6 @@ NewPipe가 Android 5 지원을 중단합니다 NewPipe는 Android 5.0 및 5.1 지원을 중단한 몇 라이브러리에 의존합니다. 따라서 유감스럽게도 다음NewPipe 버전은 Android 6 이상 기기에서만 작동할 예정입니다. 자세한 내용은 블로그 게시글을 참조하세요. 블로그 게시글 + 팟캐스트 + 강의 diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index ff07daa29..82a6f4a7c 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -870,4 +870,6 @@ NewPipe stopt met ondersteuning voor Android 5 NewPipe is afhankelijk van een aantal bibliotheken die geen ondersteuning meer bieden voor Android 5.0 en 5.1. De volgende versie van NewPipe zal daarom alleen werken op apparaten met Android 6 of hoger. Lees meer in het blogbericht. Blogbericht + Podcasts + Cursussen diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index f3efb7db0..802b001a4 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -899,4 +899,6 @@ NewPipe przestaje obsługiwać Androida 5 Niestety, NewPipe zależy od kilku bibliotek, które przestały obsługiwać Androida 5.0 i 5.1. W związku z tym kolejna wersja NewPipe będzie działać wyłącznie na urządzeniach z Androidem 6 lub nowszym. Czytaj więcej we wpisie na blogu. Wpis na blogu + Podcasty + Kursy diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 46526e418..f85aa1da9 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -4,10 +4,10 @@ Niciun player pentru streaming găsit. Instalați VLC\? Instalare Anulare - Deschidere în browser + Deschide în browser Distribuire Descărcare - Căutare + Caută Setări V-ați referit la: „%1$s” ? Distribuiți cu @@ -33,8 +33,8 @@ Arată videoclipurile care \'Urmează\' și cele \'Similare\' URL nesuportat Limba dorită a conținutului - Video și Audio - Aspect + Video și audio + Aparență Redare în fundal Conținut Afișați conținutul restricționat de vârstă @@ -116,7 +116,7 @@ Continuă redarea după întreruperi (ex: după apeluri) Player Comportament - Istoric și cache + Istorie și cache Anulare Notificare NewPipe Notificări pentru playerul NewPipe @@ -140,23 +140,23 @@ %s videoclipuri %s de videoclipuri - Descărcări + Descarcă Caractere permise în numele fișierelor Caracterele nevalabile sunt înlocuite cu această valoare Caracter de înlocuire Litere și cifre Caractere speciale Despre NewPipe - Licențe terță-parte + Licențe terți © %1$s de %2$s sub %3$s - Despre & FAQ + Despre & Întrebări Comune Licențe - Un player de streaming „ușor” liber, pentru Android. - Vedeți pe GitHub - Licența NewPipe - Fie că aveți idei de: traducere, modificări de design, curățare a codului sau modificări de cod cu adevărat importante - ajutorul este întotdeauna binevenit. Cu cât se face mai mult, cu atât mai bine devine! - Citiți licența - Contribuiți + Streaming sursă-liberă pentru Android. + Vezi în GitHub + Licența a NewPipe + Când îți vine idea de; traduceri, schimbări de design, curățare cod sau schimbări reale de cod - Ajutorul este mereu binevenit. Cu cât mai mult, cu cât mai bine! + Citește licența + Contribuie Istoric Istoric Doriți să ștergeți acest element din istoricul de căutare? @@ -210,10 +210,10 @@ Fișierul nu există sau lipsește permisiunea de a citi sau scrie în el Numele fișierului nu poate fi gol A survenit o eroare: %1$s - NewPipe este dezvoltat de voluntari care își petrec timpul liber pentru a vă oferi cea mai bună experiență de utilizare. Donează pentru a ajuta dezvoltatorii să facă NewPipe și mai bun în timp ce ei se bucură de o ceașcă de cafea. - Dăruiește înapoi - Site web - Vizitați site-ul NewPipe pentru mai multe informații și noutăți. + NewPipe este creat de voluntari ce își oferă timpul lor liber pentru ați oferi cea mai bună experiență. Oferă înapoi creatorilor pentru a face aplicația și mai bună. + Oferă Înapoi + Site Web + Vizitează Site-ul NewPipe pentru mai multe informații și știri. Ultimele vizionări Cele mai multe vizionări Exportat @@ -240,7 +240,7 @@ Creați Respingeți Redenumiți - Donați + Donează De asemenea, doriți să importați setări? Nume Listă de redare creată @@ -295,11 +295,11 @@ Mărire Subtitrări Modificați scara textului de legendă a playerului și stilurile de fundal. Necesită repornirea aplicației pentru a intra în vigoare - NewPipe este un software liber cu copyleft: îl puteți folosi, studia, distribui și îmbunătăți în voie. Mai exact, îl puteți redistribui și/sau modifica în conformitate cu termenii Licenței Publice Generale GNU, așa cum a fost publicată de Free Software Foundation, fie versiunea 3 a Licenței, fie (la alegerea dumneavoastră) orice versiune ulterioară. - Politica de confidențialitate a NewPipe + NewPipe este o aplicație liberă: Poți folosi, studia, partaja, și a o face mai bună după propria voință. Poți redistribui și/sau modifica aplicația în termenii GNU GPL publicate de Free Software Foundation, toate dintre cele 3 versiuni, or (la opțiunea dvs.) orice versiune mai nouă. + Politica de Confidențialitate NewPipe Proiectul NewPipe ia foarte în serios confidențialitatea dumneavoastră. Prin urmare, aplicația nu colectează niciun fel de date fără consimțământul dumneavoastră. \nPolitica de confidențialitate a NewPipe explică în detaliu ce date sunt trimise și stocate atunci când trimiteți un raport de eroare. - Citiți politica de confidențialitate + Citește Politica de confidențialitate Nu s-au putut citi filele salvate, deci se folosesc cele implicite Restaurați valorile implicite Doriți să restaurați valorile implicite\? @@ -694,8 +694,8 @@ Format necunoscut Calitate necunoscută Dimensiunea intervalului de încărcare de redare - Vedeți pe website - Dacă întâmpinați probleme cu utilizarea aplicației, nu uitați să consultați aceste răspunsuri la întrebări frecvente! + Vezi în website + Dacă aveți probleme folosind aplicația, uitați-vă la răspunsurile celor mai comune întrebărilor puse! Întrebări frecvente Sortare Modul rapid @@ -804,7 +804,7 @@ Arată mai puține Piste Nu este suficient spațiu liber pe dispozitiv - Backup și restabilire + Copie de rezervă și Restabilire NewPipe poate verifica automat din când în când dacă există versiuni noi și vă poate anunța când acestea sunt disponibile.\nDoriți să activați această opțiune? Resetați toate setările la valorile implicite Da diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 6d1459054..1f2a81de4 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -890,4 +890,6 @@ NewPipe ukončuje podporu pre Android 5 NewPipe je bohužiaľ závislý od niekoľkých knižníc, ktoré ukončili podporu pre Android 5.0 a 5.1. Ďalšia verzia NewPipe bude preto, žiaľ, fungovať len na zariadeniach s Androidom 6 alebo novším. Viac informácií nájdete v blogovom príspevku. Blogový príspevok + Podcasty + Kurzy diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 315a1f8e8..40fe3d0f8 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -869,4 +869,6 @@ NewPipe, Android 5 desteğini bırakıyor NewPipe ne yazık ki Android 5.0 ve 5.1 desteğini bırakan birkaç kitaplığa bağlıdır. Üzücü ki sıradaki NewPipe sürümü yalnızca Android 6 ve üstü aygıtlarda çalışacaktır. Daha çoğunu blog gönderisinde okuyun. Blog gönderisi + Podcastler + Dersler diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5d5804fd4..0ce46dfa3 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -853,4 +853,6 @@ NewPipe 正放弃对 Android 5 的支持 NewPipe 依赖几个已经不支持 Android 5 和 5.1 的库文件。下个 NewPipe 版本因此会只在 Android 6 或更高版本上工作。阅读博客文章了解更多信息。 博客文章 + 播客 + 课程 diff --git a/fastlane/metadata/android/ja/changelogs/1015.txt b/fastlane/metadata/android/ja/changelogs/1015.txt new file mode 100644 index 000000000..a86ad1632 --- /dev/null +++ b/fastlane/metadata/android/ja/changelogs/1015.txt @@ -0,0 +1 @@ +これは、media.ccc.deのライブ配信を修正するホットフィックスリリースです。Happy Hacking! diff --git a/fastlane/metadata/android/ko/changelogs/1015.txt b/fastlane/metadata/android/ko/changelogs/1015.txt new file mode 100644 index 000000000..ceb383692 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/1015.txt @@ -0,0 +1 @@ +media.ccc.de의 실시간 스트림 관련 오류를 수정한 핫픽스 릴리스입니다. 즐거운 해킹 되세요! From f2a3530a24886ba45e6e950676360540055ff73e Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 22 Aug 2026 15:47:08 +0800 Subject: [PATCH 030/155] Update Gradle and dependencies to latest stable release Signed-off-by: Aayush Gupta --- gradle/libs.versions.toml | 24 +++++++++++------------ gradle/wrapper/gradle-wrapper.jar | Bin 48462 -> 47505 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f518b3ae..682dacdc3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,39 +4,39 @@ # [versions] -about-libraries = "15.0.3" +about-libraries = "15.1.1" acra = "5.13.1" activity = "1.13.0" -agp = "9.2.1" -appcompat = "1.7.1" +agp = "9.3.1" +appcompat = "1.8.0" assertj = "3.27.7" autoservice-google = "1.1.1" autoservice-zacsweers = "1.2.0" bridge = "v2.0.2" browser = "1.10.0" cardview = "1.0.0" -checkstyle = "13.8.0" +checkstyle = "14.0.0" coil = "3.5.0" -compose = "1.11.4" -constraintlayout = "2.2.1" +compose = "1.12.0" +constraintlayout = "2.2.2" core = "1.19.0" coroutines = "1.11.0" desugar = "2.1.5" documentfile = "1.1.0" espresso = "3.7.0" exoplayer = "2.19.1" -fragment = "1.8.9" +fragment = "1.9.0" groupie = "2.10.1" -jsoup = "1.22.2" +jsoup = "1.23.1" junit = "4.13.2" junit-ext = "1.3.0" kermit = "2.1.0" koin = "4.2.2" -koin-plugin = "1.0.2" +koin-plugin = "1.1.0" kotlin = "2.4.10" kotlinx-coroutines-rx3 = "1.11.0" kotlinx-serialization-json = "1.11.0" -ksp = "2.3.9" +ksp = "2.3.11" ktlint = "1.8.0" leakcanary = "2.14" lifecycle = "2.11.0" @@ -48,7 +48,7 @@ media = "1.7.1" mockitoCore = "5.23.0" multiplatform = "1.11.1" navigation3 = "1.1.1" -okhttp = "5.4.0" +okhttp = "5.5.0" phoenix = "3.0.0" preference = "1.2.1" prettytime = "5.0.8.Final" @@ -59,7 +59,7 @@ rxandroid = "3.0.2" rxbinding = "4.0.0" rxjava = "3.1.12" settings = "1.3.0" -sonarqube = "7.3.1.8318" +sonarqube = "7.4.0.8496" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" swiperefreshlayout = "1.2.0" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index b1b8ef56b44f16b14dc800fa8103a6d89abb526f..eddabd2eef8d94a5437d6168ff9c87a78ff725b3 100644 GIT binary patch delta 39079 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

=brW3s8Tj~OAF81ZqZ-H*%#PvF5vG> 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dbe66e1d6..760c45969 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=9c0f7faeeb306cb14e4279a3e084ca6b596894089a0638e68a07c945a32c9e14 -distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip +distributionSha256Sum=acd53f1edaf02f1a8ff99879f8a34b302661a057d9b063ae9e35b552f804d20a +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip networkTimeout=10000 retries=0 retryBackOffMs=500 From e07dd4808a7c0a67fa5e4354efa77abfd30fe2c1 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 22 Aug 2026 15:58:54 +0800 Subject: [PATCH 031/155] Drop non-required compiler flag for backing fields Signed-off-by: Aayush Gupta --- shared/build.gradle.kts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 6c1ffe490..3fb1ff097 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -37,8 +37,7 @@ kotlin { compilerOptions { freeCompilerArgs.addAll( - "-Xexpect-actual-classes", - "-Xexplicit-backing-fields" + "-Xexpect-actual-classes" ) optIn.addAll( "androidx.compose.material3.ExperimentalMaterial3Api", From 978ba91294568bdcf82bc01ba41c0d32cdf9923f Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Sat, 22 Aug 2026 16:11:29 +0800 Subject: [PATCH 032/155] Revert checkstyle back to 13.8.0 Signed-off-by: Aayush Gupta --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 682dacdc3..c45292b27 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ autoservice-zacsweers = "1.2.0" bridge = "v2.0.2" browser = "1.10.0" cardview = "1.0.0" -checkstyle = "14.0.0" +checkstyle = "13.8.0" # See https://github.com/checkstyle/checkstyle/issues/21175 coil = "3.5.0" compose = "1.12.0" constraintlayout = "2.2.2" From 906bd08681cab39031d996ddb6afcf12ef49db0a Mon Sep 17 00:00:00 2001 From: "Ashley (holtowd)" Date: Sat, 22 Aug 2026 18:23:32 +0300 Subject: [PATCH 033/155] Add brotli support to downloader --- app/build.gradle.kts | 2 +- app/src/main/java/org/schabi/newpipe/DownloaderImpl.java | 6 ++++++ gradle/libs.versions.toml | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 74e8ebd68..9f5d4038f 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -144,7 +144,6 @@ ksp { arg("room.schemaLocation", "$projectDir/schemas") } - // Custom dependency configuration for ktlint val ktlint by configurations.creating @@ -268,6 +267,7 @@ dependencies { // HTTP client implementation(libs.squareup.okhttp) + implementation(libs.squareup.okhttp.brotli) // Media player implementation(libs.google.exoplayer.core) diff --git a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java index 74a2cab51..5971f03b8 100644 --- a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java +++ b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java @@ -23,9 +23,12 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.Stream; +import okhttp3.CompressionInterceptor; +import okhttp3.Gzip; import okhttp3.OkHttpClient; import okhttp3.RequestBody; import okhttp3.ResponseBody; +import okhttp3.brotli.Brotli; public final class DownloaderImpl extends Downloader { public static final String USER_AGENT = @@ -44,6 +47,9 @@ public final class DownloaderImpl extends Downloader { .readTimeout(30, TimeUnit.SECONDS) // .cache(new Cache(new File(context.getExternalCacheDir(), "okhttp"), // 16 * 1024 * 1024)) + .addInterceptor(new CompressionInterceptor( + Brotli.INSTANCE, + Gzip.INSTANCE)) .build(); this.mCookies = new HashMap<>(); } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c45292b27..88375e77d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -168,6 +168,7 @@ squareup-leakcanary-core = { module = "com.squareup.leakcanary:leakcanary-androi squareup-leakcanary-plumber = { module = "com.squareup.leakcanary:plumber-android", version.ref = "leakcanary" } squareup-leakcanary-watcher = { module = "com.squareup.leakcanary:leakcanary-object-watcher-android", version.ref = "leakcanary" } squareup-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } +squareup-okhttp-brotli = { module = "com.squareup.okhttp3:okhttp-brotli", version.ref = "okhttp" } touchlab-kermit = { module = "co.touchlab:kermit", version.ref = "kermit" } zacsweers-autoservice-compiler = { module = "dev.zacsweers.autoservice:auto-service-ksp", version.ref = "autoservice-zacsweers" } From 5779af87f89f759cfa1a442b3d679b29bb619abc Mon Sep 17 00:00:00 2001 From: Tobi Date: Sat, 25 Jul 2026 11:02:33 +0200 Subject: [PATCH 034/155] Update PR template to encourage users to explain their testing/QA procedure --- .github/PULL_REQUEST_TEMPLATE.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 257b28ffc..bc1033a82 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -24,8 +24,16 @@ #### Relies on the following changes - +#### Testing/QA -#### APK testing +##### Devices +- tested on device/emulator(phone/tablet/TV/...) running Android XX / API level by doing ... + +##### Steps for testing + +- + +##### APK for testing The APK can be found by going to the "Checks" tab below the title. On the left pane, click on "CI", scroll down to "artifacts" and click "app" to download the zip file which contains the debug APK of this PR. You can find more info and a video demonstration [on this wiki page](https://github.com/TeamNewPipe/NewPipe/wiki/Download-APK-for-PR). From b4003d641e69df4802597f686b387d044ddbafc6 Mon Sep 17 00:00:00 2001 From: AudricV <74829229+AudricV@users.noreply.github.com> Date: Sat, 29 Aug 2026 14:39:31 +0200 Subject: [PATCH 035/155] [YouTube] Update NewPipeExtractor and adapt to removals --- .../datasource/YoutubeHttpDataSource.java | 18 ++---------------- .../util/potoken/PoTokenProviderImpl.kt | 6 ------ gradle/libs.versions.toml | 2 +- 3 files changed, 3 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java b/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java index 25f92df3f..82f7bb161 100644 --- a/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/datasource/YoutubeHttpDataSource.java @@ -12,14 +12,9 @@ import static com.google.android.exoplayer2.upstream.DefaultHttpDataSource.DEFAU import static com.google.android.exoplayer2.upstream.HttpUtil.buildRangeRequestHeader; import static com.google.android.exoplayer2.util.Assertions.checkNotNull; import static com.google.android.exoplayer2.util.Util.castNonNull; -import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getAndroidUserAgent; -import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getIosUserAgent; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.getVisionOsUserAgent; -import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isAndroidStreamingUrl; -import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isIosStreamingUrl; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isVisionOsStreamingUrl; import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isWebStreamingUrl; -import static org.schabi.newpipe.extractor.services.youtube.YoutubeParsingHelper.isWebEmbeddedPlayerStreamingUrl; import static java.lang.Math.min; import android.net.Uri; @@ -661,8 +656,7 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD } } - if (isWebStreamingUrl(requestUrl) - || isWebEmbeddedPlayerStreamingUrl(requestUrl)) { + if (isWebStreamingUrl(requestUrl)) { httpURLConnection.setRequestProperty(HttpHeaders.ORIGIN, YOUTUBE_BASE_URL); httpURLConnection.setRequestProperty(HttpHeaders.REFERER, YOUTUBE_BASE_URL); httpURLConnection.setRequestProperty(HttpHeaders.SEC_FETCH_DEST, "empty"); @@ -672,15 +666,7 @@ public final class YoutubeHttpDataSource extends BaseDataSource implements HttpD httpURLConnection.setRequestProperty(HttpHeaders.TE, "trailers"); - if (isAndroidStreamingUrl(requestUrl)) { - // Improvement which may be done: find the content country used to request YouTube - // contents to add it in the user agent instead of using the default - httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, - getAndroidUserAgent(null)); - } else if (isIosStreamingUrl(requestUrl)) { - httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, - getIosUserAgent(null)); - } else if (isVisionOsStreamingUrl(requestUrl)) { + if (isVisionOsStreamingUrl(requestUrl)) { httpURLConnection.setRequestProperty(HttpHeaders.USER_AGENT, getVisionOsUserAgent(null)); } else { diff --git a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt index 53ae04a3c..d8be7b469 100644 --- a/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt +++ b/app/src/main/java/org/schabi/newpipe/util/potoken/PoTokenProviderImpl.kt @@ -123,10 +123,4 @@ object PoTokenProviderImpl : PoTokenProvider { return PoTokenResult(visitorData, playerPot, streamingPot) } - - override fun getWebEmbedClientPoToken(videoId: String): PoTokenResult? = null - - override fun getAndroidClientPoToken(videoId: String): PoTokenResult? = null - - override fun getIosClientPoToken(videoId: String): PoTokenResult? = null } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 88375e77d..308e3b494 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "01fdde08af40f39f5736c921303218209bc9c13e" +teamnewpipe-newpipe-extractor = "13a655fe53e0c3065f88725fc1fb594c3ede0169" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" From bbbac9b223f21a1a5a714044353cf0412de57b98 Mon Sep 17 00:00:00 2001 From: Tobi Date: Mon, 31 Aug 2026 01:00:08 -0700 Subject: [PATCH 036/155] Make using the PR template mandatory in the contribution guidelines People using AI generated PR descriptions are getting on my nerves. AI generated PR descriptions often lack critical information as described in the AI policy. --- .github/CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 0294a72c7..c97e37cdd 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -59,6 +59,7 @@ You'll see *exactly* what is sent, be able to add **your comments**, and then se * Make changes on a **separate branch** with a meaningful name, not on the _master_ branch or the _dev_ branch. This is commonly known as *feature branch workflow*. You may then send your changes as a pull request (PR) on GitHub against the `dev` branch. * Please **test** (compile and run) your code before submitting changes! Ideally, provide test feedback in the PR description. Untested code will **not** be merged! +* Filling in the **PR template** is mandatory. Ignoring the template or removing it can get your PR closed without further explanation. * Respond if someone requests changes or otherwise raises issues about your PRs. * Try to figure out yourself why builds on our CI fail. * Make sure your PR is **up-to-date** with the rest of the code. Often, a simple click on "Update branch" will do the job, but if not, you must *rebase* your branch on the `dev` branch manually and resolve the conflicts on your own. You can find help [on the wiki](https://github.com/TeamNewPipe/NewPipe/wiki/How-to-merge-a-PR). Doing this makes the maintainers' job way easier. From 219841da4068e9e0e50ec8e5e37d30956484cb19 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 16 Sep 2026 22:12:51 +0200 Subject: [PATCH 037/155] Translated using Weblate (Ukrainian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Thai) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Thai) Currently translated at 40.4% (315 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Latin) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.5% (759 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.5% (759 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Latvian) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Romanian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 99.6% (775 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Romanian) Currently translated at 99.8% (775 of 776 strings) Co-authored-by: Agnieszka C Co-authored-by: Anucha Hlownonkor Co-authored-by: Aster Co-authored-by: BennyBeat Co-authored-by: Femini Co-authored-by: Fjuro Co-authored-by: Ghost of Sparta Co-authored-by: Graweeld - (grwd) Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Igor Sorocean Co-authored-by: Ihor Hordiichuk Co-authored-by: Jeff Huang Co-authored-by: Joel A Co-authored-by: Laur Co-authored-by: Laur Ioniță Co-authored-by: Mickaël Binos Co-authored-by: Oğuz Ersen Co-authored-by: Priit Jõerüüt Co-authored-by: Random Co-authored-by: Trunars Co-authored-by: Username9510 Co-authored-by: Valer Co-authored-by: VfBFan Co-authored-by: Yauhen Co-authored-by: cat Co-authored-by: delvani Co-authored-by: isopod-a Co-authored-by: justcontributor Co-authored-by: ojppe Co-authored-by: rehork Co-authored-by: vityatii Co-authored-by: Міхаіл Каралевіч Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/be/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/hu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ja/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/la/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/lv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/th/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/uk/ Translation: NewPipe/Metadata --- app/src/main/res/values-az/strings.xml | 2 + app/src/main/res/values-be/strings.xml | 16 ++-- app/src/main/res/values-ca/strings.xml | 2 + app/src/main/res/values-da/strings.xml | 6 +- app/src/main/res/values-it/strings.xml | 2 + app/src/main/res/values-la/strings.xml | 68 +++++++++++----- app/src/main/res/values-lv/strings.xml | 79 ++++++++++--------- app/src/main/res/values-pt-rBR/strings.xml | 2 + app/src/main/res/values-ro/strings.xml | 8 +- app/src/main/res/values-ru/strings.xml | 8 +- app/src/main/res/values-sv/strings.xml | 28 ++++--- app/src/main/res/values-th/strings.xml | 53 +++++++++---- app/src/main/res/values-uk/strings.xml | 8 +- app/src/main/res/values-zh-rTW/strings.xml | 2 + .../metadata/android/be/changelogs/1015.txt | 1 + .../metadata/android/hu/changelogs/1015.txt | 1 + .../metadata/android/la/changelogs/1015.txt | 1 + .../metadata/android/la/full_description.txt | 1 + .../metadata/android/la/short_description.txt | 1 + .../metadata/android/lv/changelogs/1015.txt | 1 + .../metadata/android/pl/changelogs/1015.txt | 1 + .../metadata/android/sv/changelogs/1015.txt | 1 + .../metadata/android/th/changelogs/1015.txt | 1 + .../metadata/android/uk/changelogs/1015.txt | 1 + 24 files changed, 189 insertions(+), 105 deletions(-) create mode 100644 fastlane/metadata/android/be/changelogs/1015.txt create mode 100644 fastlane/metadata/android/hu/changelogs/1015.txt create mode 100644 fastlane/metadata/android/la/changelogs/1015.txt create mode 100644 fastlane/metadata/android/la/full_description.txt create mode 100644 fastlane/metadata/android/la/short_description.txt create mode 100644 fastlane/metadata/android/lv/changelogs/1015.txt create mode 100644 fastlane/metadata/android/pl/changelogs/1015.txt create mode 100644 fastlane/metadata/android/sv/changelogs/1015.txt create mode 100644 fastlane/metadata/android/th/changelogs/1015.txt create mode 100644 fastlane/metadata/android/uk/changelogs/1015.txt diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 0ec795192..facad7f10 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -848,4 +848,6 @@ NewPipe Android 5 üçün dəstəyi dayandırır Bloq elanı Təəssüf ki, NewPipe Android 5.0 və 5.1 üçün dəstəyi dayandıran bir neçə kitabxanadan asılıdır. Bu səbəbdən, üzücü olaraq növbəti NewPipe buraxılışı yalnız Android 6 və ya daha yüksək versiyalı cihazlarda işləyəcək. Daha çoxunu blog elanında oxu. + Podkastlar + Kurslar diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index d435d7a32..dd19b5c6e 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -207,17 +207,17 @@ Літары і лічбы Большасць спецсімвалаў Пра NewPipe - Іншыя ліцэнзіі + Староннія ліцэнзіі © %1$s %2$s пад ліцэнзіяй %3$s Аб праграме Ліцэнзіі - Свабоднае легкавагавае патокавае прайграванне на Android. + Легкавагавая праграма з адкрытым зыходным кодам для патокавага прайгравання на Android. Дапамога праекту Вітаецца ўсё - ідэі, пераклад, змены дызайну, чыстка кода або велізарныя змены ў кодзе. Чым больш зроблена, тым лепш! - Адкрыць на GitHub + Старонка на GitHub Ахвяраванне - NewPipe распрацаваны добраахвотнікамі, якія праводзяць свой вольны час, забяспечваючы лепшы карыстацкі досвед. Дапамажыце распрацоўшчыкам зрабіць NewPipe яшчэ лепшым, пакуль яны атрымліваюць асалоду ад кавы. - Ахвяраваць грошы + NewPipe распрацаваны валанцёрамі, якія прысвячаюць свой вольны час, каб паляпшаць для вас праграму. Зрабіце і вы для іх добрае, хай распрацоўшчыкі пацешаць сябе кубачкам кавы пакуль працуюць над NewPipe. + Падтрымаць грашыма Вэб-сайт Наведайце вэб-сайт, каб атрымаць больш інфармацыі і паглядзець апошнія навіны NewPipe. Палітыка прыватнасці NewPipe @@ -435,7 +435,7 @@ Плэй-лісты яшчэ не дададзены Выберыце плэй-ліст Прадвызначаны кіёск - Так + Гатова Па завяршэнні націсніце «Гатова» ∞ відэа 100+ відэа @@ -802,7 +802,7 @@ NewPipe можа час ад часу аўтаматычна правяраць наяўнасць новай версіі і апавяшчаць, калі яна будзе даступна. \nУключыць гэту функцыю? Налады ў імпартаваным экспарце выкарыстоўваюць уразлівы фармат, які састарэў з версіі NewPipe 0.27.0. Пераканайцеся, што імпартаваны экспарт атрыманы з надзейнай крыніцы, і ў будучыні пераважней выкарыстоўваць толькі экспарт, атрыманы з NewPipe 0.27.0 ці навей. Падтрымка імпарту налад у гэтым уразлівым фармаце хутка будзе цалкам выдаленая, і тады старыя версіі NewPipe больш не змогуць імпартаваць наладкі з экспарту з новых версій. Не - Рэзервовае капіяванне і аднаўленне + Рэзервовыя копіі і аднаўленне Скінуць налады Скінуць усе налады на іх прадвызначаныя значэнні Пры скіданні ўсіх налад будуць адхілены ўсе вашы змены налад і праграма перазапусціцца. \n \nСапраўды хочаце працягнуць? @@ -866,4 +866,6 @@ На жаль, NewPipe залежыць ад некалькіх бібліятэк, якія спынілі падтрымку Android 5.0 і 5.1. Таму наступны выпуск NewPipe, будзе працаваць толькі на прыладах з Android 6 і вышэй. Падрабязнасці можна прачытаць ў блогу. Запіс у блогу %1$s адмовіўся перадаць даныя, запытаўшы ўваход у сістэму для пацвярджэння, што вы не бот.\n\nМагчыма, ваш IP-адрас быў часова заблакіраваны %1$s. Можна пачакаць некаторы час або перайсці на іншы IP-адрас (напрыклад, уключыўшы/выключыўшы VPN або пераключыўшыся з Wi-Fi на мабільныя даныя).\n\nПаглядзіце гэты раздзел FAQ, каб атрымаць дадатковую інфармацыю. + Падкасты + Курсы diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 3fc8c49e7..fbec5e5e9 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -871,4 +871,6 @@ A l\'agost del 2025, Google va anunciar que, a partir del setembre del 2026, la instal·lació d\'aplicacions requerirà la verificació del desenvolupador per a totes les aplicacions d\'Android en dispositius certificats, incloses les instal·lades fora de la Play Store. Com que els desenvolupadors de NewPipe no estan d\'acord amb aquest requisit, NewPipe deixarà de funcionar en dispositius Android certificats després d\'aquesta data. NewPipe deixarà de ser compatible amb Android 5. Malauradament, NewPipe depèn d\'algunes biblioteques que van deixar de ser compatibles amb Android 5.0 i 5.1. Per tant, la propera versió de NewPipe només funcionarà en dispositius amb Android 6 o superior. Llegeix més a la publicació del bloc. + pòdcasts + Cursos diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 7b14885e7..66042bcd4 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -522,7 +522,7 @@ gendanner \"Hurtig feed\"-tilstand oplyser ikke mere info om dette. Tjek efter opdateringer - Fjern sete videoer? + Fjern sete streams? Deaktivér medietunneling, hvis du oplever en sort skærm eller hakken ved videoafspilning. Tjek venligst, om der allerede findes et problem, der diskuterer dit nedbrud. Når du opretter flere tickets, tager du tid fra os, som vi kunne bruge på at løse den faktiske fejl. Tjek efter nye streams @@ -540,7 +540,7 @@ Vælg abonnementer Dette indhold er ikke tilgængeligt i dit land. Af %s - Videoer, der er blevet set før og efter tilføjelse til playlisten, vil blive fjernet. \nEr du sikker? Dette kan ikke fortrydes! + Streams, der er blevet set før og efter tilføjelse til playlisten, vil blive fjernet. \nEr du sikker? Vis miniaturebillede Tags Aldersbegrænsning @@ -838,4 +838,6 @@ YouTube har udfaset den kombinerede trending-side pr. 21. juli 2025. NewPipe har erstattet standardsiden for trending med trending livestreams.\n\nDu kan også vælge andre trending-sider under \"Indstillinger > Indhold > Indhold på hovedsiden\". Gaming-trends Trending podcasts + Podcasts + Kurser diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 26e865cd7..0767320bc 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -887,4 +887,6 @@ NewPipe sta abbandonando il supporto per Android 5 Purtroppo NewPipe dipende da alcune librerie che hanno abbandonato il supporto per Android 5.0 e 5.1. La prossima versione di NewPipe funzionerà solo su dispositivi con Android 6 o superiore, purtroppo. Maggiori info nel post del blog. Post del blog + Podcast + Corsi diff --git a/app/src/main/res/values-la/strings.xml b/app/src/main/res/values-la/strings.xml index 8d9506be5..7e296a5f0 100644 --- a/app/src/main/res/values-la/strings.xml +++ b/app/src/main/res/values-la/strings.xml @@ -31,25 +31,25 @@ Inscribe Scriptum Scribe - Nullus amnem amnibus invenit (potes instituere VLC quia id ludere). - Nullus amnem amnibus invenit. Instalar VLC\? - Scarica amnem file - Utere ludionem externum - Removes sentum aliquas resolutionibus - Utere lectorem externum - Condividi apud + Nullus lusor amnium invenit (VLC collocare potes ut eum ludat). + Nullus lusor amnium invenit. VLC collocare? + Tabularium amnicum scaricare + Utere lusorem soni externum + Sonum aliquis resolutionibus removet + Utere lusorem taeniae externum + Communicare cum Praecessi propter: %s Intendi \"%1$s\"\? - Optiones - Tange \"Quaere\" ad initium + Adaptabilitates + Tange \"Quaere\" ad initium. Quaerere - Scarica - Condividi - Aperi apud - Aperi in popup mode - Aperi in navigatro - Inrita - instituere + Scaricare + Distribuere + Aperire cum + In modo popup aperire + In quaerente aperire + Rescindere + Collocare Edita %1$s Initio Pausa @@ -64,7 +64,7 @@ Nulli signatores Nullae resultationes - Apparentia + Facies Mos NewPipe notitia @@ -81,7 +81,7 @@ Localis Novi popularesque Renomina - Dona + Donare Dimitte Namquam Capitulum @@ -93,7 +93,7 @@ %d secundus %d secundi - Factum + Finitus Quaere semper Index Nullus limus @@ -125,4 +125,34 @@ Non Quaere %1$s Quaere %1$s (%2$s) + Contentum + Nuntius + Video et audio + Obtinere + Historia et horreum breve + Res recenter divulgatae + Servare et restituere + Errores reperire et amovere + De NewPipe + Licentiae tertianae + De & FAQ + Licetiae + Picturae commotae liberiter et leviter accipere. + Conferre + Aut sententias habes de; interpretationibus, commutationibus designationis, purgatio verbarum, aut commutationibus gravibus verbarum—auxilium semper desideratum est. Quo plus factus est, eo melior fit! + Aspicere in GitHub + NewPipe voluntariis, qui donant tempus liber eius te dare visum optimum, elaboratus est. Redde, ut elaboratores NewPipe emendare dum pocillum coffeum potant auxilies. + Reddere + Situs interretialis + Visita situs interretialis NewPipe pro plure informationum et novitatibus. + Politia rerum privatarum NewPipe + Politia rerum privatarum legere + Licentia NewPipe + NewPipe partes programmationis libera et copiantes sinistrorsum sunt: Consumere, studere, distribuere, emendare tibi licet. Imprimis redistribuere et/aut mutare, contitione GNU General Public License quomodo divulgatus a Free Software Foundation, aut versio 3 aut posterior versio, tibi licet. + Licentia legere + Interrogationes saepe interrogatas + Si difficultates usum adhibere habes, aspice ea responsa ad interrogationes crebras! + Aspicere in situ interretiale + Recte est + Aspectum signare diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 26c3786d5..e38483b97 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -16,13 +16,13 @@ Atvērt fona atskaņotājā Sākt atskaņot ar popup Klausīties fonā šo - Ielikts rindā - Ielikt rindā - Turiet, lai ieliktu atskaņošanas rindā + Pievienots atskaņošanas rindai + Pievienot atskaņošanas rindai + Nospiediet, lai pievienotu atskaņošanas rindai Audio iestatījumi Detalizēta informācija Noņemt - Atskaņošanas saraksts + Atskaņošanas rinda Konferences Nesen pievienots Lokāls @@ -34,7 +34,7 @@ Uzmanību: Ne visas datnes varēja ievietot. Nederīga ZIP datne Ievietošana pabeigta - Eksportēts + Izgūšana pabeigta Atlasiet kiosku Pagaidām nav izveidots vai saglabāts neviens atskaņošanas saraksts Atlasiet atskaņošanas sarakstu @@ -46,7 +46,7 @@ Tukša lapa Kādas cilnes rādīt galvenajā lapā Galvenā lapa - Visvairāk Atskaņotais + Visvairāk atskaņotie Pēdējais atskaņotais Vai tiešām vēlaties izdzēst šo vaicājumu no meklēšanas vēstures? Vēsture @@ -200,16 +200,16 @@ Vai tiešām vēlaties dzēst visas atskaņošanas pozīcijas? Izdzēš visas atskaņošanas pozīcijas Notīrīt atskaņošanas pozīcijas - Skatīšanās vēsture dzēsta - Vai tiešām vēlaties dzēst visu skatīšanās vēsturi? + Atskaņošanas vēsture dzēsta + Vai tiešām vēlaties dzēst visu atskaņošanas vēsturi? Izdzēš atskaņoto video / audio un atskaņošanas pozīciju vēsturi - Notīrīt skatīšanās vēsturi + Notīrīt atskaņošanas vēsturi Izdzēš sīkdatnes, kuras NewPipe uzglabā, kad jūs atrisiniet reCAPTCHA - Eksportēt vēsturi, abonementus, atskaņošanas sarakstus un iestatījumus - Aizstās jūsu pašreizējo vēsturi, abonementus, atskaņošanas sarakstus un (pēc izvēles) iestatījumus + Veic skatīšanās/klausīšanās vēstures, abonementu, atskaņošanas sarakstu un iestatījumu rezerves kopijas izveidi + Aizstās jūsu pašreizējo skatīšanās/klausīšanās vēsturi, abonementus, atskaņošanas sarakstus un (pēc izvēles) iestatījumus reCAPTCHA sīkdatnes dzēstas Notīrīt reCAPTCHA sīkdatnes - Eksportēt datubāzi + Izgūt datubāzi Ievietot datubāzi Pārslēgt uz Galveno Pārslēgt uz Popup @@ -228,7 +228,7 @@ Labākā izšķirtspēja Notīrīt Atspējots - Mākslinieki + Izpildītāji Albumi Dziesmas Pasākumi @@ -302,7 +302,7 @@ Nav ielādēts: %d Atjaunināta: %s Abonementu grupas - Kas jauns + Abonementu grupas jaunumi %d dienas %d dienu @@ -324,21 +324,20 @@ %d sekundes ExoPlayer ierobežojumu dēļ tīšanas solis tika iestatīts uz %d sekundēm - Jā, un daļēji skatītos un klausītos + Jā, un daļēji atskaņotos Tiešraides, kas iepriekš noskatītas un pēc tam pievienotas atskaņošanas sarakstam, tiks noņemtas. \nVai tiešām vēlaties turpināt? Vai tiešām vēlaties noņemt skatītās tiešraides? Noņemt skatīto - System default + Sistēmas iestatīto Lietotnes valoda Izvēlieties instanci Izmantot sistēmas mapes izvēlni “Krātuves Piekļuves Sistēma” ļauj lejupielādēt ārējā SD kartē - Jums tiks jautāts, kur saglabāt katru lejupielādi. -\nIeslēdziet sistēmas mapes izvēlni, ja vēlaties lejupielādēt uz ārējo SD karti + Jums tiks jautāts, kur saglabāt katru lejupielādi.\nIespējojiet sistēmas mapju atlasītāju (SAF), ja vēlaties lejupielādēt uz ārējo SD karti Jautājiet, kur lejupielādēt Pauzēt lejupielādes Sākt lejupielādes - Viena lejupielāde notiks vienlaikus + Vienlaikus tiks veikta viena lejupielāde Ierobežot lejupielāžu rindu Aizvērt Noderīgi, pārejot uz mobilajiem datiem, lai gan dažas lejupielādes nevar apturēt @@ -374,7 +373,7 @@ Darbību noraidīja sistēma atkopjas pēcapstrāde - ielikts rindā + pievienots rindai Saraksta skata režīms Sākt atskaņošanu automātiski — %s Darbība, pārslēdzoties uz citu lietotni no galvenā video atskaņotāja — %s @@ -386,7 +385,7 @@ Aizvērt Atvilkni Atvērt Atvilkni Vispopulārākais - jūsuID , soundcloud.com/jūsuID + jūsuID, soundcloud.com/jūsuID Lai ievietotu SoundCloud profilu, ievadiet tā URL vai ID:\n\n1. Pārlūkā iestatiet \"Darbvirsmas režīms\" (vietne nav pieejama mobilajām ierīcēm) \n2. Dodieties uz šo URL adresi: %1$s\n3. Ja nepieciešams, autorizējieties\n4. Nokopējiet profila URL adreses joslā. Ievietot YouTube abonementus no Google Takeout:\n\n1. Dodieties uz šo vietni: %1$s\n2. Autorizējieties, ja nepieciešams\n3. Noklikšķiniet uz \"Visi dati iekļauti\", pēc tam uz \"Atcelt visu atlasi\", pēc tam atlasiet tikai \"Abonementi\" un noklikšķiniet uz \"Labi\"\n4. Noklikšķiniet uz \"Nākamais solis\" un pēc tam uz \"Izveidot eksportu\"\n5. Pēc tam, kad tā parādās, noklikšķiniet uz pogas \"Lejupielādēt\"\n6. Noklikšķiniet IEVIETOT DATNI zemāk un izvēlaties lejupielādēto .zip failu\n7. [Ja .zip failu neizdodas ievietot] Izvelciet .csv failu (parasti zem \"YouTube un YouTube Music/subscriptions/subscriptions.csv\") no arhīva, tad noklikšķiniet uz IEVIETOT DATNI zemāk un atlasiet tikko izvilkto csv failu Noklusējuma darbība, kad atver kopīgoto saiti — %s @@ -406,8 +405,8 @@ Tendences © %1$s no %2$s zem %3$s Lejupielāde neizdevās - Pievienot rindai - Pausēts + Pievienot lejupielādes rindai + pauzēts Gaida Pabeigts Pieejama jauna NewPipe versija! @@ -430,13 +429,13 @@ Tonis Temps Atskaņošanas Ātruma Kontrole - Nevarēja eksportēt abonementus - Nevarēja importēt abonementus - Pagājušais eksports - Importēt failu - Eksportē… + Nevarēja izgūt abonementus + Nevarēja ievietot abonementus + Iepriekšējā izgūšana + Ievietot datni + Izgūst… Ievieto… - Eksportēt uz + Izgūt uz Ievietot no Ievietot Rādīt oriģinālo laiku uz lietām @@ -456,7 +455,7 @@ Lejupielādēt Turpina atskaņot video pēc pārtraukumiem (piemēram, telefona zvana) Turpināt atskaņošanu - Uzglabā skatīto video vēsturi + Uzglabā skatīto video atskaņošanas vēsturi Notīrīt datus Rāda atskaņošanas pozīcijas indikatoru sarakstos Atskaņošanas pozīcija sarakstos @@ -468,7 +467,7 @@ Atlasīt, kādus ieteikumus rādīt, ievadot vaicājumu meklēšanas joslā Meklēšanas ieteikumi Automātiski pievienot - Pievieno līdzīgus video atskaņošanas rindai, kad atskaņo pēdējo video, ja vien nav iespējota atkārtotā, malt uz riņķi, atskaņošana + Pievieno līdzīgus video atskaņošanas rindai, kad atskaņo pēdējo video atskaņošanas rindā, ja vien nav iespējota atkārtotā, malt uz riņķi, atskaņošana Automātiski pievienot nākamo video Metadatu kešatmiņa notīrīta Izdzēš visus kešatmiņā glabātos vietnes datus @@ -584,8 +583,8 @@ Nerādīt Konts ir pārtraukts Komentāri ir atspējoti - Ielikt rindā nākošo - Ielikts rindā nākošais + Pievienot kā nākamo atskaņošanas rindai + Pievienots kā nākamais atskaņošanas vienums Sākt video atskaņotāju pilnekrāna režīmā Nesākt video atskaņošanu samazinātā režīmā, bet pilnekrāna režīmā, ja automātiskā rotācija ir izslēgta Izslēgt multivides tuneļošanu @@ -612,7 +611,7 @@ Zemas kvalitātes (mazāks) Privātums Sarakstā neiekļauts - Uzņēmums + Izmitināšanas serveris Servera meklēšanas ieteikumus Atzīmēt kā noskatītu Apstrādā... Var aizņemt kādu laiku @@ -660,7 +659,7 @@ Atskaņos skaņas celiņu ar audio aprakstiem vājredzīgajiem, ja tāds ir pieejams Ignorēt pieslēgtās ierīces multimēdiju pogas Vai tiešām vēlaties dzēst visas lejupielādētās datnes? - Jaunumi kanālā + Iegūti jauni vienumi Dot priekšroku oriģinālajai skaņai Atskaņos oriģinālo skaņas celiņu neatkarīgi no iestatītās valodas Dot priekšroku skaņu celiņam ar audio aprakstu @@ -694,11 +693,11 @@ Mainīt progresīvā satura ielādes intervāla lielumu (pašlaik %s). Mazāka vērtība var paātrināt to sākotnējo ielādi Jā Nē - Rezerves kopēšana un atjaunošana + Rezerves kopijas izveide un atjaunošana Metadatu ielādēšana… Galvenās cilnes pozīcija Nepazīstams formāts - Daļēji skatītos/klausītos + Daļēji atskaņotos Nav video/audio Ierīcē nav pietiekami daudz brīvas vietas Par @@ -721,7 +720,7 @@ , Pārslēgt visus Nepazīstama kvalitāte - Noskatītos/noklausītos + Pilnībā atskaņotos Gaidāmie dublēts aprakstošs @@ -844,10 +843,12 @@ Ievieto %d abonementus… Ievieto abonementus no iepriekšējās .json izgūšanas - Izgūst jūsu abonementus .json datnē + Izgūt savus abonementus .json datnē NewPipe pārtrauc Android 5 atbalstu Diemžēl NewPipe paļaujas uz dažām bibliotēkām, kuras ir pārtraukušas Android 5.0 un 5.1 atbalstu. Tāpēc nākamā NewPipe versija diemžēl darbosies tikai ierīcēs ar Android 6 vai jaunāku versiju. Sīkāka informācija ir pieejama emuāra rakstā. Emuāra raksts Šis saturs nepieejams pašlaik iestatītajai satura valstij.\n\nNomainīt iestatīto satura valsti variet zem \"Iestatījumi > Saturs > Vēlamā satura valsts\". %1$s atteicās sniegt datus un pieprasa pieteikšanos, lai apstiprinātu, ka pieprasītājs nav robots.\n\nIespējams, ka %1$s ir īslaicīgi bloķējis jūsu IP adresi. Variet kādu laiku pagaidīt vai pārslēgties uz citu IP adresi (piemēram, ieslēdzot/izslēdzot VPN vai pārslēdzoties no Wi-Fi uz mobilajiem datiem).\n\nLūdzu, skatiet šo BUJ sadaļu, lai iegūtu vairāk informācijas. + Raidieraksti + Kursi diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 61458845a..6c3a592ec 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -887,4 +887,6 @@ O NewPipe deixará de oferecer suporte ao Android 5 Infelizmente, o NewPipe depende de algumas bibliotecas que deixaram de oferecer suporte para o Android 5.0 e 5.1. Por isso, a próxima versão do NewPipe só funcionará em dispositivos com Android 6 ou superior, infelizmente. Saiba mais na publicação do blog. Postagem no blog + Podcasts + Cursos diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index f85aa1da9..976f68893 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -147,12 +147,12 @@ Litere și cifre Caractere speciale Despre NewPipe - Licențe terți + Licențe terță-parte © %1$s de %2$s sub %3$s Despre & Întrebări Comune Licențe Streaming sursă-liberă pentru Android. - Vezi în GitHub + Vezi pe GitHub Licența a NewPipe Când îți vine idea de; traduceri, schimbări de design, curățare cod sau schimbări reale de cod - Ajutorul este mereu binevenit. Cu cât mai mult, cu cât mai bine! Citește licența @@ -213,7 +213,7 @@ NewPipe este creat de voluntari ce își oferă timpul lor liber pentru ați oferi cea mai bună experiență. Oferă înapoi creatorilor pentru a face aplicația și mai bună. Oferă Înapoi Site Web - Vizitează Site-ul NewPipe pentru mai multe informații și știri. + Vizitează site-ul NewPipe pentru mai multe informații si noutăți. Ultimele vizionări Cele mai multe vizionări Exportat @@ -869,4 +869,6 @@ NewPipe nu va mai fi compatibil cu Android 5 Postare blog Din păcate, NewPipe depinde de câteva biblioteci care nu mai sunt compatibile cu Android 5.0 și 5.1. Prin urmare, următoarea versiune a NewPipe va funcționa doar pe dispozitive cu Android 6 sau o versiune ulterioară. Aflați mai multe în articolul de pe blog. + Podcasturi + Cursuri diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 841114b9d..64e7bcb95 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -130,7 +130,7 @@ Возобновлять воспроизведение после перерывов (например, телефонных звонков) Уведомление NewPipe Уведомления для плеера NewPipe - Загрузки + Скачать Допустимые символы имён файлов Заменяет недопустимые символы> Символ для замены @@ -713,9 +713,9 @@ Выберите качество для внешних плееров Неизвестное качество Размер интервала загрузки при воспроизведении - Ответы на частые вопросы - Если у вас возникли проблемы с использованием приложения, обязательно ознакомьтесь с ответами на распространённые вопросы! - Посмотреть на веб-сайте + Часто задаваемые вопросы + Если у вас есть проблемы с использованием приложения, проверьте ответы на часто задаваемые вопросы! + Посмотреть на сайте Сортировка У вас последняя версия Быстрый режим diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index e2f3b6b56..71a17a583 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -47,7 +47,7 @@ Visa ”Nästa” och ”Liknande videor” URL:en stöds inte Standardinnehållsspråk - Video och ljud + Ljud och bild Utseende Spelar upp i bakgrunden Spelar upp i popup-läge @@ -94,7 +94,7 @@ Visa ett tips när du trycker på knappen för bakgrunds- eller popupuppspelning på videons detaljsida Spelare Beteende - Historik och cacheminne + Historik och cache Ångra Spela alla NewPipe-avisering @@ -196,7 +196,7 @@ Rensa metadatacachen Ingen extern spelare hittades. Du kan installera VLC för att spela upp innehållet. Hämta strömmen - Ungefärlig spolning går snabbare men är mindre exakt. Hopp på 5, 15 eller 25 sekunder fungerar inte när alternativet är aktiverat. + Ungefärlig spolning går snabbare men är mindre exakt. Hopp på 5, 15 eller 25 sekunder fungerar inte när alternativet är aktiverat Ta bort all cachelagrad metadata Metadatacachen har rensats Köa nästa ström automatiskt @@ -315,7 +315,7 @@ Avisering för appuppdatering Aviseringar för nya NewPipe-versioner Extern lagring otillgänglig - Det gick inte att läsa in de sparade flikarna. Standardflikarna används. + Det gick inte att läsa in de sparade flikarna, så standardflikarna används Återställ standardvärden Vill du återställa standardvärdena? Antalet prenumeranter är otillgängligt @@ -532,7 +532,7 @@ Visa metainformation Använd miniatyrbild som bakgrund till både låsskärm och aviseringar Redigera varje aviseringsåtgärd nedan genom att trycka på den. Välj upp till tre av dem som ska visas i den kompakta aviseringen genom att använda kryssrutorna till höger. - Låt Android färglägga varje avisering utifrån miniatyrbildens huvudsakliga färg. Funktionen finns inte på alla enheter. + Låt Android färglägga varje avisering utifrån miniatyrbildens huvudsakliga färg (funktionen finns inte på alla enheter) Färglägg avisering Du kan som mest välja tre åtgärder att visa i den kompakta aviseringen! Lös @@ -564,7 +564,7 @@ Innehållsskaparens konto har avslutats. \nNewPipe kommer inte längre att kunna läsa in flödet. \nVill du avsluta prenumerationen på kanalen? Du kommer att tillfrågas var varje hämtning ska sparas Visa kanaldetaljer - Ingen hämtningsmapp har angetts. Välj en standardmapp för hämtningar. + Ingen hämtningsmapp har angetts än; välj en standardmapp för hämtningar nu Beräknar hash Visa inte Låg kvalitet (mindre) @@ -619,8 +619,8 @@ Visar ett kraschalternativ vid användning av spelaren Aviseringar om felrapporter Aviseringar för rapportering av fel - NewPipe stötte på ett fel. Tryck för att rapportera det. - Ett fel inträffade. Se aviseringen. + NewPipe stötte på ett fel; tryck för att rapportera det + Ett fel inträffade; se aviseringen Visa ett tillfälligt felmeddelande Skapa en felavisering Ingen lämplig filhanterare hittades för åtgärden. \nInstallera en filhanterare eller prova att inaktivera \'%s\' i hämtningsinställningarna @@ -629,7 +629,7 @@ Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer-standard - Ändra storleken på inläsningsintervallet för progressivt innehåll (för närvarande %s). Ett lägre värde kan påskynda den första inläsningen. + Ändra storleken på inläsningsintervallet för progressivt innehåll (för närvarande %s). Ett lägre värde kan påskynda den första inläsningen Uppdateringsintervall Nödvändig nätverksanslutning Alla nätverk @@ -662,7 +662,7 @@ Storlek på inläsningsintervall Välj kvalitet för externa spelare Den valda videoströmmen stöds inte av externa spelare - Läs svaren på vanliga frågor om du har problem med att använda appen. + Om du har problem med att använda appen, läs då svaren på de här vanliga frågorna! Vanliga frågor Visa på webbplatsen Sortera @@ -769,7 +769,7 @@ Redigera aviseringsåtgärderna genom att trycka på dem. De tre första åtgärderna – spela/pausa, föregående och nästa – bestäms av systemet och kan inte ändras. Inte tillräckligt med ledigt utrymme på enheten Nej - Säkerhetskopiering och återställning + Säkerhetskopiera och återställ Ja NewPipe kan automatiskt söka efter nya versioner då och då och meddela dig när de är tillgängliga. \nVill du aktivera det? Återställ inställningar @@ -791,7 +791,7 @@ SoundCloud Topp 50-sida borttagen SoundCloud har lagt ner de ursprungliga topp 50-listorna. Motsvarande flik har tagits bort från din startsida. YouTubes kombinerade trender har tagits bort - YouTube tog bort den kombinerade trendsidan den 21 juli 2025. NewPipe ersatte standardtrendsidan med populära direktsändningar. \nDu kan välja andra trendsidor under ”Inställningar > Innehåll > Innehåll på huvudsidan”. + YouTube tog bort den kombinerade trendsidan den 21 juli 2025. NewPipe ersatte standardtrendsidan med populära direktsändningar.\n\nDu kan välja andra trendsidor under ”Inställningar > Innehåll > Innehåll på huvudsidan”. Speltrender Populära poddar Populära filmer och serier @@ -806,7 +806,7 @@ Servern svarade med HTTP-fel %1$s under uppspelningen Servern svarade med HTTP-fel 403 under uppspelningen, troligen på grund av en IP-blockering eller problem med avobfuskering av strömnings-URL:er %1$s vägrade att lämna ut uppgifter och krävde inloggning för att bekräfta att begäran inte kommer från en robot.\n\nDin IP-adress kan ha blockerats tillfälligt av %1$s. Vänta en stund eller byt IP-adress, till exempel genom att slå av och på en VPN-anslutning eller växla mellan Wi-Fi och mobildata.\n\nLäs avsnittet i vanliga frågor för mer information. - Innehållet är inte tillgängligt i det valda innehållslandet. \nÄndra valet under ”Inställningar > Innehåll > Standardinnehållsland”. + Innehållet är inte tillgängligt i det valda innehållslandet.\n\nÄndra valet under ”Inställningar > Innehåll > Standardinnehållsland”. I augusti 2025 meddelade Google att från och med september 2026 kommer installation av appar att kräva utvecklarverifiering för alla Android-appar på certifierade enheter, inklusive de som installerats utanför Play Store. Eftersom utvecklarna av NewPipe inte godkänner detta krav kommer NewPipe inte längre att fungera på certifierade Android-enheter efter den tiden. Detaljer Lösning @@ -830,4 +830,6 @@ NewPipe upphör med stödet för Android 5 Tyvärr är NewPipe beroende av ett fåtal bibliotek som slutat stödja Android 5.0 och 5.1. Nästa NewPipe-utgåva kommer därför tyvärr bara att fungera på enheter med Android 6 eller senare. Läs mer i blogginlägget. Blogginlägg + Podcasts + Kurser diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index e309b7fc7..5cae007ec 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -6,13 +6,13 @@ ไม่พบแอปที่สามารถสตรีมสื่อวีดีโอได้ (คุณสามารถติดตั้ง VLC เพื่อดูวีดีโอ) ติดตั้ง ยกเลิก - เปิดด้วยเว็บบราวเซอร์ + เปิดในเบราว์เซอร์ เปิดในโหมดป๊อปอัพ แชร์ ดาวน์โหลด ดาวน์โหลดไฟล์สตรีม ค้นหา - การตั้งค่า + ตั้งค่า หรือคุณหมายถึง \"%1$s\"\? แชร์ด้วย ใช้เครื่องเล่นวีดิโอภายนอก @@ -81,9 +81,9 @@ พฤติกรรม วิดีโอและเสียง ประวัติและแคช - ลักษณะ - แก้ข้อบกพร่อง - อัพเดต + รูปร่าง + Debug + อัปเดต กำลังเล่นในโหมดพื้นหลัง กำลังเล่นในโหมดป๊อปอัพ เนื้อหา @@ -198,24 +198,24 @@ ตัวอักษรและตัวเลข อักขระพิเศษส่วนใหญ่ เกี่ยวกับ NewPipe - สัญญาอนุญาตของบุคคลที่สาม + ใบอนุญาตบุคคลที่สาม © %1$s โดย %2$s ภายใต้ %3$s - เกี่ยวกับ - สัญญาอนุญาต - แอปสตรีมมิ่งที่เล็กและเสรีบน Android - สนับสนุน - ไม่ว่าคุณจะมีความคิดที่จะช่วยแปลภาษา เปลี่ยนดีไซน์ แก้ไขโค้ดของโปรแกรมให้ดีขึ้นทั้งในระดับเล็กน้อยหรือจะเปลี่ยนแปลงกันแบบขนานใหญ่ เรายินดีให้คุณได้ร่วมช่วยเหลือเสมอ… ยิ่งทำมาก ยิ่งช่วยให้ดีขึ้นมาก! + เกี่ยวกับเรา & คำถามที่พบบ่อย + ใบอนุญาต + บริการสตรีมมิ่งแบบเบาและใช้งานง่ายบน Android + มีส่วนช่วย + ไม่ว่าคุณจะมีไอเดียเกี่ยวกับ การแปล การเปลี่ยนแปลงดีไซน์ การปรับปรุงโค้ด หรือการเปลี่ยนแปลงโค้ดครั้งใหญ่ เรายินดีรับความช่วยเหลือเสมอ ยิ่งมากเท่าไหร่ก็ยิ่งดีเท่านั้น! ดูบน GitHub บริจาค - คืนให้ + ตอบแทน เว็บไซต์ - เยี่ยมชมเว็บไซต์ NewPipe สำหรับข้อมูลเพิ่มเติมและข่าวสาร + เยี่ยมชมเว็บไซต์ NewPipe เพื่อดูข้อมูลและข่าวสารเพิ่มเติม นโยบายความเป็นส่วนตัวของ NewPipe โครงการ NewPipe คำนึงถึงความเป็นส่วนตัวของคุณอย่างจริงจัง ดังนั้นแอปจะไม่เก็บรวบรวมข้อมูลใดๆ โดยไม่ได้รับความยินยอมจากคุณ \nนโยบายความเป็นส่วนตัวของ NewPipe มีการอธิบายในรายละเอียดเกี่ยวกับข้อมูลที่จะถูกส่งออกไปและเก็บไว้เมื่อคุณรายงานความผิดพลาดของแอป อ่านนโยบายความเป็นส่วนตัว - สัญญาอนุญาตของ NewPipe - อ่านสัญญาอนุญาต + ใบอนุญาตของ NewPipe + อ่านใบอนุญาต ประวัติ ประวัติ คุณต้องการลบรายการนี้ออกจากประวัติการค้นหาหรือไม่\? @@ -429,4 +429,27 @@ การ์ด กำลังจะมา ค้นหา %1$s + NewPipe พัฒนาโดยอาสาสมัครที่ใช้เวลาว่างในการมอบประสบการณ์การใช้งานที่ดีที่สุดให้กับคุณ ร่วมสนับสนุนนักพัฒนาให้สร้าง NewPipe ให้ดียิ่งขึ้นไปพร้อมกับการจิบกาแฟไป + NewPipe เป็นซอฟต์แวร์เสรีแบบ copyleft: คุณสามารถใช้งาน ศึกษา แบ่งปัน และปรับปรุงได้ตามต้องการ โดยเฉพาะอย่างยิ่ง คุณสามารถแจกจ่ายซ้ำและ/หรือแก้ไขได้ภายใต้เงื่อนไขของ GNU General Public License ที่เผยแพร่โดย Free Software Foundation ไม่ว่าจะเป็นเวอร์ชัน 3 ของ License หรือ (ตามที่คุณเลือก) เวอร์ชันใด ๆ ที่ใหม่กว่า + คำถามที่พบบ่อย + หากคุณประสบปัญหาในการใช้งานแอป โปรดตรวจสอบคำตอบสำหรับคำถามที่พบบ่อยเหล่านี้! + ดูรายละเอียดเพิ่มเติมได้ที่เว็บไซต์ + ปิด + การแจ้งเตือน + สำรองข้อมูลและกู้คืน + ค้นหา %1$s (%2$s) + เพลย์ลิสต์ + แก้ไขตั้งค่าแจ้งเตือนแต่ละรายการด้านล่างโดยแตะที่รายการนั้น การตั้งค่าสามรายการแรก (เล่น/หยุดชั่วคราว ก่อนหน้า และถัดไป) ถูกตั้งค่าโดยระบบและไม่สามารถปรับแต่งได้ + คุณสามารถเลือกได้สูงสุดสามอย่างเพื่อแสดงในการแจ้งเตือน! + กำลังบัฟเฟอร์ + ตั้งค่าให้ Android ปรับแต่งสีของการแจ้งเตือนตามสีหลักในภาพขนาดย่อ (โปรดทราบว่าฟังก์ชันนี้อาจไม่สามารถใช้งานได้ในทุกอุปกรณ์) + ขนาดช่วงเวลาการโหลดการเล่น + เปลี่ยนขนาดช่วงเวลาการโหลดสำหรับเนื้อหาแบบเรียงลำดับ (ปัจจุบันคือ %s) ค่าที่ต่ำกว่าอาจช่วยเร่งการโหลดเริ่มต้นได้ + ละเว้นเหตุการณ์ปุ่มสื่อ + ปิดเพื่อซ่อนกล่องข้อมูลเมตาที่มีข้อมูลเพิ่มเติมเกี่ยวกับผู้สร้างสตรีม เนื้อหาสตรีม หรือคำขอค้นหา + ตั้งค่าแจ้งเตือนสตรีมที่กำลังเล่นอยู่ + แสดงเนื้อหาที่อาจไม่เหมาะสมสำหรับเด็กเนื่องจากมีการจำกัดอายุ (เช่น 18 ปีขึ้นไป) + เปิดใช้งาน \"โหมดจำกัด\" ของ YouTube + YouTube มี \"โหมดจำกัด\" ที่สามารถซ่อนเนื้อหาที่ไม่เหมาะสมได้ + วิดีโอนี้มีข้อจำกัดด้านอายุ\n\nหากต้องการรับชม โปรดเปิดใช้งาน \"%1$s\" ในตั้งค่า diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 0fbeb67d4..482526783 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -149,7 +149,7 @@ Ліцензії Зробіть внесок Переглянути на GitHub - Пожертвувати + Підтримати Вебсайт Історія Експортовано @@ -854,7 +854,7 @@ %sтис %sмлн %sмлрд - Щоб використовувати спливаючий програвач, виберіть %1$s у наступному меню налаштувань Android та увімкніть %2$s. + Щоб використовувати спливний програвач, виберіть %1$s у наступному меню налаштувань Android та ввімкніть %2$s. “Дозволити показ поверх інших програм” Видалити файл Видалити запис @@ -864,7 +864,7 @@ Помилка HTTP %1$s отримана від сервера під час відтворення Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через заборону IP-адреси або проблеми з деобфускацією URL-адреси потокової передачі %1$s відмовляється надати дані та запитує пароль для підтвердження, що запитувач не бот.\n\n%1$s міг тимчасово заблокувати вашу IP-адресу. Ви можете почекати деякий час або перейти на іншу IP-адресу (наприклад, увімкнувши/вимкнувши VPN або перемкнувшись з Wi-Fi на мобільні дані).\n\nЩоб дізнатися докладніше, перегляньте цю довідку. - Цей контент недоступний для вибраної країни контенту.\n\nЗмініть свій вибір у розділі \"Налаштування > Контент > Країна контенту за замовчуванням\". + Ці матеріали недоступні для вибраної країни матеріалів.\n\nЗмініть свій вибір у розділі \"Налаштування > Матеріали > Типова країна матеріалів\". У серпні 2025 року, Google анонсувала, що з вересня 2026 року, для встановлення застосунків буде потрібна верифікація розробника для всіх Android застосунків на сертифікованих пристроях, включаючи ті, що були встановлені не через Play Store. Оскільки розробники NewPipe не згодні з цією вимогою, NewPipe перестане працювати на сертифікованих Android пристроях після цієї дати. Детальніше Вирішення @@ -894,4 +894,6 @@ NewPipe припиняє підтримку Android 5 На жаль, NewPipe залежить від кількох бібліотек, які припинили підтримку Android 5.0 і 5.1. Тому наступна версія NewPipe працюватиме лише на пристроях з Android 6 або новішою версією. Докладніше читайте в дописі в блозі. Допис у блозі + Подкасти + Курси diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index cf732dd24..aadddb1f3 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -833,4 +833,6 @@ NewPipe 即將停止支援 Android 5 部落格文章 不幸的是,NewPipe 依賴的一些函式庫已停止支援 Android 5.0 和 5.1。因此,下一個版本的 NewPipe 將只能在 Android 6 或更高版本的裝置上運作,非常遺憾。更多資訊請參閱部落格文章。 + Podcast + 課程 diff --git a/fastlane/metadata/android/be/changelogs/1015.txt b/fastlane/metadata/android/be/changelogs/1015.txt new file mode 100644 index 000000000..5b77dbcc3 --- /dev/null +++ b/fastlane/metadata/android/be/changelogs/1015.txt @@ -0,0 +1 @@ +Выпраўленне, якое вырашае праблемы з прамымі трансляцыямі на media.ccc.de. Прыемнага выкарыстання! diff --git a/fastlane/metadata/android/hu/changelogs/1015.txt b/fastlane/metadata/android/hu/changelogs/1015.txt new file mode 100644 index 000000000..f20d3f2fc --- /dev/null +++ b/fastlane/metadata/android/hu/changelogs/1015.txt @@ -0,0 +1 @@ +Ez egy gyorsjavító kiadás, amely kijavítja az élő közvetítések működését a media.ccc.de oldalon. Jó hackelést! diff --git a/fastlane/metadata/android/la/changelogs/1015.txt b/fastlane/metadata/android/la/changelogs/1015.txt new file mode 100644 index 000000000..cd8c0f735 --- /dev/null +++ b/fastlane/metadata/android/la/changelogs/1015.txt @@ -0,0 +1 @@ +Ea divulgatio hotfix pro reparare transmissiones directas a media.ccc.de est. Invadete laeti! diff --git a/fastlane/metadata/android/la/full_description.txt b/fastlane/metadata/android/la/full_description.txt new file mode 100644 index 000000000..2223eb8f3 --- /dev/null +++ b/fastlane/metadata/android/la/full_description.txt @@ -0,0 +1 @@ +NewPipe neque bibliothecae Google framework neque API YouTube utitur. Solum situm interretialem perscrutatur ut informationem necessariam accipiat. Itaque id usus in instrumentis sine Google Services utilem est. Praeterea, ratione YouTube pro consumere NewPipe non eges, et FOSS est. diff --git a/fastlane/metadata/android/la/short_description.txt b/fastlane/metadata/android/la/short_description.txt new file mode 100644 index 000000000..f167a6e6c --- /dev/null +++ b/fastlane/metadata/android/la/short_description.txt @@ -0,0 +1 @@ +Facies YouTube libera et levis pro Android. diff --git a/fastlane/metadata/android/lv/changelogs/1015.txt b/fastlane/metadata/android/lv/changelogs/1015.txt new file mode 100644 index 000000000..f62f971d6 --- /dev/null +++ b/fastlane/metadata/android/lv/changelogs/1015.txt @@ -0,0 +1 @@ +Šis steiguma labojums novērš tiešraides problēmas saistītas ar media.ccc.de vietni. Patīkamu uzlaušanu! diff --git a/fastlane/metadata/android/pl/changelogs/1015.txt b/fastlane/metadata/android/pl/changelogs/1015.txt new file mode 100644 index 000000000..cb74f3615 --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/1015.txt @@ -0,0 +1 @@ +To jest aktualizacja poprawiająca działanie transmisji na żywo na stronie media.ccc.de. Miłego hakowania! diff --git a/fastlane/metadata/android/sv/changelogs/1015.txt b/fastlane/metadata/android/sv/changelogs/1015.txt new file mode 100644 index 000000000..700d74b83 --- /dev/null +++ b/fastlane/metadata/android/sv/changelogs/1015.txt @@ -0,0 +1 @@ +Detta är en snabbkorrigeringsversion som fixar direktsändningar från media.ccc.de. Lycka till med hackandet! diff --git a/fastlane/metadata/android/th/changelogs/1015.txt b/fastlane/metadata/android/th/changelogs/1015.txt new file mode 100644 index 000000000..055263e47 --- /dev/null +++ b/fastlane/metadata/android/th/changelogs/1015.txt @@ -0,0 +1 @@ +นี่คือการอัปเดตแก้ไขปัญหาด่วนสำหรับสตรีมสดบน media.ccc.de ขอให้สนุกกับการใช้งาน! diff --git a/fastlane/metadata/android/uk/changelogs/1015.txt b/fastlane/metadata/android/uk/changelogs/1015.txt new file mode 100644 index 000000000..a675b735d --- /dev/null +++ b/fastlane/metadata/android/uk/changelogs/1015.txt @@ -0,0 +1 @@ +Це позачерговий випуск для виправлення трансляцій для media.ccc.de. Приємного користування! From 9602a601311dfb3120bb661106a65bfbf293098d Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Mon, 14 Sep 2026 01:27:51 +0200 Subject: [PATCH 038/155] Translated using Weblate (Swedish) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Thai) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Latin) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Russian) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Latvian) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Russian) Currently translated at 63.1% (24 of 38 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (38 of 38 strings) Translated using Weblate (Romanian) Currently translated at 97.3% (37 of 38 strings) Translated using Weblate (Romanian) Currently translated at 97.3% (37 of 38 strings) Translated using Weblate (Romanian) Currently translated at 57.8% (22 of 38 strings) Co-authored-by: Anucha Hlownonkor Co-authored-by: Hosted Weblate Co-authored-by: Igor Sorocean Co-authored-by: Ihor Hordiichuk Co-authored-by: Joel A Co-authored-by: Jos Essens Co-authored-by: Laur Co-authored-by: Username9510 Co-authored-by: Valer Co-authored-by: Yauhen Co-authored-by: isopod-a Co-authored-by: vityatii Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/be/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/la/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/lv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ro/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ru/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/th/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/uk/ Translation: NewPipe/compose --- .../composeResources/values-be/strings.xml | 35 ++++++++++++++++ .../composeResources/values-es/strings.xml | 2 +- .../composeResources/values-la/strings.xml | 39 +++++++++++++++++- .../composeResources/values-lv/strings.xml | 11 +++++ .../composeResources/values-ro/strings.xml | 40 ++++++++++++++++++- .../composeResources/values-ru/strings.xml | 19 +++++++++ .../composeResources/values-sv/strings.xml | 12 +++++- .../composeResources/values-th/strings.xml | 40 ++++++++++++++++++- .../composeResources/values-uk/strings.xml | 2 +- 9 files changed, 194 insertions(+), 6 deletions(-) diff --git a/shared/src/commonMain/composeResources/values-be/strings.xml b/shared/src/commonMain/composeResources/values-be/strings.xml index 6d8731452..7c7d75ae3 100644 --- a/shared/src/commonMain/composeResources/values-be/strings.xml +++ b/shared/src/commonMain/composeResources/values-be/strings.xml @@ -3,4 +3,39 @@ Назад Пра NewPipe Ліцэнзіі + Староннія ліцэнзіі + Ад %1$s, ліцэнзія %2$s + Аб праграме + Легкавагавая праграма з адкрытым зыходным кодам для патокавага прайгравання на Android. + Дапамога праекту + Вітаецца ўсё - ідэі, пераклад, змены дызайну, чыстка кода або велізарныя змены ў кодзе. Чым больш зроблена, тым лепш! + Старонка на GitHub + Ахвяраванне + NewPipe распрацаваны валанцёрамі, якія прысвячаюць свой вольны час, каб паляпшаць для вас праграму. Зрабіце і вы для іх добрае, хай распрацоўшчыкі пацешаць сябе кубачкам кавы пакуль працуюць над NewPipe. + Падтрымаць грашыма + Вэб-сайт + Наведайце вэб-сайт, каб атрымаць больш інфармацыі і паглядзець апошнія навіны NewPipe. + Палітыка прыватнасці NewPipe + Праект NewPipe вельмі адказна ставіцца да вашай прыватнасці. Таму праграма не збірае ніякіх даных без вашай згоды. \nПалітыка прыватнасці NewPipe падрабязна тлумачыць, якія даныя адпраўляюцца і захоўваюцца пры адпраўцы справаздачы пра збой. + Прачытаць палітыку прыватнасці + Ліцэнзія NewPipe + NewPipe - гэта свабоднае праграмнае забеспячэнне (копілефт). Вы можаце выкарыстоўваць, вывучаць, дзяліцца і паляпшаць яго па жаданні. У прыватнасці, можаце распаўсюджваць і/ці змяняць яго згодна з умовамі, апублікаванай Фондам свабоднага праграмнага забеспячэння, Агульнай грамадскай ліцэнзіі GNU версіі 3 або любой пазнейшай (на ваш выбар). + Прачытаць ліцэнзію + Частыя пытанні + Калі ў вас узніклі праблемы з выкарыстаннем праграмы, абавязкова азнаёмцеся з адказамі на частыя пытанні! + Перайсці на вэб-сайт + Адкрыць у браўзеры + Гатова + Недаступна + Налады + Пошук + Кантэнт + Апавяшчэнні + Відэа і аўдыя + Спампоўванне + Выгляд + Гісторыя і кэш + Абнаўленні + Рэзервовыя копіі і аднаўленне + Адладка diff --git a/shared/src/commonMain/composeResources/values-es/strings.xml b/shared/src/commonMain/composeResources/values-es/strings.xml index 66de23005..31480fca7 100644 --- a/shared/src/commonMain/composeResources/values-es/strings.xml +++ b/shared/src/commonMain/composeResources/values-es/strings.xml @@ -1,6 +1,6 @@ - Atrás + Spaans Acerca de NewPipe Licencias de terceros Por %1$s bajo %2$s diff --git a/shared/src/commonMain/composeResources/values-la/strings.xml b/shared/src/commonMain/composeResources/values-la/strings.xml index 5c0a63e23..8cd7ad702 100644 --- a/shared/src/commonMain/composeResources/values-la/strings.xml +++ b/shared/src/commonMain/composeResources/values-la/strings.xml @@ -1,4 +1,41 @@ - Aperi in navigatro + In quaerente aperire + Finitus + Relicus non est + Adaptabilitates + Quaerere + Contentum + Nuntius + Video et audio + Obtinere + Facies + Historia et horreum breve + Res recenter divulgatae + Servare et restituere + Errores reperire et amovere + Retro + De NewPipe + Licentiae tertianae + A %1$s cum %2$s + De & FAQ + Licetiae + Picturae commotae liberiter et leviter accipere. + Conferre + Aut sententias habes de; interpretationibus, commutationibus designationis, purgatio verbarum, aut commutationibus gravibus verbarum—auxilium semper desideratum est. Quo plus factus est, eo melior fit! + Aspicere in GitHub + Donare + NewPipe voluntariis, qui donant tempus liber eius te dare visum optimum, elaboratus est. Redde, ut elaboratores NewPipe emendare dum pocillum coffeum potant auxilies. + Reddere + Situs interretialis + Visita situs interretialis NewPipe pro plure informationum et novitatibus. + Politia rerum privatarum NewPipe + Inceptum NewPipe tuas res privatas valde veretur. Itaque usus non sine tua assensione data colligit\nPolitia rerum privatarum NewPipe quae data conservata et missa sunt si relatio interpellationis mittis explicat. + Politia rerum privatarum legere + Licentia NewPipe + NewPipe partes programmationis libera et copiantes sinistrorsum sunt: Consumere, studere, distribuere, emendare tibi licet. Imprimis redistribuere et/aut mutare, contitione GNU General Public License quomodo divulgatus a Free Software Foundation, aut versio 3 aut posterior versio, tibi licet. + Licentia legere + Interrogationes saepe interrogatas + Si difficultates usum adhibere habes, aspice ea responsa ad interrogationes crebras! + Aspicere in situ interretiale diff --git a/shared/src/commonMain/composeResources/values-lv/strings.xml b/shared/src/commonMain/composeResources/values-lv/strings.xml index aa1c34da6..ce29a1b78 100644 --- a/shared/src/commonMain/composeResources/values-lv/strings.xml +++ b/shared/src/commonMain/composeResources/values-lv/strings.xml @@ -27,4 +27,15 @@ Lasīt licenci Skaidrs Atbalstīt projektu + Rezerves kopijas izveide un atjaunošana + Iestatījumi + Meklēt + Saturs + Paziņojumi + Video un audio + Lejupielādēt + Izskats + Vēsture un kešatmiņa + Atjauninājumi + Atkļūdošana diff --git a/shared/src/commonMain/composeResources/values-ro/strings.xml b/shared/src/commonMain/composeResources/values-ro/strings.xml index 55344e519..78ab89ef7 100644 --- a/shared/src/commonMain/composeResources/values-ro/strings.xml +++ b/shared/src/commonMain/composeResources/values-ro/strings.xml @@ -1,3 +1,41 @@ - \ No newline at end of file + Înapoi + Despre NewPipe + Licențe terță-parte + De %1$s sub %2$s + Despre & Întrebări Comune + Licențe + Streaming sursă-liberă pentru Android. + Contribuie + Când îți vine idea de; traduceri, schimbări de design, curățare cod sau schimbări reale de cod - Ajutorul este mereu binevenit. Cu cât mai mult, cu cât mai bine! + Vezi pe GitHub + Donează + NewPipe este creat de voluntari ce își oferă timpul lor liber pentru ați oferi cea mai bună experiență. Oferă înapoi creatorilor pentru a face aplicația și mai bună. + Oferă Înapoi + Site Web + Vizitează site-ul NewPipe pentru mai multe informații si noutăți. + Politica de Confidențialitate NewPipe + Proiectul NewPipe îți ia confidențialitatea foarte în serios. Din acest motiv aplicația nu colectează date fără aprobarea dvs.\nPolitica de confidențialitate a NewPipe explică în detaliu ce date sunt trimise și stocate când trimiți un raport de cădere (Crash). + Citește Politica de confidențialitate + Licența a NewPipe + NewPipe este o aplicație liberă: Poți folosi, studia, partaja, și a o face mai bună după propria voință. Poți redistribui și/sau modifica aplicația în termenii GNU GPL publicate de Free Software Foundation, toate dintre cele 3 versiuni, or (la opțiunea dvs.) orice versiune mai nouă. + Citește licența + Întrebări frecvente + Dacă aveți probleme folosind aplicația, uitați-vă la răspunsurile celor mai comune întrebărilor puse! + Vezi în website + Deschide în browser + Gata + Indisponibil + Setări + Caută + Conținut + Notificări + Video și audio + Descarcă + Aparență + Istorie și cache + Actualizări + Copie de rezervă și Restabilire + Depanare + diff --git a/shared/src/commonMain/composeResources/values-ru/strings.xml b/shared/src/commonMain/composeResources/values-ru/strings.xml index 18bfec3d0..3cafdb861 100644 --- a/shared/src/commonMain/composeResources/values-ru/strings.xml +++ b/shared/src/commonMain/composeResources/values-ru/strings.xml @@ -19,4 +19,23 @@ Ознакомиться с политикой конфиденциальности Лицензия NewPipe NewPipe - свободное программное обеспечение, распространяемое на условиях копилефта. Вы можете свободно использовать, изучать, распространять и улучшать его. В частности, NewPipe можно распространять и/или изменять на условиях Стандартной общественной лицензии GNU, опубликованной Фондом свободного программного обеспечения, версии 3 либо, по вашему выбору, любой более поздней версии. + Часто задаваемые вопросы + Если у вас есть проблемы с использованием приложения, проверьте ответы на часто задаваемые вопросы! + Посмотреть на сайте + Открыть в браузере + Не доступно + Свободный и легковесный потоковый плеер для Android. + Прочитать лицензию + Готово + Настройки + Поиск + Контент + Уведомления + Видео и аудио + Скачать + Внешний вид + История и кэш + Обновления + Резервное копирование и восстановление + Отладка diff --git a/shared/src/commonMain/composeResources/values-sv/strings.xml b/shared/src/commonMain/composeResources/values-sv/strings.xml index 7dc8df6af..28d7884e7 100644 --- a/shared/src/commonMain/composeResources/values-sv/strings.xml +++ b/shared/src/commonMain/composeResources/values-sv/strings.xml @@ -15,7 +15,7 @@ NewPipes licens Licenser Donera - Läs svaren på vanliga frågor om du har problem med att använda appen. + Om du har problem med att använda appen, läs då svaren på de här vanliga frågorna! Klar Icke tillgängligt Om och vanliga frågor @@ -28,4 +28,14 @@ Visa på GitHub NewPipe är fri programvara under en copyleft-licens: du får använda, studera, dela och förbättra programmet. Du får distribuera och ändra det enligt villkoren i GNU General Public License, version 3 eller, om du föredrar det, en senare version. Hämtningar + Inställningar + Sök + Innehåll + Aviseringar + Ljud och bild + Utseende + Historik och cache + Uppdateringar + Säkerhetskopiera och återställ + Felsökning diff --git a/shared/src/commonMain/composeResources/values-th/strings.xml b/shared/src/commonMain/composeResources/values-th/strings.xml index 55344e519..21b79fa3f 100644 --- a/shared/src/commonMain/composeResources/values-th/strings.xml +++ b/shared/src/commonMain/composeResources/values-th/strings.xml @@ -1,3 +1,41 @@ - \ No newline at end of file + กลับ + เกี่ยวกับ NewPipe + ใบอนุญาตบุคคลที่สาม + โดย %1$s ภายใต้ %2$s + เกี่ยวกับเรา & คำถามที่พบบ่อย + ใบอนุญาต + บริการสตรีมมิ่งแบบเบาและใช้งานง่ายบน Android + มีส่วนช่วย + ไม่ว่าคุณจะมีไอเดียเกี่ยวกับ การแปล การเปลี่ยนแปลงดีไซน์ การปรับปรุงโค้ด หรือการเปลี่ยนแปลงโค้ดครั้งใหญ่ เรายินดีรับความช่วยเหลือเสมอ ยิ่งมากเท่าไหร่ก็ยิ่งดีเท่านั้น! + ดูบน GitHub + บริจาค + NewPipe พัฒนาโดยอาสาสมัครที่ใช้เวลาว่างในการมอบประสบการณ์การใช้งานที่ดีที่สุดให้กับคุณ ร่วมสนับสนุนนักพัฒนาให้สร้าง NewPipe ให้ดียิ่งขึ้นไปพร้อมกับการจิบกาแฟไป + ตอบแทน + เว็บไซต์ + เยี่ยมชมเว็บไซต์ NewPipe เพื่อดูข้อมูลและข่าวสารเพิ่มเติม + นโยบายความเป็นส่วนตัวของ NewPipe + โครงการ NewPipe ให้ความสำคัญกับความเป็นส่วนตัวของคุณเป็นอย่างยิ่ง ดังนั้น แอปจึงไม่เก็บรวบรวมข้อมูลใดๆ โดยไม่ได้รับความยินยอมจากคุณ นโยบายความเป็นส่วนตัวของ NewPipe อธิบายรายละเอียดเกี่ยวกับข้อมูลต่างๆ ที่ถูกส่งและจัดเก็บเมื่อคุณส่งรายงานข้อผิดพลาด + อ่านนโยบายความเป็นส่วนตัว + ใบอนุญาตของ NewPipe + NewPipe เป็นซอฟต์แวร์เสรีแบบ copyleft: คุณสามารถใช้งาน ศึกษา แบ่งปัน และปรับปรุงได้ตามต้องการ โดยเฉพาะอย่างยิ่ง คุณสามารถแจกจ่ายซ้ำและ/หรือแก้ไขได้ภายใต้เงื่อนไขของ GNU General Public License ที่เผยแพร่โดย Free Software Foundation ไม่ว่าจะเป็นเวอร์ชัน 3 ของ License หรือ (ตามที่คุณเลือก) เวอร์ชันใด ๆ ที่ใหม่กว่า + อ่านใบอนุญาต + คำถามที่พบบ่อย + หากคุณประสบปัญหาในการใช้งานแอป โปรดตรวจสอบคำตอบสำหรับคำถามที่พบบ่อยเหล่านี้! + ดูรายละเอียดเพิ่มเติมได้ที่เว็บไซต์ + เปิดในเบราว์เซอร์ + ปิด + ไม่พร้อมใช้งาน + ตั้งค่า + ค้นหา + เนื้อหา + การแจ้งเตือน + วิดีโอและเสียง + ดาวน์โหลด + รูปร่าง + ประวัติและแคช + อัปเดต + สำรองข้อมูลและกู้คืน + Debug + diff --git a/shared/src/commonMain/composeResources/values-uk/strings.xml b/shared/src/commonMain/composeResources/values-uk/strings.xml index d59fdbfc2..82c630bda 100644 --- a/shared/src/commonMain/composeResources/values-uk/strings.xml +++ b/shared/src/commonMain/composeResources/values-uk/strings.xml @@ -9,7 +9,7 @@ Зробіть внесок Незалежно від того, чи у вас є ідеї щодо перекладу, змін дизайну, очищення коду або серйозних доопрацювань — будь-яка допомога завжди вітається. Чим більше зроблено, тим кращим стає проєкт! Переглянути на GitHub - Пожертвувати + Підтримати NewPipe розробляють волонтери, які у вільний час створюють для вас найкращий користувацький досвід. Підтримайте розробників, щоб допомогти зробити NewPipe ще кращим, поки вони насолоджуються чашкою кави. Віддячити Вебсайт From b3df5db96f1fb472e7206b34ed68c9519b81b0eb Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 10 Jul 2026 00:49:42 +0100 Subject: [PATCH 039/155] Add ListPreference and SwitchPreference composables --- .../composeResources/values/strings.xml | 27 ++++ .../newpipe/app/composable/ListPreference.kt | 125 ++++++++++++++++++ .../app/composable/SwitchPreference.kt | 68 ++++++++++ 3 files changed, 220 insertions(+) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/composable/ListPreference.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml index c738a1c13..71fded2db 100644 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ b/shared/src/commonMain/composeResources/values/strings.xml @@ -47,4 +47,31 @@ Updates Backup and restore Debug + + + Theme + Light + Dark + Black + Automatic (device theme) + Night theme + Select your favorite night theme — %1$s + This option is only available if %1$s is selected for Theme + You can select your favorite night theme below + Show \"Hold to enqueue\" tip + Show tip when pressing the background or the popup button in video \"Details:\" + Tablet mode + List view mode + Captions + Modify player caption text scale and background styles. Requires app restart to take effect + Main tabs position + Move main tab selector to the bottom + Auto + On + Off + List + Grid + Card + Cancel + diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/ListPreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/ListPreference.kt new file mode 100644 index 000000000..8580891a7 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/ListPreference.kt @@ -0,0 +1,125 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.composable + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.selection.selectable +import androidx.compose.foundation.selection.selectableGroup +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ListItem +import androidx.compose.material3.RadioButton +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.compose.ui.unit.dp +import net.newpipe.app.preview.ThemePreviewProvider +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.cancel +import org.jetbrains.compose.resources.stringResource + +private const val DISABLED_ALPHA = 0.38f + +/** + * A selectable option in a [ListPreference]: a stored [value] and its displayed [title]. + */ +data class ListPreferenceEntry(val value: String, val title: String) + +/** + * A preference row that opens a single-choice dialog, mirroring AndroidX ListPreference. + * + * @param title Title text of the preference and of the dialog + * @param entries Selectable options + * @param selectedValue Currently stored value + * @param onValueSelected Called with the chosen value + * @param modifier Modifier applied to the row + * @param summary Secondary line; when null, the selected entry's title is shown + * @param enabled Whether the row can be opened + */ +@Composable +fun ListPreference( + title: String, + entries: List, + selectedValue: String, + onValueSelected: (String) -> Unit, + modifier: Modifier = Modifier, + summary: String? = null, + enabled: Boolean = true +) { + var showDialog by remember { mutableStateOf(false) } + val effectiveSummary = summary ?: entries.firstOrNull { it.value == selectedValue }?.title + + ListItem( + modifier = modifier + .alpha(if (enabled) 1f else DISABLED_ALPHA) + .clickable(enabled = enabled) { showDialog = true }, + headlineContent = { Text(text = title) }, + supportingContent = effectiveSummary?.let { text -> { Text(text = text) } } + ) + + if (showDialog) { + AlertDialog( + onDismissRequest = { showDialog = false }, + title = { Text(text = title) }, + text = { + Column(modifier = Modifier.selectableGroup()) { + entries.forEach { entry -> + Row( + modifier = Modifier + .fillMaxWidth() + .selectable( + selected = entry.value == selectedValue, + role = Role.RadioButton, + onClick = { + onValueSelected(entry.value) + showDialog = false + } + ) + .padding(vertical = 12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + RadioButton(selected = entry.value == selectedValue, onClick = null) + Text(text = entry.title, modifier = Modifier.padding(start = 16.dp)) + } + } + } + }, + confirmButton = { + TextButton(onClick = { showDialog = false }) { + Text(text = stringResource(Res.string.cancel)) + } + } + ) + } +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun ListPreferencePreview() { + ListPreference( + title = "Theme", + entries = listOf( + ListPreferenceEntry("light_theme", "Light"), + ListPreferenceEntry("dark_theme", "Dark") + ), + selectedValue = "dark_theme", + onValueSelected = {} + ) +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt new file mode 100644 index 000000000..fe83c4abf --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt @@ -0,0 +1,68 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.composable + +import androidx.compose.foundation.selection.toggleable +import androidx.compose.material3.ListItem +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import net.newpipe.app.preview.ThemePreviewProvider + +private const val DISABLED_ALPHA = 0.38f + +/** + * A preference row with a trailing switch, mirroring AndroidX SwitchPreferenceCompat. + * + * @param title Title text of the preference + * @param checked Current checked state + * @param onCheckedChange Called with the new state when toggled + * @param modifier Modifier applied to the row + * @param summary Optional secondary line under the title + * @param enabled Whether the row can be toggled + */ +@Composable +fun SwitchPreference( + title: String, + checked: Boolean, + onCheckedChange: (Boolean) -> Unit, + modifier: Modifier = Modifier, + summary: String? = null, + enabled: Boolean = true +) { + ListItem( + modifier = modifier + .alpha(if (enabled) 1f else DISABLED_ALPHA) + .toggleable( + value = checked, + enabled = enabled, + role = Role.Switch, + onValueChange = onCheckedChange + ), + headlineContent = { Text(text = title) }, + supportingContent = summary?.let { text -> { Text(text = text) } }, + trailingContent = { + Switch(checked = checked, onCheckedChange = null, enabled = enabled) + } + ) +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun SwitchPreferencePreview() { + SwitchPreference( + title = "Show \"Hold to enqueue\" tip", + summary = "Show tip when pressing the background button", + checked = true, + onCheckedChange = {} + ) +} \ No newline at end of file From 4454a9a3272d22be2c3f47ed527dad30917cb6c3 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 10 Jul 2026 00:56:37 +0100 Subject: [PATCH 040/155] add appearance actions and platform impls --- .../app/platform/AndroidAppearanceActions.kt | 28 +++++++++++++++++++ .../app/composable/SwitchPreference.kt | 2 +- .../newpipe/app/platform/AppearanceActions.kt | 16 +++++++++++ .../app/platform/IOSAppearanceActions.kt | 13 +++++++++ .../app/platform/JVMAppearanceActions.kt | 13 +++++++++ 5 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt create mode 100644 shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt create mode 100644 shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt new file mode 100644 index 000000000..4d8d69f1a --- /dev/null +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt @@ -0,0 +1,28 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import android.content.ActivityNotFoundException +import android.content.Context +import android.content.Intent +import android.provider.Settings +import co.touchlab.kermit.Logger +import org.koin.core.annotation.Singleton + +@Singleton(binds = [AppearanceActions::class]) +class AndroidAppearanceActions(private val context: Context) : AppearanceActions { + + override fun openCaptionSettings() { + try { + context.startActivity( + Intent(Settings.ACTION_CAPTIONING_SETTINGS) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + ) + } catch (exception: ActivityNotFoundException) { + Logger.e(messageString = "No activity found for captioning settings", throwable = exception) + } + } +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt index fe83c4abf..51c851fde 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt @@ -65,4 +65,4 @@ private fun SwitchPreferencePreview() { checked = true, onCheckedChange = {} ) -} \ No newline at end of file +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt b/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt new file mode 100644 index 000000000..d27432962 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +/** + * Platform-specific actions triggered from the Appearance settings screen. + */ +interface AppearanceActions { + /** + * Opens the system captioning settings, where supported. + */ + fun openCaptionSettings() +} diff --git a/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt new file mode 100644 index 000000000..fa6e5ad46 --- /dev/null +++ b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import org.koin.core.annotation.Singleton + +@Singleton(binds = [AppearanceActions::class]) +class IOSAppearanceActions : AppearanceActions { + override fun openCaptionSettings() = Unit +} diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt new file mode 100644 index 000000000..05e8b9ef9 --- /dev/null +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt @@ -0,0 +1,13 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import org.koin.core.annotation.Singleton + +@Singleton(binds = [AppearanceActions::class]) +class JVMAppearanceActions : AppearanceActions { + override fun openCaptionSettings() = Unit +} From 62db4d487a46abfc4490e5cdc3a219a15533ff35 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 10 Jul 2026 02:28:13 +0100 Subject: [PATCH 041/155] add appearance settings screen --- .../settings/AppearanceSettingsScreen.kt | 222 ++++++++++++++++++ .../settings/AppearanceSettingsViewModel.kt | 124 ++++++++++ 2 files changed, 346 insertions(+) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt new file mode 100644 index 000000000..3be0891fc --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt @@ -0,0 +1,222 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.screen.settings + +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.foundation.layout.Column +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.launch +import net.newpipe.app.composable.ListPreference +import net.newpipe.app.composable.ListPreferenceEntry +import net.newpipe.app.composable.PreferenceRow +import net.newpipe.app.composable.SwitchPreference +import net.newpipe.app.composable.TopAppBar +import net.newpipe.app.navigation.Navigator +import net.newpipe.app.platform.AppearanceActions +import net.newpipe.app.preview.ThemePreviewProvider +import net.newpipe.app.viewmodel.settings.AppearancePreferences +import net.newpipe.app.viewmodel.settings.AppearanceSettingsViewModel +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.auto +import newpipe.shared.generated.resources.auto_device_theme_title +import newpipe.shared.generated.resources.black_theme_title +import newpipe.shared.generated.resources.caption_setting_description +import newpipe.shared.generated.resources.caption_setting_title +import newpipe.shared.generated.resources.card +import newpipe.shared.generated.resources.dark_theme_title +import newpipe.shared.generated.resources.grid +import newpipe.shared.generated.resources.light_theme_title +import newpipe.shared.generated.resources.list +import newpipe.shared.generated.resources.list_view_mode +import newpipe.shared.generated.resources.main_tabs_position_summary +import newpipe.shared.generated.resources.main_tabs_position_title +import newpipe.shared.generated.resources.night_theme_available +import newpipe.shared.generated.resources.night_theme_summary +import newpipe.shared.generated.resources.night_theme_title +import newpipe.shared.generated.resources.off +import newpipe.shared.generated.resources.on +import newpipe.shared.generated.resources.select_night_theme_toast +import newpipe.shared.generated.resources.settings_category_appearance_title +import newpipe.shared.generated.resources.show_hold_to_append_summary +import newpipe.shared.generated.resources.show_hold_to_append_title +import newpipe.shared.generated.resources.tablet_mode_title +import newpipe.shared.generated.resources.theme_title +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel + +@Composable +fun AppearanceSettingsScreen( + navigator: Navigator = koinInject(), + viewModel: AppearanceSettingsViewModel = koinViewModel(), + appearanceActions: AppearanceActions = koinInject() +) { + val theme by viewModel.theme.collectAsStateWithLifecycle() + val nightTheme by viewModel.nightTheme.collectAsStateWithLifecycle() + val holdToAppend by viewModel.holdToAppend.collectAsStateWithLifecycle() + val tabletMode by viewModel.tabletMode.collectAsStateWithLifecycle() + val listViewMode by viewModel.listViewMode.collectAsStateWithLifecycle() + val mainTabsPosition by viewModel.mainTabsPosition.collectAsStateWithLifecycle() + + AppearanceSettingsScreenContent( + theme = theme, + nightTheme = nightTheme, + holdToAppend = holdToAppend, + tabletMode = tabletMode, + listViewMode = listViewMode, + mainTabsPosition = mainTabsPosition, + onThemeChange = viewModel::setTheme, + onNightThemeChange = viewModel::setNightTheme, + onHoldToAppendChange = viewModel::setHoldToAppend, + onTabletModeChange = viewModel::setTabletMode, + onListViewModeChange = viewModel::setListViewMode, + onMainTabsPositionChange = viewModel::setMainTabsPosition, + onCaptionSettingsClick = appearanceActions::openCaptionSettings, + onNavigateUp = { navigator.navigateUp() } + ) +} + +@Composable +fun AppearanceSettingsScreenContent( + theme: String = AppearancePreferences.DEFAULT_THEME, + nightTheme: String = AppearancePreferences.DEFAULT_NIGHT_THEME, + holdToAppend: Boolean = AppearancePreferences.DEFAULT_HOLD_TO_APPEND, + tabletMode: String = AppearancePreferences.DEFAULT_TABLET_MODE, + listViewMode: String = AppearancePreferences.DEFAULT_LIST_VIEW_MODE, + mainTabsPosition: Boolean = AppearancePreferences.DEFAULT_MAIN_TABS_POSITION, + onThemeChange: (String) -> Unit = {}, + onNightThemeChange: (String) -> Unit = {}, + onHoldToAppendChange: (Boolean) -> Unit = {}, + onTabletModeChange: (String) -> Unit = {}, + onListViewModeChange: (String) -> Unit = {}, + onMainTabsPositionChange: (Boolean) -> Unit = {}, + onCaptionSettingsClick: () -> Unit = {}, + onNavigateUp: () -> Unit = {} +) { + val scope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } + val selectNightThemeMessage = stringResource(Res.string.select_night_theme_toast) + + val themeEntries = listOf( + ListPreferenceEntry(AppearancePreferences.THEME_LIGHT, stringResource(Res.string.light_theme_title)), + ListPreferenceEntry(AppearancePreferences.THEME_DARK, stringResource(Res.string.dark_theme_title)), + ListPreferenceEntry(AppearancePreferences.THEME_BLACK, stringResource(Res.string.black_theme_title)), + ListPreferenceEntry(AppearancePreferences.THEME_AUTO_DEVICE, stringResource(Res.string.auto_device_theme_title)) + ) + val nightThemeEntries = listOf( + ListPreferenceEntry(AppearancePreferences.THEME_DARK, stringResource(Res.string.dark_theme_title)), + ListPreferenceEntry(AppearancePreferences.THEME_BLACK, stringResource(Res.string.black_theme_title)) + ) + val tabletModeEntries = listOf( + ListPreferenceEntry(AppearancePreferences.TABLET_MODE_AUTO, stringResource(Res.string.auto)), + ListPreferenceEntry(AppearancePreferences.TABLET_MODE_ON, stringResource(Res.string.on)), + ListPreferenceEntry(AppearancePreferences.TABLET_MODE_OFF, stringResource(Res.string.off)) + ) + val listViewModeEntries = listOf( + ListPreferenceEntry(AppearancePreferences.LIST_VIEW_AUTO, stringResource(Res.string.auto)), + ListPreferenceEntry(AppearancePreferences.LIST_VIEW_LIST, stringResource(Res.string.list)), + ListPreferenceEntry(AppearancePreferences.LIST_VIEW_GRID, stringResource(Res.string.grid)), + ListPreferenceEntry(AppearancePreferences.LIST_VIEW_CARD, stringResource(Res.string.card)) + ) + + val nightThemeEnabled = theme == AppearancePreferences.THEME_AUTO_DEVICE + val nightThemeSummary = if (nightThemeEnabled) { + val selectedTitle = nightThemeEntries.firstOrNull { it.value == nightTheme }?.title.orEmpty() + stringResource(Res.string.night_theme_summary, selectedTitle) + } else { + stringResource(Res.string.night_theme_available, stringResource(Res.string.auto_device_theme_title)) + } + + Scaffold( + topBar = { + TopAppBar( + title = stringResource(Res.string.settings_category_appearance_title), + onNavigateUp = onNavigateUp + ) + }, + snackbarHost = { SnackbarHost(snackbarHostState) } + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(top = paddingValues.calculateTopPadding()) + .verticalScroll(rememberScrollState()) + .padding(WindowInsets.navigationBars.asPaddingValues()) + ) { + ListPreference( + title = stringResource(Res.string.theme_title), + entries = themeEntries, + selectedValue = theme, + onValueSelected = { value -> + onThemeChange(value) + if (value == AppearancePreferences.THEME_AUTO_DEVICE) { + scope.launch { snackbarHostState.showSnackbar(selectNightThemeMessage) } + } + } + ) + ListPreference( + title = stringResource(Res.string.night_theme_title), + entries = nightThemeEntries, + selectedValue = nightTheme, + onValueSelected = onNightThemeChange, + summary = nightThemeSummary, + enabled = nightThemeEnabled + ) + SwitchPreference( + title = stringResource(Res.string.show_hold_to_append_title), + summary = stringResource(Res.string.show_hold_to_append_summary), + checked = holdToAppend, + onCheckedChange = onHoldToAppendChange + ) + ListPreference( + title = stringResource(Res.string.tablet_mode_title), + entries = tabletModeEntries, + selectedValue = tabletMode, + onValueSelected = onTabletModeChange + ) + ListPreference( + title = stringResource(Res.string.list_view_mode), + entries = listViewModeEntries, + selectedValue = listViewMode, + onValueSelected = onListViewModeChange + ) + PreferenceRow( + title = stringResource(Res.string.caption_setting_title), + summary = stringResource(Res.string.caption_setting_description), + onClick = onCaptionSettingsClick + ) + SwitchPreference( + title = stringResource(Res.string.main_tabs_position_title), + summary = stringResource(Res.string.main_tabs_position_summary), + checked = mainTabsPosition, + onCheckedChange = onMainTabsPositionChange + ) + } + } +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun AppearanceSettingsScreenPreview() { + AppearanceSettingsScreenContent() +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt new file mode 100644 index 000000000..1edf6442c --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt @@ -0,0 +1,124 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.viewmodel.settings + +import androidx.lifecycle.ViewModel +import com.russhwolf.settings.Settings +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import org.koin.core.annotation.KoinViewModel + +/** + * Preference keys and values for the Appearance screen. + */ +object AppearancePreferences { + const val KEY_THEME = "theme" + const val KEY_NIGHT_THEME = "night_theme" + const val KEY_HOLD_TO_APPEND = "show_hold_to_append" + const val KEY_TABLET_MODE = "tablet_mode" + const val KEY_LIST_VIEW_MODE = "list_view_mode" + const val KEY_MAIN_TABS_POSITION = "main_tabs_position" + + const val THEME_LIGHT = "light_theme" + const val THEME_DARK = "dark_theme" + const val THEME_BLACK = "black_theme" + const val THEME_AUTO_DEVICE = "auto_device_theme" + + const val TABLET_MODE_AUTO = "auto" + const val TABLET_MODE_ON = "on" + const val TABLET_MODE_OFF = "off" + + const val LIST_VIEW_AUTO = "auto" + const val LIST_VIEW_LIST = "list" + const val LIST_VIEW_GRID = "grid" + const val LIST_VIEW_CARD = "card" + + const val DEFAULT_THEME = THEME_AUTO_DEVICE + const val DEFAULT_NIGHT_THEME = THEME_DARK + const val DEFAULT_TABLET_MODE = TABLET_MODE_AUTO + const val DEFAULT_LIST_VIEW_MODE = LIST_VIEW_AUTO + const val DEFAULT_HOLD_TO_APPEND = true + const val DEFAULT_MAIN_TABS_POSITION = false +} + +@KoinViewModel +class AppearanceSettingsViewModel(private val settings: Settings) : ViewModel() { + + val theme: StateFlow + field = MutableStateFlow( + settings.getString(AppearancePreferences.KEY_THEME, AppearancePreferences.DEFAULT_THEME) + ) + + val nightTheme: StateFlow + field = MutableStateFlow( + settings.getString( + AppearancePreferences.KEY_NIGHT_THEME, + AppearancePreferences.DEFAULT_NIGHT_THEME + ) + ) + + val holdToAppend: StateFlow + field = MutableStateFlow( + settings.getBoolean( + AppearancePreferences.KEY_HOLD_TO_APPEND, + AppearancePreferences.DEFAULT_HOLD_TO_APPEND + ) + ) + + val tabletMode: StateFlow + field = MutableStateFlow( + settings.getString( + AppearancePreferences.KEY_TABLET_MODE, + AppearancePreferences.DEFAULT_TABLET_MODE + ) + ) + + val listViewMode: StateFlow + field = MutableStateFlow( + settings.getString( + AppearancePreferences.KEY_LIST_VIEW_MODE, + AppearancePreferences.DEFAULT_LIST_VIEW_MODE + ) + ) + + val mainTabsPosition: StateFlow + field = MutableStateFlow( + settings.getBoolean( + AppearancePreferences.KEY_MAIN_TABS_POSITION, + AppearancePreferences.DEFAULT_MAIN_TABS_POSITION + ) + ) + + fun setTheme(value: String) { + settings.putString(AppearancePreferences.KEY_THEME, value) + theme.value = value + } + + fun setNightTheme(value: String) { + settings.putString(AppearancePreferences.KEY_NIGHT_THEME, value) + nightTheme.value = value + } + + fun setHoldToAppend(value: Boolean) { + settings.putBoolean(AppearancePreferences.KEY_HOLD_TO_APPEND, value) + holdToAppend.value = value + } + + fun setTabletMode(value: String) { + settings.putString(AppearancePreferences.KEY_TABLET_MODE, value) + tabletMode.value = value + } + + fun setListViewMode(value: String) { + settings.putString(AppearancePreferences.KEY_LIST_VIEW_MODE, value) + listViewMode.value = value + } + + fun setMainTabsPosition(value: Boolean) { + settings.putBoolean(AppearancePreferences.KEY_MAIN_TABS_POSITION, value) + mainTabsPosition.value = value + } +} From c2c3c9f52796692aca2f32019388f6ddcf9520c8 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 10 Jul 2026 04:07:09 +0100 Subject: [PATCH 042/155] setup appearance settings navigation --- .../net/newpipe/app/navigation/Destination.kt | 4 +++ .../net/newpipe/app/navigation/NavModule.kt | 5 +++ .../app/screen/settings/SettingsHomeScreen.kt | 11 ++++-- .../kotlin/net/newpipe/app/theme/Theme.kt | 34 +++++++++++++++++-- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt index 367285066..49f6f0900 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt @@ -15,9 +15,13 @@ import net.newpipe.app.model.License @Serializable sealed interface Destination : NavKey { + @Serializable + data object AppearanceSettings : Destination + @Serializable data object Settings : Destination @Serializable data object About : Destination } + diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt index fe1f30f91..d7f6f3b61 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt @@ -8,6 +8,7 @@ package net.newpipe.app.navigation import androidx.compose.runtime.mutableStateListOf import co.touchlab.kermit.Logger import net.newpipe.app.screen.about.AboutScreen +import net.newpipe.app.screen.settings.AppearanceSettingsScreen import net.newpipe.app.screen.settings.SettingsHomeScreen import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.annotation.Provided @@ -32,6 +33,10 @@ fun navModule() = module { navigation { SettingsHomeScreen() } + + navigation { + AppearanceSettingsScreen() + } } /** diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt index 1eea3c149..520aee0f1 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt @@ -23,6 +23,7 @@ import androidx.compose.ui.tooling.preview.PreviewWrapper import androidx.lifecycle.compose.collectAsStateWithLifecycle import net.newpipe.app.composable.PreferenceRow import net.newpipe.app.composable.TopAppBar +import net.newpipe.app.navigation.Destination import net.newpipe.app.navigation.Navigator import net.newpipe.app.preview.ThemePreviewProvider import net.newpipe.app.screen.settings.model.SettingsCategory @@ -49,8 +50,14 @@ fun SettingsHomeScreen( SettingsCategory( title = type.title, icon = type.icon, - // TODO: Replace with a Destination once sub-screens are migrated - onClick = {} + onClick = { + when (type) { + SettingsCategoryType.APPEARANCE -> + navigator.navigateTo(Destination.AppearanceSettings) + // TODO: wire remaining sub-screens as they are migrated + else -> Unit + } + } ) }, onNavigateUp = { navigator.navigateUp() } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt b/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt index b6f3c74be..6501a6255 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt @@ -16,6 +16,12 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalInspectionMode import com.russhwolf.settings.Settings import org.koin.compose.koinInject +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import com.russhwolf.settings.ObservableSettings private val lightScheme = lightColorScheme( primary = primaryLight, @@ -103,12 +109,15 @@ fun currentColorScheme( useDarkTheme: Boolean = isSystemInDarkTheme(), settings: Settings = koinInject() ): ColorScheme { - val nightScheme = when (settings.getString("night_theme", "dark_theme")) { + val theme = rememberSettingString(settings, "theme", "auto_device_theme") + val nightTheme = rememberSettingString(settings, "night_theme", "dark_theme") + + val nightScheme = when (nightTheme) { "black_theme" -> blackScheme else -> darkScheme } - return when (settings.getString("theme", "auto_device_theme")) { + return when (theme) { "light_theme" -> lightScheme "dark_theme" -> darkScheme "black_theme" -> blackScheme @@ -116,6 +125,27 @@ fun currentColorScheme( } } +/** + * Reads a string setting as Compose state, updating when the stored value changes so theme + * edits made elsewhere (e.g. the Appearance screen) apply live without recreating the host. + */ +@Composable +private fun rememberSettingString( + settings: Settings, + key: String, + defaultValue: String +): String { + var value by remember(key) { mutableStateOf(settings.getString(key, defaultValue)) } + val observable = settings as? ObservableSettings + if (observable != null) { + DisposableEffect(key, observable) { + val listener = observable.addStringListener(key, defaultValue) { value = it } + onDispose { listener.deactivate() } + } + } + return value +} + /** * Default app theme for the NewPipe composables * @param isPreview Whether the theme is being used in preview mode From 0bdc32a7665e70a0b476072ed4330281eb1df9a0 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 10 Jul 2026 04:18:46 +0100 Subject: [PATCH 043/155] add appearance settings tests --- .../app/composable/ListPreferenceTest.kt | 54 ++++++++++++++++ .../app/composable/SwitchPreferenceTest.kt | 47 ++++++++++++++ .../settings/AppearanceSettingsScreenTest.kt | 61 +++++++++++++++++++ 3 files changed, 162 insertions(+) create mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/composable/ListPreferenceTest.kt create mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt create mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreenTest.kt diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/composable/ListPreferenceTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/composable/ListPreferenceTest.kt new file mode 100644 index 000000000..2e9629ae9 --- /dev/null +++ b/shared/src/commonTest/kotlin/net/newpipe/app/composable/ListPreferenceTest.kt @@ -0,0 +1,54 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.composable + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.v2.runComposeUiTest +import kotlin.test.Test +import kotlin.test.assertEquals + +@OptIn(ExperimentalTestApi::class) +class ListPreferenceTest { + + private val entries = listOf( + ListPreferenceEntry("a", "Option A"), + ListPreferenceEntry("b", "Option B") + ) + + @Test + fun showsSelectedEntryAsSummary() = runComposeUiTest { + setContent { + ListPreference( + title = "Choose", + entries = entries, + selectedValue = "a", + onValueSelected = {} + ) + } + + onNodeWithText("Option A").assertIsDisplayed() + } + + @Test + fun selectingEntryFiresCallback() = runComposeUiTest { + var selected: String? = null + setContent { + ListPreference( + title = "Choose", + entries = entries, + selectedValue = "a", + onValueSelected = { selected = it } + ) + } + + onNodeWithText("Choose").performClick() // open the dialog + onNodeWithText("Option B").performClick() // pick an option + assertEquals("b", selected) + } +} \ No newline at end of file diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt new file mode 100644 index 000000000..d84d9f272 --- /dev/null +++ b/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt @@ -0,0 +1,47 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.composable + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.v2.runComposeUiTest +import kotlin.test.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +@OptIn(ExperimentalTestApi::class) +class SwitchPreferenceTest { + + @Test + fun togglingRowFiresCallback() = runComposeUiTest { + val title = "Enable feature" + var newValue = false + setContent { + SwitchPreference(title = title, checked = false, onCheckedChange = { newValue = it }) + } + + onNodeWithText(title).performClick() + assertTrue(newValue) + } + + @Test + fun disabledRowDoesNotFire() = runComposeUiTest { + val title = "Enable feature" + var fired = false + setContent { + SwitchPreference( + title = title, + checked = false, + onCheckedChange = { fired = true }, + enabled = false + ) + } + + onNodeWithText(title).performClick() + assertFalse(fired) + } +} \ No newline at end of file diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreenTest.kt new file mode 100644 index 000000000..1e24f2f01 --- /dev/null +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreenTest.kt @@ -0,0 +1,61 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.screen.settings + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.v2.runComposeUiTest +import com.russhwolf.settings.MapSettings +import com.russhwolf.settings.Settings +import net.newpipe.app.extensions.withKoin +import net.newpipe.app.viewmodel.settings.AppearancePreferences +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.settings_category_appearance_title +import newpipe.shared.generated.resources.theme_title +import newpipe.shared.generated.resources.auto_device_theme_title +import newpipe.shared.generated.resources.night_theme_available +import org.jetbrains.compose.resources.getString +import org.koin.dsl.module +import kotlin.test.Test + +@OptIn(ExperimentalTestApi::class) +class AppearanceSettingsScreenTest { + + private val emptySettings = module { + single { MapSettings() } + } + + @Test + fun rendersTitleAndThemeRow() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { AppearanceSettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.settings_category_appearance_title)).assertIsDisplayed() + onNodeWithText(getString(Res.string.theme_title)).assertIsDisplayed() + } + ) + } + + @Test + fun nightThemeShowsUnavailableSummaryWhenThemeNotAuto() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { + AppearanceSettingsScreenContent(theme = AppearancePreferences.THEME_DARK) + }, + onContent = { + onNodeWithText( + getString( + Res.string.night_theme_available, + getString(Res.string.auto_device_theme_title) + ) + ).assertIsDisplayed() + } + ) + } +} \ No newline at end of file From 9f58974e08be2582b4b1bf9a83ec3b33679d13e7 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 15 Jul 2026 08:36:51 +0100 Subject: [PATCH 044/155] refactored to include appearance settings keys --- .../app/preferences/AppearancePreference.kt | 39 +++++++++++++++++++ .../settings/AppearanceSettingsScreen.kt | 2 +- .../kotlin/net/newpipe/app/theme/Theme.kt | 17 +++++--- .../settings/AppearanceSettingsViewModel.kt | 33 +--------------- 4 files changed, 52 insertions(+), 39 deletions(-) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt new file mode 100644 index 000000000..184b5f6c8 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt @@ -0,0 +1,39 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.preferences + +/** + * Preference keys, values, and defaults for the Appearance settings screen. + */ +object AppearancePreferences { + const val KEY_THEME = "theme" + const val KEY_NIGHT_THEME = "night_theme" + const val KEY_HOLD_TO_APPEND = "show_hold_to_append" + const val KEY_TABLET_MODE = "tablet_mode" + const val KEY_LIST_VIEW_MODE = "list_view_mode" + const val KEY_MAIN_TABS_POSITION = "main_tabs_position" + + const val THEME_LIGHT = "light_theme" + const val THEME_DARK = "dark_theme" + const val THEME_BLACK = "black_theme" + const val THEME_AUTO_DEVICE = "auto_device_theme" + + const val TABLET_MODE_AUTO = "auto" + const val TABLET_MODE_ON = "on" + const val TABLET_MODE_OFF = "off" + + const val LIST_VIEW_AUTO = "auto" + const val LIST_VIEW_LIST = "list" + const val LIST_VIEW_GRID = "grid" + const val LIST_VIEW_CARD = "card" + + const val DEFAULT_THEME = THEME_AUTO_DEVICE + const val DEFAULT_NIGHT_THEME = THEME_DARK + const val DEFAULT_TABLET_MODE = TABLET_MODE_AUTO + const val DEFAULT_LIST_VIEW_MODE = LIST_VIEW_AUTO + const val DEFAULT_HOLD_TO_APPEND = true + const val DEFAULT_MAIN_TABS_POSITION = false +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt index 3be0891fc..1494ee56c 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt @@ -33,7 +33,7 @@ import net.newpipe.app.composable.TopAppBar import net.newpipe.app.navigation.Navigator import net.newpipe.app.platform.AppearanceActions import net.newpipe.app.preview.ThemePreviewProvider -import net.newpipe.app.viewmodel.settings.AppearancePreferences +import net.newpipe.app.preferences.AppearancePreferences import net.newpipe.app.viewmodel.settings.AppearanceSettingsViewModel import newpipe.shared.generated.resources.Res import newpipe.shared.generated.resources.auto diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt b/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt index 6501a6255..efc077a3e 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt @@ -22,6 +22,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import com.russhwolf.settings.ObservableSettings +import net.newpipe.app.preferences.AppearancePreferences private val lightScheme = lightColorScheme( primary = primaryLight, @@ -109,18 +110,22 @@ fun currentColorScheme( useDarkTheme: Boolean = isSystemInDarkTheme(), settings: Settings = koinInject() ): ColorScheme { - val theme = rememberSettingString(settings, "theme", "auto_device_theme") - val nightTheme = rememberSettingString(settings, "night_theme", "dark_theme") + val theme = rememberSettingString( + settings, AppearancePreferences.KEY_THEME, AppearancePreferences.DEFAULT_THEME + ) + val nightTheme = rememberSettingString( + settings, AppearancePreferences.KEY_NIGHT_THEME, AppearancePreferences.DEFAULT_NIGHT_THEME + ) val nightScheme = when (nightTheme) { - "black_theme" -> blackScheme + AppearancePreferences.THEME_BLACK -> blackScheme else -> darkScheme } return when (theme) { - "light_theme" -> lightScheme - "dark_theme" -> darkScheme - "black_theme" -> blackScheme + AppearancePreferences.THEME_LIGHT -> lightScheme + AppearancePreferences.THEME_DARK -> darkScheme + AppearancePreferences.THEME_BLACK -> blackScheme else -> if (!useDarkTheme) lightScheme else nightScheme } } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt index 1edf6442c..b3fc19e2d 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt @@ -9,40 +9,9 @@ import androidx.lifecycle.ViewModel import com.russhwolf.settings.Settings import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import net.newpipe.app.preferences.AppearancePreferences import org.koin.core.annotation.KoinViewModel -/** - * Preference keys and values for the Appearance screen. - */ -object AppearancePreferences { - const val KEY_THEME = "theme" - const val KEY_NIGHT_THEME = "night_theme" - const val KEY_HOLD_TO_APPEND = "show_hold_to_append" - const val KEY_TABLET_MODE = "tablet_mode" - const val KEY_LIST_VIEW_MODE = "list_view_mode" - const val KEY_MAIN_TABS_POSITION = "main_tabs_position" - - const val THEME_LIGHT = "light_theme" - const val THEME_DARK = "dark_theme" - const val THEME_BLACK = "black_theme" - const val THEME_AUTO_DEVICE = "auto_device_theme" - - const val TABLET_MODE_AUTO = "auto" - const val TABLET_MODE_ON = "on" - const val TABLET_MODE_OFF = "off" - - const val LIST_VIEW_AUTO = "auto" - const val LIST_VIEW_LIST = "list" - const val LIST_VIEW_GRID = "grid" - const val LIST_VIEW_CARD = "card" - - const val DEFAULT_THEME = THEME_AUTO_DEVICE - const val DEFAULT_NIGHT_THEME = THEME_DARK - const val DEFAULT_TABLET_MODE = TABLET_MODE_AUTO - const val DEFAULT_LIST_VIEW_MODE = LIST_VIEW_AUTO - const val DEFAULT_HOLD_TO_APPEND = true - const val DEFAULT_MAIN_TABS_POSITION = false -} @KoinViewModel class AppearanceSettingsViewModel(private val settings: Settings) : ViewModel() { From d48831777c7dd094f69039016aa6bc84e59b17e2 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 15 Jul 2026 13:39:09 +0100 Subject: [PATCH 045/155] fix settings debug disappearance --- .../kotlin/net/newpipe/app/platform/AndroidBuildInfo.kt | 4 ++-- .../net/newpipe/app/preferences/AppearancePreference.kt | 2 +- .../newpipe/app/screen/settings/AppearanceSettingsScreen.kt | 2 +- .../kotlin/net/newpipe/app/composable/ListPreferenceTest.kt | 6 +++--- .../net/newpipe/app/composable/SwitchPreferenceTest.kt | 2 +- .../app/screen/settings/AppearanceSettingsScreenTest.kt | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidBuildInfo.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidBuildInfo.kt index a32d7ca66..fbcd8ea3b 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidBuildInfo.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidBuildInfo.kt @@ -16,8 +16,8 @@ import org.koin.core.annotation.Singleton @Singleton(binds = [BuildInfo::class]) class AndroidBuildInfo(private val context: Context) : BuildInfo { - override val isDebug: Boolean = - context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0 + override val isDebug: Boolean + get() = (context.applicationInfo.flags and ApplicationInfo.FLAG_DEBUGGABLE != 0) || !isReleaseApk @get:SuppressLint("NewApi") @OptIn(ExperimentalStdlibApi::class) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt index 184b5f6c8..ce3b36584 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt @@ -36,4 +36,4 @@ object AppearancePreferences { const val DEFAULT_LIST_VIEW_MODE = LIST_VIEW_AUTO const val DEFAULT_HOLD_TO_APPEND = true const val DEFAULT_MAIN_TABS_POSITION = false -} \ No newline at end of file +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt index 1494ee56c..0b64a17ab 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt @@ -219,4 +219,4 @@ fun AppearanceSettingsScreenContent( @Composable private fun AppearanceSettingsScreenPreview() { AppearanceSettingsScreenContent() -} \ No newline at end of file +} diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/composable/ListPreferenceTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/composable/ListPreferenceTest.kt index 2e9629ae9..2e88bedfb 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/composable/ListPreferenceTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/composable/ListPreferenceTest.kt @@ -47,8 +47,8 @@ class ListPreferenceTest { ) } - onNodeWithText("Choose").performClick() // open the dialog - onNodeWithText("Option B").performClick() // pick an option + onNodeWithText("Choose").performClick() + onNodeWithText("Option B").performClick() assertEquals("b", selected) } -} \ No newline at end of file +} diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt index d84d9f272..00ea451c4 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt @@ -44,4 +44,4 @@ class SwitchPreferenceTest { onNodeWithText(title).performClick() assertFalse(fired) } -} \ No newline at end of file +} diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreenTest.kt index 1e24f2f01..8cf84925f 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreenTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreenTest.kt @@ -12,7 +12,7 @@ import androidx.compose.ui.test.v2.runComposeUiTest import com.russhwolf.settings.MapSettings import com.russhwolf.settings.Settings import net.newpipe.app.extensions.withKoin -import net.newpipe.app.viewmodel.settings.AppearancePreferences +import net.newpipe.app.preferences.AppearancePreferences import newpipe.shared.generated.resources.Res import newpipe.shared.generated.resources.settings_category_appearance_title import newpipe.shared.generated.resources.theme_title @@ -58,4 +58,4 @@ class AppearanceSettingsScreenTest { } ) } -} \ No newline at end of file +} From 420c87c93c70ced9a88fab3164c550fca834d285 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 22 Jul 2026 12:32:53 +0100 Subject: [PATCH 046/155] theme changes rebuild host activity --- settings.gradle.kts | 3 ++ shared/build.gradle.kts | 1 + .../app/platform/AndroidAppearanceActions.kt | 30 +++++++++++++++++-- .../newpipe/app/platform/AppearanceActions.kt | 2 ++ .../kotlin/net/newpipe/app/theme/Theme.kt | 7 ++++- .../settings/AppearanceSettingsViewModel.kt | 8 ++++- .../app/platform/IOSAppearanceActions.kt | 2 ++ .../app/platform/JVMAppearanceActions.kt | 2 ++ 8 files changed, 50 insertions(+), 5 deletions(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 18dcd9e57..6549b684f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,6 +12,9 @@ pluginManagement { mavenCentral() } } +plugins { + id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" +} dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 3fb1ff097..22adaa51a 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -123,6 +123,7 @@ kotlin { androidMain.dependencies { implementation(libs.jetbrains.compose.preview) implementation(libs.androidx.activity) + implementation(libs.androidx.appcompat) implementation(libs.androidx.preference) implementation(libs.androidx.browser) } diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt index 4d8d69f1a..0267ea980 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt @@ -8,21 +8,45 @@ package net.newpipe.app.platform import android.content.ActivityNotFoundException import android.content.Context import android.content.Intent -import android.provider.Settings +import android.provider.Settings as AndroidSettings +import androidx.appcompat.app.AppCompatDelegate import co.touchlab.kermit.Logger +import com.russhwolf.settings.Settings +import net.newpipe.app.preferences.AppearancePreferences import org.koin.core.annotation.Singleton @Singleton(binds = [AppearanceActions::class]) -class AndroidAppearanceActions(private val context: Context) : AppearanceActions { +class AndroidAppearanceActions( + private val context: Context, + private val settings: Settings, +) : AppearanceActions { override fun openCaptionSettings() { try { context.startActivity( - Intent(Settings.ACTION_CAPTIONING_SETTINGS) + Intent(AndroidSettings.ACTION_CAPTIONING_SETTINGS) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ) } catch (exception: ActivityNotFoundException) { Logger.e(messageString = "No activity found for captioning settings", throwable = exception) } } + + override fun applyThemeChange(theme: String) { + AppCompatDelegate.setDefaultNightMode( + when (theme) { + AppearancePreferences.THEME_LIGHT -> AppCompatDelegate.MODE_NIGHT_NO + + AppearancePreferences.THEME_DARK, + AppearancePreferences.THEME_BLACK -> AppCompatDelegate.MODE_NIGHT_YES + + else -> AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM + } + ) + settings.putBoolean(KEY_THEME_CHANGE, true) + } + + private companion object { + const val KEY_THEME_CHANGE = "key_theme_change" + } } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt b/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt index d27432962..65fd654d0 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt @@ -13,4 +13,6 @@ interface AppearanceActions { * Opens the system captioning settings, where supported. */ fun openCaptionSettings() + + fun applyThemeChange(theme: String) } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt b/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt index efc077a3e..d5f29567e 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/theme/Theme.kt @@ -132,7 +132,12 @@ fun currentColorScheme( /** * Reads a string setting as Compose state, updating when the stored value changes so theme - * edits made elsewhere (e.g. the Appearance screen) apply live without recreating the host. + * edits made elsewhere (e.g. the Appearance screen) re-theme the Compose UI live via + * recomposition + * + * This only covers Compose-rendered UI. Legacy Android Views screens are re-themed separately + * (global AppCompatDelegate day/night mode + the KEY_THEME_CHANGE recreate flag consumed by + * MainActivity.onResume), driven from AppearanceActions.applyThemeChange. */ @Composable private fun rememberSettingString( diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt index b3fc19e2d..c6602dd50 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt @@ -9,12 +9,16 @@ import androidx.lifecycle.ViewModel import com.russhwolf.settings.Settings import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import net.newpipe.app.platform.AppearanceActions import net.newpipe.app.preferences.AppearancePreferences import org.koin.core.annotation.KoinViewModel @KoinViewModel -class AppearanceSettingsViewModel(private val settings: Settings) : ViewModel() { +class AppearanceSettingsViewModel( + private val settings: Settings, + private val appearanceActions: AppearanceActions, +) : ViewModel() { val theme: StateFlow field = MutableStateFlow( @@ -64,11 +68,13 @@ class AppearanceSettingsViewModel(private val settings: Settings) : ViewModel() fun setTheme(value: String) { settings.putString(AppearancePreferences.KEY_THEME, value) theme.value = value + appearanceActions.applyThemeChange(value) } fun setNightTheme(value: String) { settings.putString(AppearancePreferences.KEY_NIGHT_THEME, value) nightTheme.value = value + appearanceActions.applyThemeChange(theme.value) } fun setHoldToAppend(value: Boolean) { diff --git a/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt index fa6e5ad46..3911ea203 100644 --- a/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt +++ b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt @@ -10,4 +10,6 @@ import org.koin.core.annotation.Singleton @Singleton(binds = [AppearanceActions::class]) class IOSAppearanceActions : AppearanceActions { override fun openCaptionSettings() = Unit + + override fun applyThemeChange(theme: String) = Unit } diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt index 05e8b9ef9..e30360d45 100644 --- a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt @@ -10,4 +10,6 @@ import org.koin.core.annotation.Singleton @Singleton(binds = [AppearanceActions::class]) class JVMAppearanceActions : AppearanceActions { override fun openCaptionSettings() = Unit + + override fun applyThemeChange(theme: String) = Unit } From 4c0699a75b6b0cf18442b7de424eb5731fe1da60 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 22 Jul 2026 20:33:33 +0100 Subject: [PATCH 047/155] hide caption setting on platforms without support --- .../app/platform/AndroidAppearanceActions.kt | 4 ++++ .../net/newpipe/app/platform/AppearanceActions.kt | 2 ++ .../screen/settings/AppearanceSettingsScreen.kt | 15 ++++++++++----- .../newpipe/app/platform/IOSAppearanceActions.kt | 3 +++ .../newpipe/app/platform/JVMAppearanceActions.kt | 3 +++ 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt index 0267ea980..4520e1cd8 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidAppearanceActions.kt @@ -21,6 +21,10 @@ class AndroidAppearanceActions( private val settings: Settings, ) : AppearanceActions { + override fun isCaptionSettingsAvailable(): Boolean = + Intent(AndroidSettings.ACTION_CAPTIONING_SETTINGS) + .resolveActivity(context.packageManager) != null + override fun openCaptionSettings() { try { context.startActivity( diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt b/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt index 65fd654d0..1573896ed 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/platform/AppearanceActions.kt @@ -14,5 +14,7 @@ interface AppearanceActions { */ fun openCaptionSettings() + fun isCaptionSettingsAvailable(): Boolean + fun applyThemeChange(theme: String) } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt index 0b64a17ab..2bd9f3c76 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/AppearanceSettingsScreen.kt @@ -76,6 +76,7 @@ fun AppearanceSettingsScreen( val tabletMode by viewModel.tabletMode.collectAsStateWithLifecycle() val listViewMode by viewModel.listViewMode.collectAsStateWithLifecycle() val mainTabsPosition by viewModel.mainTabsPosition.collectAsStateWithLifecycle() + val captionSettingsAvailable = remember { appearanceActions.isCaptionSettingsAvailable() } AppearanceSettingsScreenContent( theme = theme, @@ -90,6 +91,7 @@ fun AppearanceSettingsScreen( onTabletModeChange = viewModel::setTabletMode, onListViewModeChange = viewModel::setListViewMode, onMainTabsPositionChange = viewModel::setMainTabsPosition, + captionSettingsAvailable = captionSettingsAvailable, onCaptionSettingsClick = appearanceActions::openCaptionSettings, onNavigateUp = { navigator.navigateUp() } ) @@ -109,6 +111,7 @@ fun AppearanceSettingsScreenContent( onTabletModeChange: (String) -> Unit = {}, onListViewModeChange: (String) -> Unit = {}, onMainTabsPositionChange: (Boolean) -> Unit = {}, + captionSettingsAvailable: Boolean = true, onCaptionSettingsClick: () -> Unit = {}, onNavigateUp: () -> Unit = {} ) { @@ -199,11 +202,13 @@ fun AppearanceSettingsScreenContent( selectedValue = listViewMode, onValueSelected = onListViewModeChange ) - PreferenceRow( - title = stringResource(Res.string.caption_setting_title), - summary = stringResource(Res.string.caption_setting_description), - onClick = onCaptionSettingsClick - ) + if (captionSettingsAvailable) { + PreferenceRow( + title = stringResource(Res.string.caption_setting_title), + summary = stringResource(Res.string.caption_setting_description), + onClick = onCaptionSettingsClick + ) + } SwitchPreference( title = stringResource(Res.string.main_tabs_position_title), summary = stringResource(Res.string.main_tabs_position_summary), diff --git a/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt index 3911ea203..b3363c0cd 100644 --- a/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt +++ b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSAppearanceActions.kt @@ -9,6 +9,9 @@ import org.koin.core.annotation.Singleton @Singleton(binds = [AppearanceActions::class]) class IOSAppearanceActions : AppearanceActions { + + override fun isCaptionSettingsAvailable() = false + override fun openCaptionSettings() = Unit override fun applyThemeChange(theme: String) = Unit diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt index e30360d45..ff96862cc 100644 --- a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt @@ -9,6 +9,9 @@ import org.koin.core.annotation.Singleton @Singleton(binds = [AppearanceActions::class]) class JVMAppearanceActions : AppearanceActions { + + override fun isCaptionSettingsAvailable() = false + override fun openCaptionSettings() = Unit override fun applyThemeChange(theme: String) = Unit From 8e82fb44bf81d82a7595061c289d2c0a0906d77b Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 22 Jul 2026 21:24:24 +0100 Subject: [PATCH 048/155] handle jvm captions for different desktop platforms --- .../app/platform/JVMAppearanceActions.kt | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt index ff96862cc..51b357452 100644 --- a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt @@ -5,14 +5,49 @@ package net.newpipe.app.platform +import co.touchlab.kermit.Logger import org.koin.core.annotation.Singleton +import java.io.IOException @Singleton(binds = [AppearanceActions::class]) class JVMAppearanceActions : AppearanceActions { - override fun isCaptionSettingsAvailable() = false + private val captionSettingsCommand: List? = when (currentOs()) { + DesktopOs.WINDOWS -> + // Closed-caption styling page + listOf("cmd", "/c", "start", "", "ms-settings:easeofaccess-closedcaptioning") - override fun openCaptionSettings() = Unit + // Subtitles & captions styling pane. This is community-documented,so on newer macOS it may open the Accessibility pane without directing to Captions. + DesktopOs.MAC -> + listOf("open", "x-apple.systempreferences:com.apple.preference.universalaccess?Captions") + + // Nothing for Linux yet + DesktopOs.LINUX, + DesktopOs.UNKNOWN -> null + } + + override fun isCaptionSettingsAvailable() = captionSettingsCommand != null + + override fun openCaptionSettings() { + val command = captionSettingsCommand ?: return + try { + ProcessBuilder(command).start() + } catch (exception: IOException) { + Logger.e(messageString = "Could not open caption settings", throwable = exception) + } + } override fun applyThemeChange(theme: String) = Unit -} + + private enum class DesktopOs { WINDOWS, MAC, LINUX, UNKNOWN } + + private fun currentOs(): DesktopOs { + val osName = System.getProperty("os.name").orEmpty().lowercase() + return when { + osName.startsWith("windows") -> DesktopOs.WINDOWS + osName.startsWith("mac") -> DesktopOs.MAC + osName.contains("nux") || osName.contains("nix") || osName.contains("aix") -> DesktopOs.LINUX + else -> DesktopOs.UNKNOWN + } + } +} \ No newline at end of file From 3195a067558f4bc906fceff7b14d7b82ef3bcc08 Mon Sep 17 00:00:00 2001 From: graue70 <23035329+graue70@users.noreply.github.com> Date: Sat, 19 Sep 2026 23:19:29 +0200 Subject: [PATCH 049/155] use app locale instead of content locale for local list dates --- .../java/org/schabi/newpipe/local/LocalItemListAdapter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java index 6bbe536e3..60ca2b1ae 100644 --- a/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/local/LocalItemListAdapter.java @@ -100,7 +100,7 @@ public class LocalItemListAdapter extends RecyclerView.Adapter(); dateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT) - .withLocale(Localization.getPreferredLocale(context)); + .withLocale(Localization.getAppLocale()); } public void setSelectedListener(final OnClickGesture listener) { From d4eb42edcebca77acb18c783edf8b505e8f5489b Mon Sep 17 00:00:00 2001 From: wized2 Date: Mon, 21 Sep 2026 01:31:16 +0000 Subject: [PATCH 050/155] fix: log stream progress save errors with Log.e instead of printStackTrace --- app/src/main/java/org/schabi/newpipe/player/Player.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 0b4c9884b..b5b2228ca 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -1873,7 +1873,7 @@ public final class Player implements PlaybackListener, Listener { .observeOn(AndroidSchedulers.mainThread()) .doOnError(e -> { if (DEBUG) { - e.printStackTrace(); + Log.e(TAG, "Failed to save stream progress state", e); } }) .onErrorComplete() From 517281c5e6554c2afaaf1704659d1926eafaccf3 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 24 Sep 2026 21:51:42 +0200 Subject: [PATCH 051/155] Translated using Weblate (Ukrainian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Co-authored-by: Arka Biswas Co-authored-by: B o d o Co-authored-by: Danial Behzadi Co-authored-by: Dot Max Co-authored-by: Edward Thomson Co-authored-by: Femini Co-authored-by: Fjuro Co-authored-by: Ghost of Sparta Co-authored-by: Goudarz Jafari Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: Irene Co-authored-by: Joel A Co-authored-by: Mickaël Binos Co-authored-by: Priit Jõerüüt Co-authored-by: Trunars Co-authored-by: VfBFan Co-authored-by: Yauhen Co-authored-by: justcontributor Co-authored-by: lellyrt215 Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/bn_BD/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/id/ Translation: NewPipe/Metadata --- app/src/main/res/values-af/strings.xml | 32 +++++++++++++ app/src/main/res/values-az/strings.xml | 8 ++-- app/src/main/res/values-be/strings.xml | 18 +++---- app/src/main/res/values-bg/strings.xml | 24 +++++----- app/src/main/res/values-bn-rBD/strings.xml | 47 +++++++++++-------- app/src/main/res/values-cs/strings.xml | 8 ++-- app/src/main/res/values-de/strings.xml | 4 +- app/src/main/res/values-et/strings.xml | 34 +++++++------- app/src/main/res/values-fa/strings.xml | 4 ++ app/src/main/res/values-fr/strings.xml | 20 ++++---- app/src/main/res/values-hu/strings.xml | 12 ++--- app/src/main/res/values-in/strings.xml | 16 ++++--- app/src/main/res/values-ko/strings.xml | 20 ++++---- app/src/main/res/values-pt-rBR/strings.xml | 14 +++--- app/src/main/res/values-sv/strings.xml | 22 ++++----- app/src/main/res/values-uk/strings.xml | 14 +++--- app/src/main/res/values-zh-rCN/strings.xml | 20 ++++---- .../android/bn_BD/changelogs/1015.txt | 1 + .../metadata/android/id/changelogs/1015.txt | 1 + 19 files changed, 183 insertions(+), 136 deletions(-) create mode 100644 fastlane/metadata/android/bn_BD/changelogs/1015.txt create mode 100644 fastlane/metadata/android/id/changelogs/1015.txt diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index ec5d4af01..97e64811b 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -24,4 +24,36 @@ Geskiedenis en kas Opdateerings Rugsteun en herstel + NewPipe Besonderhede + Derdeparty Lisensies + Besonderhede & Gereelde Vrae + Lisensies + Libre liggewig streaming op Android. + Dra by + Of jy Ideas het vir; vertaling, ontwerp veranderinge, kode netjies maak, of groot kode veranderinge - hulp word altyd waardeer. Hoe meer gedoen word, hoe beter raak dit! + Bekyk op GitHub + NewPipe word ontwikkel deur vrywilligers wat hul vrye tyd gebruik om die beste verbruikers ondervinding te bring. Gee terug om die ontwikkelaars te help om NewPipe nog beter te maak terwyl hulle n koffie geniet. + NewPipe Se Lisensie + NewPipe is n kopielinks sagteware: Jy mag dit gebruik, bestudeer, uitdeel en verbeter net soos jy lus kry. Meer spesifiek mag jy dit uitdeel en/ of verander onder die voorwardes van die GNU \"General Public License\" soos dit gepubliseer is deur die \"Free Software Foundation\", of weergawe 3 van die lisensie of enige latere weergawe. + Foute Herstel + Tema + Lig + Donker + Swart + Outomaties + Nag Tema + Jy kan jou gunstelling nag tema hieronder kies + Tabletmodus + Lysaansigmodus + Onderskrifte + Verandering van speler onderskrifte se skaal en agtergrond style. Vir verandering om in werking te tree moet die toepassing herbegin word + Hoofoortjie posisie + Skyf Hoofoortjie posisie kieser na die onderkant + Outo + Aan + Af + Lys + Grid + Kaartjie + Kanselleer diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index facad7f10..4de1a8bb2 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -5,7 +5,7 @@ Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın\? Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC quraşdıra bilərsiniz). Quraşdır - Ləğv et + İmtina et Brauzerdə aç Paylaş Yüklə @@ -436,7 +436,7 @@ Yeniləmələri yoxla Axtarış çubuğunun miniatür önizləməsi Əməliyyat sistem tərəfindən ləğv edildi - Avto + Avtomatik Tapılmadı Server məlumat göndərmir Bu endirməni bərpa etmək mümkün deyil @@ -472,7 +472,7 @@ Çəkməcəni Bağla Video oynadıcı Video fayl xülasəsi prosesi üçün bildirişlər - Aç + Aktiv et Miniatürü 1:1 görünüş nisbətinə kəs Yayım yaradıcısı, məzmunu və ya axtarış sorğusu haqqında əlavə məlumat olan üst məlumat qutularını gizlətmək üçün söndür Əlaqəli yayımı əlavə etməklə (təkrarlanmayan) sonlanacaq oynatma növbəsini davam etdir @@ -505,7 +505,7 @@ Açıqlamadakı mətni seçməyi aktivləşdir Etiketlər Planşet rejimi - Bağla + Bağlı Müəllifdən ürəkləndi Veb saytı aç diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index dd19b5c6e..5b58fe124 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -331,7 +331,7 @@ Укладкі, бачныя на галоўнай старонцы Абнаўленні Паказваць апавяшчэнне пры наяўнасці новай версіі - Выгляд спіса + Рэжым спіса Спіс Сетка Аўтаматычна @@ -479,14 +479,14 @@ Падпіскі не выбраны Апошняе абнаўленне: %s Аўтаматычна (тэма прылады) - Выберыце любімую начную тэму - %s - Дазвол вылучэння тэксту ў апісанні - Вы можаце выбраць сваю любімую начную тэму ніжэй + Выберыце ўлюбёную начную тэму - %s + Дазволіць вылучэнне тэксту ў апісанні + Улюбёную начную тэму можна выбраць ніжэй Параметр даступны, толькі калі выбрана тэма %s Спампоўванне пачалося Апавяшчэнні адключаны Рэжым планшэта - Адключыць + Выключыць Няма аўдыяпатокаў даступных для знешніх плэераў Апавяшчаць Няма відэапатокаў даступных для знешніх плэераў @@ -540,7 +540,7 @@ Стварыць паведамленне пра памылку Выберыце падпіскі Імпартуйце або экспартуйце падпіскі праз меню з трыма кропкамі ⁝ - Забарона вылучэння тэксту ў апісанні + Забараніць вылучэнне тэксту ў апісанні Хуткі рэжым Калі ў вас узніклі праблемы з выкарыстаннем праграмы, абавязкова азнаёмцеся з адказамі на частыя пытанні! Адключыць тунэляванне мультымедыя @@ -754,7 +754,7 @@ Загрузка метаданых… Змяніць арыентацыю экрана Нізкая якасць - Размяшчэнне асноўных укладак + Размяшчэнне ўкладак Пераключыцца ў поўнаэкранны рэжым Атрыманне ўкладак канала Аватары @@ -776,7 +776,7 @@ Банеры Плэй-лісты - %1$s: %2$s - Перамясціць панэль укладак уніз + Перамясціць радок укладак уніз Няма жывых трансляцый Выберыце якасць відарысаў ці ўвогуле не загружаць відарысы, каб паменшыць выкарыстанне даных і памяці. Змены ачышчаюць кэш відарысаў у памяці і на дыску (%s) Прайграць @@ -832,7 +832,7 @@ Аб\'яднаныя трэнды YouTube выдалены Імпартаваць падпіскі Экспартаваць падпіскі - У жніўні 2025 года Google абвясціў, што з верасня 2026 года для ўсталявання праграм для Android на сертыфікаваныя прылады будзе патрабавацца праверка распрацоўшчыка. Гэта тычыцца і тых праграм, што ўсталёўваюцца па-за Play Store. Паколькі распрацоўшчыкі NewPipe не згодныя з гэтым патрабаваннем, пасля гэтага часу NewPipe больш не будзе працаваць на сертыфікаваных прыладах Android. + У жніўні 2025 года Google абвясціў, што з верасня 2026 года распрацоўшчыкі праграм Android павінны рэгістравацца, каб мець магчымасць ўсталявання сваіх праграм на сертыфікаваныя прылады. Гэта тычыцца і праграм, якія ўсталёўваюцца не з Play Store. Паколькі распрацоўшчыкі NewPipe не згодныя з такім патрабаваннем, пасля гэтага часу NewPipe больш не будзе працаваць на сертыфікаваных прыладах Android. Падрабязнасці Рашэнне Каб выкарыстоўваць аконны прайгравальнік, у наступным меню налад Android выберыце %1$s і ўключыце %2$s. diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index dff8efa44..088996bc5 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -4,7 +4,7 @@ Публикувано на %1$s Не е намерен стрийм плейър. Инсталиране на VLC\? Инсталиране - Отмяна + Отказ Отвори в браузър Отваряне в прозорец Споделяне @@ -42,7 +42,7 @@ Аудио Аудио формат по подразбиране Видео формат по подразбиране - Тема на външния вид + Тема Светла Тъмна Черна @@ -270,8 +270,8 @@ Запълни Увеличи Авто-генерирани - Надписи - Модифицирай текстовия мащаб на надписите и стила на техния фон. За промените се изисква рестарт на приложението + Субтитри + Промяна на мащаба на текста на надписите на плейъра и стиловете на фона. Изисква се рестартиране на приложението, за да влезе в сила Следенето за пропускане на памет може да направи приложението нестабилно Докладвай за извънредни грешки Внасяне @@ -355,7 +355,7 @@ Местни предложения за търсене Моля проверете дали има създадена дискусия за срив като този. Постъпилите дубликати са в ущърб на така ценното време за разработка. Покажи мета данни - Мрежа + Решетка Списък Четвърто действие Стъпка на превъртане @@ -369,7 +369,7 @@ Автоматично Изключете за скриване на описанията под видеата и допълнителната информация Само при Wi-Fi - Вид на списъка + Режим на списъчен изглед Възстанови последната позиция Нова версия на NewPipe е налична! Миниатюри на лентата за превъртане @@ -419,8 +419,8 @@ Поверителност Език Вътрешен - Включен - Изключен + Включено + Изключено Отвори уеб-страницата Отбелязан със сърце от автора Конференции @@ -517,7 +517,7 @@ Това видео е с възрастова граница. \n \nВключете „%1$s“ в настройките ако искате да го пуснете. - Автоматична (тази на устройството) + Автоматична (тема на устройството) Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания) Избете плейлист Известия @@ -580,8 +580,8 @@ Грешка при зареждане на емисия Покажи/Скрий потоци Съдържанието е лично, затова не може да бъде възпроизведено или изтеглено от NewPipe. - Можете да изберете любимата си тъмна тема по-долу - Режим таблет + Можете да изберете любимата си нощна тема по-долу + Режим на таблет Абонати Избраният поток не се поддъжа от външни плеъри Настройки на ExoPlayer @@ -782,7 +782,7 @@ Известия за напредъка на хеширането на видео Нови потоци Известие за доклад за грешка - Преместете основния селектор на раздели най-долу + Преместване на селектора на главни раздели надолу NewPipe откри грешка, докоснете, за да докладвате Няма потоци Деактивиране на медийното тунелиране diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 0d82e434b..972867b04 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -5,7 +5,7 @@ কোন স্ট্রিম প্লেয়ার নেই। VLC ইনস্টল করতে চান\? ইনস্টল বাতিল - ব্রাউজারে ওপেন করুন + ব্রাউজারে খুলুন পপ-আপ মোডে ওপেন করো শেয়ার ডাউনলোড @@ -45,7 +45,7 @@ URL সমর্থিত নয় কন্টেন্ট এর জন্য পছন্দসই ভাষা ভিডিও এবং অডিও - অ্যাপিয়ারেন্স + উপস্থিতি ব্যাকগ্রাউন্ডে চলছে পপআপ মোডে চলছে কন্টেন্ট @@ -112,14 +112,14 @@ দেখার ইতিহাস প্লেয়ার ব্যাবহার - ইতিহাস + ইতিহাস এবং ক্যাশ ডিবাগ সবসময় একবার মাত্র [অজানা] কোন ভিউ নেই নাম পরিবর্তন করুন - ওয়েবসাইট + ওয়েবসাইট কোন স্ট্রিম প্লেয়ার নেই (প্লে করতে VLC ইন্সটল করতে পারেন)। কিছু কিছু রেজ্যুলেশনে অডিও বন্ধ করে দেয় সাবস্ক্রাইব @@ -150,8 +150,8 @@ অনুসন্ধানকালীন কী পরামর্শ দেওয়া হবে তা বাছুন অনুসন্ধানের পরামর্শ ফলাফল দেখাচ্ছে: %s এর জন্যে - সম্পর্কিত - নিউপাইপ এর সম্বন্ধে + পরিচিতি ও প্রশ্নসমূহ + নিউপাইপ ব্যাপারে ট্রেন্ডিং নতুন ফিড লোড হচ্ছে… @@ -194,13 +194,13 @@ খালি পাতা সবথেকে বেশি চালানো শেষ চালানো - লাইসেন্স পড়ুন - নিউপাইপ এর লাইসেন্স - প্রাইভেসি পলিসি পড়ুন - নিউপাইপ এর গোপনীয়তা নীতি - ফিরিয়ে দিন - গিটহাব এ দেখুন - থার্ড-পার্টি লাইসেন্স সমূহ + অনুমতিসমূহ পড়ুন + নিউপাইপের অনুমতি + পড়ুন গোপনীয়তার নীতিমালা + নিউপাইপের গোপনীয়তার নীতি + ফিরিয়ে দিন + গিটহাবে দেখুন + তৃতীয়পক্ষ অনুমতি শব্দ ও নম্বর একটি আইটেম ডিলিট হয়েছে। কোন মন্তব্য নেই @@ -254,9 +254,9 @@ পিয়ার টিউব এর ইন্সটান্স সমূহ ছক স্থানীয় - হয়েছে + হয়েছে ইভেন্টগুলো - আপডেট + আপডেটস কোনোটি না স্বীকার করো অস্বীকার করো @@ -277,9 +277,9 @@ বের করা হয়েছে ইতিহাস ইতিহাস - অনুমতিপত্র - দান করো - স্বেচ্ছাস্বেবা + অনুমতিসমূহ + অনুদান + অনুদান ডাউনলোড সরাও তৈরি করো @@ -324,7 +324,7 @@ %d মিনিট %d মিনিট - আরও তথ্য এবং খবরের জন্য নিউপাইপ ওয়েবসাইট দেখো। + আরো তথ্য ও খবরের জন্য যান নিউপাইপ ওয়েবসাইটে । দিয়ে খুলো মতামত বন্ধ @@ -433,7 +433,7 @@ অপেক্ষমাণ সারি বাদ দেওয়ার আগে নিশ্চিত হতে জিজ্ঞেস করো শিশুদের জন্য বয়সসীমার কারণে অনুপযোগী হতে পারে এমন কন্টেন্ট দেখাও (যেমন ১৮+) প্লে করা স্ট্রিমসমূহের ইতিহাস এবং প্লেব্যাক অবস্থানসমূহ মুছে দেবে - নোটিফিকেশনসমূহ + নটিফিকেশনস ত্রুটি প্রতিবেদন এর নোটিফিকেশন ইতিহাস, সাবস্ক্রিপশন্স, প্লেলিস্ট ও সেটিংস রপ্তানি করো কোনো ডাউনলোড ফোল্ডার ঠিক করা নেই, এখন ডিফল্ট ডাউনলোড ফোল্ডার বাছুন @@ -447,4 +447,11 @@ ট্যাগসমূহ অ্যান্ড্রয়েডকে থাম্বনেইলের প্রধান রং অনুযায়ী রঙিন করুন (উল্লেখ্য যে, এটি সব ডিভাইসে উপলব্ধ নয়) অজানা ধরন + ভাষান্তর , কোড মোছা অথবা প্রয়োজনীয় গুরুত্বপূর্ণ কোড সমন্বয় করার মতো এমন ধারনা যদি আপনার থেকে থাকে তা সব সময় সাদরে গৃহীত হবে । যত উন্নত করা হবে ততই এটি ভালো হয়ে উঠবে ! + সেচ্ছাসেবক কারিগর নিজেদের অবসর সময়ে তৈরি করেছে নিউপাইপ যা আপনাকে দেয় সেরা ব্যবহাকারি অভিজ্ঞতা । কারিগরদের বিনিময়ে সাহায্য করুন যাতে নিউপাইপ আরো উন্নত হয় যেইসময়টাতে তারা তাদের এককাপ কফি উপোভোগ করছে । + নিউপাইপ হলো বিনামূল্যের কপিলেফট সফটও্যয়ার । যা আপনি ব্যবহার,চর্চা,ভাগাভাগি এবং স্বেচ্ছায় উন্নত করতে পারেন । বিশেষ করে এটিকে আপনি পূনর্প্রদান এবং পরিবর্তন করতে পারেন মুক্ত সফটও্যয়ার প্রতিষ্ঠানের প্রকাশিত GNU ( General Public License) এর মাধ্যমে, হয় অনুমতি পত্রের ৩য় তম সংস্করণ অথবা পুরোনো কোনো সংস্করণ অনুযায়ী ( আপনার যেটি ইচ্ছা) । + প্রায়ই জিজ্ঞেস করা প্রশ্নসমূহ + আপনার যদি এই অ্যাপ ব্যবহারে অসুবিধে হয়, তবে এইসব সাধারন প্রশ্ন গুলোর উত্তরসমূহ অবশ্যই দেখেনিন । + ওয়েবসাইটে দেখুন + সংরক্ষণ এবং পুনরুদ্ধার diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index c77d895e0..3058f2ec2 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -295,7 +295,7 @@ Preferovaná akce „otevření“ Výchozí chování při otevírání obsahu — %s Titulky - Upravuje velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace + Upravit velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace Vymazat historii sledování Vymaže historii přehraných streamů pozic playbacku Vymazat celkovou historii sledování\? @@ -585,9 +585,9 @@ Vypnout pro skrytí popisu videa a doplňkové informace Zbořit aplikaci Stahování bylo zahájeno - Níže si můžete zvolit svůj oblíbený motiv + Svůj oblíbený noční motiv si můžete zvolit níže Zvolte si svůj oblíbený noční motiv – %s - Automatický (motiv zařízení) + Automaticky (podle zařízení) Radio Představujeme Tento obsah je dostupný jen platícím uživatelům, a tak jej NewPipe nemůže stáhnout ani přehrát. @@ -717,7 +717,7 @@ Rychlý režim Používáte nejnovější verzi NewPipe Importujte nebo exportujte odběry z 3tečkové nabídky - Tato možnost je dostupná pouze při vybraném motivu %s + Tato možnost je dostupná pouze, když je zvolen motiv %s Zrušení nastavení trvalého náhledu Karta Kopírování do schránky se nezdařilo diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index c312bd7a1..465588f46 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -21,7 +21,7 @@ Option anzeigen, um Videos mit Kodi abzuspielen Audio Bevorzugtes Audioformat - Download + Herunterladen „Nächste“ und „Ähnliche“ Videos anzeigen Nicht unterstützte URL Video und Audio @@ -591,7 +591,7 @@ Lösen Download hat begonnen Du kannst dein bevorzugtes Nachtdesign unten auswählen - Wähle dein bevorzugtes Nachtdesign — %s + Wähle dein bevorzugtes Nachtdesign aus — %s Automatisch (Gerätedesign) Nachtdesign Kanaldetails anzeigen diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index a3b52a4b8..122914e09 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -6,13 +6,13 @@ Voogesituseks puudub pleier (selleks saad paigaldada VLC). Paigalda Tühista - Ava veebilehitsejas + Ava veebibrauseris Ava hüpikaknas Jaga Allalaadimine Laadi voog alla Otsi - Seaded + Seadistused Kas mõtlesid: \"%1$s\"\? Jaga Kasuta välist videopleierit @@ -47,10 +47,10 @@ Heli Heli vaikevorming Video vaikevorming - Teema - Hele - Tume - Must + Kujundus + Hele kujundus + Tume kujundus + Süsimust kujundus Pea hüpikakna suurus ja asukoht meeles Pea hüpikakna viimane suurus ja asukoht meeles Kasuta ebatäpset kerimist @@ -78,10 +78,10 @@ Sisu vaikimisi keel Pleier Käitumine - Pilt ja heli + Video ja heli Ajalugu ja vahemälu Välimus - Silumine + Veaotsing Taasesitus taustal Taasesitus hüpikaknas Sisu @@ -200,7 +200,7 @@ Litsentsid Tee kaastööd Vaata GitHubis - Anneta + Toeta meid rahaliselt Veebisait Täiendava info ja uudiste lugemiseks külasta NewPipe\'i veebisaiti. NewPipe\'i andmekaitsepõhimõtted @@ -299,11 +299,11 @@ reCAPTCHA nõude taotlus © %1$s %2$s %3$s alla Vaba ja lihtne voogesitus Androidis. - Kui sul on ideid kujunduse muutmisest, koodi puhastamisest või suurtest koodi muudatustest - abi on alati teretulnud. Mida rohkem tehtud, seda paremaks läheb! - NewPipe\'i arendajad on vabatahtlikud, kes kulutavad oma vaba aega, toomaks sulle parimat kasutuskogemust. On aeg anda tagasi aidates arendajaid ja muuta NewPipe veel paremaks, nautides ise tassi kohvi. - Anneta + Kui sul on ideid kujunduse muutmise, koodi puhastamise või suurema edasiarenduse osas - abi on alati teretulnud. Mida rohkem tehtud, seda paremaks läheb! + NewPipe\'i arendajad on vabatahtlikud, kes kulutavad oma vaba aega, toomaks sulle parimat kasutuskogemust. On aeg anda tagasi aidates arendajaid ja muuta NewPipe\'i veel paremaks, nautides ise tassi kohvi. + Anna kogukonnale tagasi NewPipe võtab privaatsust väga tõsiselt. Seetõttu ei kogu rakendus ilma nõusolekuta mingeid andmeid. \nNewPipe\'i andmekaitsepõhimõtted selgitavad üksikasjalikult, milliseid andmeid saadetakse ja kogutakse veateate saatmisel. - NewPipe on vaba ja avatud lähtekoodiga tarkvara. Seada võid kasutada, uurida, jagada ja parandada nii, nagu õigemaks pead. Täpsemalt - seda võid levitada ja/või muuta vastavalt Vaba Tarkvara Sihtasutuse avaldatud GNU Üldise Avaliku Litsentsi v.3 (või sinu valikul hilisema versiooni) tingimustele. + NewPipe on vaba ja avatud lähtekoodiga tarkvara. Seda võid kasutada, uurida, jagada ja parandada nii, nagu õigemaks pead. Täpsemalt - seda võid levitada ja/või muuta vastavalt Vaba Tarkvara Sihtasutuse avaldatud GNU Üldise Avaliku Litsentsi v.3 (või sinu valikul hilisema versiooni) tingimustele. Teavita elutsüklist väljas vigadest Impordi SoundCloudi profiil trükkides URL või oma ID: \n @@ -326,7 +326,7 @@ Jõusta väljaspool fragmenti või elutsüklit olevate kättetoimetamatute Rx erindite raporteerimine nende vabastamise järgselt Lõpeta tellimine Vali vahekaart - Uuendused + Tarkvarauuendused Sündmused Fail kustutati Rakenduse värskenduse teavitus @@ -428,9 +428,9 @@ Lahenda Esiletõstetud Raadio - Automaatne (seadme teema) + Automaatne (seadme kujundus) Vali eelistatud teema öiseks kasutuseks — %s - Järgnevalt saad sa valida sobiva teema öiseks kasutuseks + Võid alljärgnevast valida sulle sobivaima öise kujunduse Allalaadimine algas Sarnane meedia Näita kanali lisateavet @@ -470,7 +470,7 @@ YouTube\'is leiduv „Piiratud režiim“ peidab võimaliku täiskasvanutele mõeldud sisu Näita sisu, mis vanusepiirangu tõttu ilmselt ei sobi lastele (näiteks 18+) Sa saad kasutada vaid HTTPS-urle - Öine teema + Öine kujundus Ei iialgi Vaid Wi-Fi võrgus Alusta esitamist automaatselt — %s diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 82fe492dd..5367b640c 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -855,4 +855,8 @@ نیوپایپ دارد پشتیبانی از اندروید ۵ را رها می‌کند هنگام پخش کردن کارساز خطای HTTP ‏%1$s داد برای استفاده از پخش‌کنندهٔ بالاپریدنی %1$s را در فهرست تنظیمات اندروید زیر گزیده و %2$s را به کار بیندازید. + پادپخش‌ها + دوره‌ها + سوندکلود جدول ۵۰ اثر برتر اصلی را متوقّف کرد. زبانهٔ متناظر از صفحهٔ اصلیتان برداشته شد. + یوتوب از تاریخ ۳ مرداد ۱۴۰۴، صفحهٔ داغ‌های ترکیبی را متوقّف کرده است. نیوپایپ صفحهٔ داغ پیش‌گزیده را با پخش زنده‌های داغ جایگزین کرده است.\n\nهمچنین می‌توانید صفحات داغ مختلف را در «تنظیمات > محتوا > محتوای صفحه اصلی» بگزینید. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ec768fb43..b631684de 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -34,7 +34,7 @@ Utiliser un lecteur audio externe Lecture en arrière-plan Thème - Thème de nuit + Thème « Nuit » Sombre Clair Noir @@ -293,8 +293,8 @@ Ouvrir de préférence avec Action par défaut lors de l’ouverture de contenu — %s Aucun flux disponible au téléchargement - Sous-titres - Modifier la taille du texte et les styles d’arrière-plan des sous-titres du lecteur. Le redémarrage de l’application est requis pour appliquer les changements + Légendes + Modifier la taille du texte des légendes du lecteur et les styles d\'arrière-plan. Un redémarrage de l\'application est nécessaire pour que les modifications prennent effet. Ton Effacer l’historique des vues Supprime l’historique des flux lus et des positions de reprise de lecture @@ -371,7 +371,7 @@ Introuvable Interrompre sur les connexions limitées Utile lors du basculement aux données mobiles, bien que certains téléchargements ne peuvent pas être suspendus - Mode de vue en liste + Mode d\'affichage sous forme de liste post-traitement Ajouter à la file Action refusée par le système @@ -597,9 +597,9 @@ Radio Présentés Résoudre - Automatique (thème de l’appareil) + Automatique (thème de l\'appareil) Sélectionne votre thème de nuit favori — %s - Vous pouvez sélectionner votre thème de nuit favori ci-dessous + Vous pouvez choisir ci-dessous votre thème nocturne préféré Le téléchargement a démarré Afficher les détails de la chaîne Désactivez la tunnelisation multimédia si vous constatez un écran noir ou un bégaiement lors de la lecture d’une vidéo. @@ -625,8 +625,8 @@ Impossible de charger le flux \'%s\'. Erreur lors du chargement du flux Il vous sera demandé où enregistrer chaque téléchargement - Inactif - Actif + Off + On Mode tablette Le compte de l’auteur a été résilié. \nNewPipe ne sera plus en mesure de charger ce flux à l’avenir. @@ -764,8 +764,8 @@ Sélectionner une piste audio avec des descriptions pour les personnes malvoyantes si disponible Sélectionner la piste audio pour les lecteurs externes Activez cette option si vous rencontrez des problèmes d\'initialisation des décodeurs, ce qui permet de revenir à des décodeurs moins prioritaires si l\'initialisation des décodeurs primaires échoue. Les performances de lecture peuvent être moins bonnes que lors de l\'utilisation des décodeurs primaires - Déplacer le sélecteur d\'onglet principal en bas - Position des onglets principaux + Déplacer le sélecteur d\'onglets principal vers le bas + Emplacement des onglets principaux La tunnelisation multimédia a été désactivée par défaut sur votre appareil car votre modèle d\'appareil est connu pour ne pas la supporter. Aucun flux Aucun direct diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 21d8143ad..07ef58478 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -258,7 +258,7 @@ Nagyítás Automatikusan létrehozott Feliratok - Feliratok méretének és hátterének stílusbeli módosítása. A módosítások életbe lépésehez az alkalmazás újraindítása szükséges + A lejátszó feliratának, szövegméretének és háttérstílusainak módosítása. A módosítások érvénybe lépéséhez újra kell indítani az alkalmazást Importálás Importálás a következőből Exportálás a következőbe @@ -360,7 +360,7 @@ Automatikus Rács Lista - Lista nézet + Listanézet mód A fájl áthelyezve vagy törölve A külső SD-kártyára történő mentés nem lehetséges. Visszaállítja a letöltési mappa helyét\? A külső tárhely nem érhető el @@ -398,7 +398,7 @@ Bélyegkép használata a zárképernyőn és az értesítéseken is Rádió Válassza ki a kedvenc éjszakai témáját — %s - Lent kiválaszthatja a kedvenc éjszakai témáját + Az alábbiakban kiválaszthatja kedvenc éjszakai témáját Nemrég hozzáadott Az ExoPlayer korlátai miatt az előre- és visszatekerés időtartama %d másodpercre lett állítva Csatornacsoportok @@ -498,7 +498,7 @@ \nRemélhetőleg egy következő verzióban már támogatott lesz. Az eszközön nincs olyan alkalmazás, amely meg tudja ezt nyitni Ez a videó csak YouTube Music Prémium előfizetők számára érhető el, így nem tekinthető meg és nem tölthető le a NewPipe-pal. - Automatikus (rendszertéma) + Automatikus (eszköz témája) Ez a tartalom csak előfizetőknek érhető el, nem tekinthető meg és nem tölthető le a NewPipe-pal. Ez a tartalom nem érhető el az országában. Ez a tartalom privát, így nem tekinthető meg és nem tölthető le a NewPipe-pal. @@ -719,9 +719,9 @@ Eltávolítja az ismétlődéseket\? Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról\? eredeti - Kezdőlap pozíciója + Fő lapok elhelyezkedése A médiacsatornázás alapértelmezetten le van tiltva az eszközén, mivel a saját eszközmodellje nem támogatja azt. - Kezdőlapválasztó alulra helyezése + A fő lapválasztó elhelyezése alulra Nincs élő közvetítés Nincs adatfolyam Az alábbi értesítési műveletek szerkesztéséhez koppintson rá. Az első három műveletet (lejátszás/szünet, előző és következő) a rendszer állítja be, és nem szabhatók testre. diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 137818d74..9d46d02d1 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -261,7 +261,7 @@ Tindakan \'buka\' yang diinginkan Tindakan bawaan ketika membuka konten — %s Teks - Ubah skala teks takarir pemutar dan gaya latar belakang. Perlu memulai ulang apl + Ubah skala teks keterangan pemutar dan gaya latar belakang. Dibutuhkan mulai ulang aplikasi agar perubahan berlaku. Pemantauan kebocoran memori dapat menyebabkan apl menjadi tidak responsif saat heap dumping Laporkan galat out-of-lifecycle Paksa pelaporan eksepsi Rx yang tak terkirim di luar fragmen atau siklus hidup aktivitas setelah dibuang @@ -337,7 +337,7 @@ Konferensi Pembaruan Tampilkan pemberitahuan untuk meminta pembaruan aplikasi saat versi baru tersedia - Mode tampilan berdaftar + Mode tampilan daftar Daftar Kisi Otomatis @@ -571,13 +571,13 @@ Hentikan aplikasi Video ini dibatasi usia. \nKarena kebijakan YouTube yang baru dengan video yang dibatasi usia, NewPipe tidak bisa mengakses video dan tidak bisa memutarnya. - Kamu bisa pilih tema malam favoritmu dibawah + Anda bisa memilih tema malam favorit Anda di bawah ini Pilih tema malam favoritmu — %s - Otomatis (tema perangkat) + Otomatis (sesuai perangkat) Radio Unggulan Selesaikan - Tema malam + Tema gelap Pengunduhan dimulai Tampilkan detail channel Nonaktifkan terowongan media (tunnel) jika anda mengalami sebuah layar hitam atau kerusakan dalam memutar video. @@ -609,7 +609,7 @@ Anda akan ditanya lokasi penyimpanan berkas unduhan Belum ada folder unduhan terpasang, pilih folder unduhan sekarang Nonaktif - Aktif + Hidup Mode tablet Jangan tampilkan Kualitas rendah (lebih kecil) @@ -735,7 +735,7 @@ asli disulih suara deskriptif - Pindahkan pemilih tab utama ke bawah + Pindahkan tab utama ke bagian bawah Posisi tab utama %1$s %2$s Terowongan media dinonaktifkan secara bawaan di perangkat Anda karena model perangkat Anda tidak mendukungnya. @@ -853,4 +853,6 @@ NewPipe akan sudahi dukungan Android 5 Sayangnya, NewPipe dibuat dengan pustaka yang akan menyudahi dukungan Android 5.0 dan 5.1. Maka, rilis NewPipe berikutnya hanya akan berfungsi pada perangkat Android 6 ke atas. Rincian ada di postingan blog. Postingan + Podcast + Kursus diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 73825fb10..bae625d8b 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -36,8 +36,8 @@ 다운로드된 오디오 파일이 이 곳에 저장됩니다 오디오 파일이 다운로드 될 폴더를 선택하세요 테마 - 다크 테마 - 라이트 테마 + 어둡게 + 밝게 외관 백그라운드에서 재생 중 네트워크 오류 @@ -82,7 +82,7 @@ 높은 해상도 표시 일부 기기에서만 2K/4K 해상도 재생이 지원됩니다 기본 비디오 형식 - 블랙 테마 + 검정 팝업 크기 및 위치 기억 마지막으로 사용한 팝업 위치 및 크기를 기억합니다 검색 제안 @@ -93,7 +93,7 @@ 시청했던 비디오 기록을 저장합니다 이어서 재생 중단 후 계속 재생(예: 전화 통화) - \"길게 눌러 대기열에 추가하기\" 팁 표시 + \"길게 눌러 대기열에 추가\" 팁 표시 비디오 \"세부사항:\"에서 배경 또는 팝업 버튼을 누를 때 팁 표시 플레이어 동작 @@ -175,7 +175,7 @@ 제거 상세 정보 오디오 설정 - 눌러서 대기열에 추가 + 길게 눌러 대기열에 추가 백그라운드에서 재생 팝업으로 재생 스트림 플레이어를 찾을 수 없습니다 (VLC를 설치하여 동영상을 재생할 수 있습니다). @@ -286,7 +286,7 @@ 선호하는 열기 동작 콘텐츠를 열 때 사용할 기본 동작 — %s 자막 - 플레이어 자막 글자 크기와 배경 스타일을 수정합니다. 적용하려면 앱을 다시 시작해야 합니다 + 플레이어 자막 글씨 크기나 배경 서식을 변경합니다. 적용하려면 앱을 다시 시작해야 합니다 채널 재생목록 시청 기록 삭제하기 @@ -336,7 +336,7 @@ 메인 화면에 표시할 탭을 설정합니다 업데이트 새 버전이 있을 경우 앱을 업데이트하도록 알림 표시 - \'목록으로 보기\' 모드 + 목록 보기 모드 목록 격자 자동 @@ -500,7 +500,7 @@ 비활성화하면 비디오 설명과 추가 정보를 표시하지 않습니다 설명 표시하기 한 플레이어에서 다른 플레이어로 전환하면 대기열이 대체될 수 있습니다 - 어두운 테마 + 야간 테마 축소된 알림에서 최대 3개까지 표시될 항목을 고를 수 있습니다! 아래의 각 알림 동작을 탭하여 편집합니다. 오른쪽의 체크박스를 사용하여 최대 3개까지 선택하여 압축 알림에 표시합니다. YouTube의 \'제한 모드\' 켜기 @@ -590,7 +590,7 @@ 예, 부분적으로 본 비디오 카테고리 %s에 의해 - 아래에서 선호하는 어두운 테마를 선택할 수 있습니다 + 아래에서 선호하는 야간 테마를 선택할 수 있습니다 이 영상은 YouTube Music Premium 회원만 볼 수 있기 때문에 NewPipe에서 스트리밍이나 다운로드가 불가능합니다. 이 콘텐츠는 비공개이므로 NewPipe에서 스트리밍하거나 다운로드할 수 없습니다. 내부 @@ -644,7 +644,7 @@ 최근 계정이 해지됨 이것은 적어도 귀하의 국가에서 SoundCloud Go+ 트랙이므로 NewPipe에서 스트리밍하거나 다운로드할 수 없습니다. - 자동 (장치 테마) + 자동 (기기 테마) 고정된 댓글 추천 알 수 없는 형식 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6c3a592ec..c0d08bb0b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -5,7 +5,7 @@ O que aconteceu: Informação: Vídeo - Preto (AMOLED) + Preto Cancelar Checksum Conteúdo @@ -294,7 +294,7 @@ Abrir gaveta Fechar gaveta Legendas - Mudar tamanho da legenda e estilos de plano de fundo. Requer reiniciar o aplicativo para ter efeito + Modifique a escala do texto da legenda do player e os estilos de fundo. Requer reinicialização do aplicativo para entrar em vigor Remover histórico de reprodução Remove o histórico de vídeos assistidos e as posições de reprodução Remover todo o histórico de reprodução? @@ -346,7 +346,7 @@ Conferências Atualizações Notificar quando uma nova versão do aplicativo estiver disponível - Modo de exibição da lista + Modo de visualização de lista Lista Grade Automático @@ -628,8 +628,8 @@ A \"Estrutura de acesso ao armazenamento\" é compatível apenas com versões a partir do Android 10 Você será questionado onde salvar cada download Nenhuma pasta de download definida ainda, escolha a pasta de download padrão agora - Desativado - Ativado + Não + Sim Modo tablet Não mostrar Baixa qualidade (menor) @@ -762,8 +762,8 @@ Usar decodificador alternativo do ExoPlayer Usar sempre a solução alternativa de configuração da superfície de saída de vídeo do ExoPlayer Habilite essa opção se você tiver problemas de inicialização do decodificador, que retorna codificadores de baixa prioridade se o decodificador primário falhar. Isso pode resultar em pior desempenho de reprodução - Mover o seletor da guia principal para a parte inferior - Posição de guias principais + Mover seletor da guia principal para baixo + Posição das guias principais Nenhum conteúdo Nenhuma transmissão ao vivo O túnel de mídia foi desabilitado por padrão em seu dispositivo porque seu modelo é conhecido por não suportá-lo. diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 71a17a583..7a1c06ef5 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -36,8 +36,8 @@ Standardformat för ljud Standardformat för video Tema - Ljust - Mörkt + Ljus + Mörk Svart Kom ihåg popupfönstrets inställningar Kom ihåg popupfönstrets senaste storlek och placering @@ -273,8 +273,8 @@ Fyll Zoom Automatiskt genererad - Textning - Ändra spelarens textstorlek och bakgrundsstil. Appen måste startas om innan ändringarna börjar gälla. + Undertexter + Ändra spelarens textstorlek och bakgrundsstil. Appen måste startas om innan ändringarna börjar gälla Övervakning av minnesläckor kan göra att appen inte svarar när en heap-dump skapas Rapportera fel utanför livscykeln Tvinga rapportering av otillåtna Rx-undantag utanför fragmentets eller aktivitetens livscykel efter rensning @@ -322,7 +322,7 @@ Vilka flikar visas på huvudsidan Uppdateringar Visa en avisering när en ny version av appen finns tillgänglig - Listvy + Listläge Lista Rutnät Automatisk @@ -515,7 +515,7 @@ reCAPTCHA-kakor har tagits bort Rensa reCAPTCHA-kakor YouTube erbjuder ett \"Begränsat läge\" som döljer material som potentiellt är olämpligt för barn - Automatiskt (enhetens tema) + Automatiskt (enhetens förvalda) Blanda Köad Från och med Android 10 stöds bara \"Storage Access Framework\" @@ -585,12 +585,12 @@ Markera som sedd Olistad Aktuellt - Nattema + Natt-tema Aviseringar för videohashningsframsteg Inaktivera medietunnel om du upplever en svart skärm eller att videouppspelningen hackar. Inaktivera medietunnel Hjärtmärkt av innehållsskaparen - Du kan välja önskat nattema nedan + Välj ditt favorittema för nattläge nedan Välj önskat nattema — %s Förhandsvisning i sökfältet Lokala sökförslag @@ -609,7 +609,7 @@ Senaste Svep objekt för att ta bort dem Förslag via fjärrsökning - Starta videor direkt i helskärmsläge i stället för i minispelaren när automatisk rotation är låst. Du kan fortfarande öppna minispelaren genom att lämna helskärmsläget. + Starta videor direkt i helskärmsläge i stället för i minispelaren när automatisk rotation är låst. Du kan fortfarande öppna minispelaren genom att lämna helskärmsläget Sök efter uppdateringar Sök manuellt efter nya versioner Söker efter uppdateringar… @@ -699,7 +699,7 @@ Välj ljudspår för externa spelare Okänt ExoPlayer-inställningar - Hantera vissa ExoPlayer-inställningar. Spelaren måste startas om innan ändringarna börjar gälla. + Hantera vissa ExoPlayer-inställningar. Spelaren måste startas om innan ändringarna börjar gälla Använd alltid ExoPlayers lösning för inställning av videoutgångsyta Föredra originalljud Välj originalljudspåret oavsett språk @@ -802,7 +802,7 @@ Ta bort post Konto avslutat\n\n%1$s anger denna anledning: %2$s Posten borttagen - Servern svarade med HTTP-fel 403 under uppspelningen. Strömnings-URL:en kan ha löpt ut eller IP-adressen kan ha blockerats. + Servern svarade med HTTP-fel 403 under uppspelningen. Strömnings-URL:en kan ha löpt ut eller IP-adressen blivit blockerad Servern svarade med HTTP-fel %1$s under uppspelningen Servern svarade med HTTP-fel 403 under uppspelningen, troligen på grund av en IP-blockering eller problem med avobfuskering av strömnings-URL:er %1$s vägrade att lämna ut uppgifter och krävde inloggning för att bekräfta att begäran inte kommer från en robot.\n\nDin IP-adress kan ha blockerats tillfälligt av %1$s. Vänta en stund eller byt IP-adress, till exempel genom att slå av och på en VPN-anslutning eller växla mellan Wi-Fi och mobildata.\n\nLäs avsnittet i vanliga frågor för mer information. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 482526783..fa2f77084 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -300,7 +300,7 @@ Бажана дія під час відкривання Типова дія під час відкриття вмісту — %s Субтитри - Зміна висоти тексту субтитрів та стилів тла. Потребує перезапуску застосунку + Змінити масштаб тексту субтитрів програвача та стилі тла. Потрібен перезапуск, щоб застосувати зміни Очистити історію переглядів Видаляє історію відтворень і позицій відтворення Видалити всю історію переглядів\? @@ -333,9 +333,9 @@ Добірки Треки Користувачі - Режим перегляду списком + Режим списку Список - Сiтка + Сітка Відписатися Обрати вкладку Оновлення @@ -575,7 +575,7 @@ Цей вміст є приватним, тому його не можна передавати потоково або завантажувати через NewPipe. Це відео доступне лише для користувачів YouTube Music Premium, тому його не можна передавати потоково або завантажувати через NewPipe. Цей вміст доступний лише користувачам, які заплатили, тому його не можна передавати потоково або завантажувати через NewPipe. - Ви можете вибрати нічну тему нижче + Ви можете вибрати улюблену нічну тему нижче Рекомендовані Збій застосунку Початковий час оприлюднення @@ -765,8 +765,8 @@ Цей обхідний шлях вивільняє і повторно встановлює відеокодеки, коли відбувається зміна поверхні, замість того, щоб налаштовувати поверхню на кодек безпосередньо. Це налаштування вже використовується ExoPlayer на деяких пристроях з цією проблемою, але воно працює лише на Android 6 і новіших версіях \n \nУвімкнення цієї опції може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу до повноекранного режиму - Перемістити селектор головної вкладки вниз - Розташування основних вкладок + Перемістити селектор головних вкладок униз + Розміщення головних вкладок Тунелювання медіа типово було вимкнено на вашому пристрої, оскільки ваша модель його не підтримує. Немає трансляцій Немає трансляцій наживо @@ -846,7 +846,7 @@ Сторінку SoundCloud Top 50 видалено SoundCloud припинив підтримку оригінальних чартів Топ-50. Відповідну вкладку видалено з вашої головної сторінки. Видалено об’єднаний тренд YouTube - YouTube припинив підтримку об’єднаної сторінки трендів з 21 липня 2025 року. NewPipe замінив стандартну сторінку трендів на сторінку трендових прямих трансляцій.\n\nВи також можете вибрати різні сторінки трендів у розділі «Налаштування» > «Контент» > «Контент головної сторінки». + YouTube припинив підтримку об’єднаної сторінки трендів з 21 липня 2025 року. NewPipe замінив стандартну сторінку трендів на сторінку трендових прямих трансляцій.\n\nВи також можете вибрати різні сторінки трендів у розділі «Налаштування» > «Вміст» > «Вміст головної сторінки». Ігрові тренди Популярні подкасти Популярні фільми та шоу diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 0ce46dfa3..5637da411 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -21,9 +21,9 @@ 选择下载音频的储存位置 使用 Kodi 播放 主题 - 浅色 - 深色 - 暗黑 + 浅 + 深 + 黑 下载 不支持的 URL 外观 @@ -317,7 +317,7 @@ 打开内容时的默认操作 — %s 没有可下载的串流 字幕 - 修改播放器字幕文本比例和背景样式。重启应用后生效 + 修改播放器字幕文本缩放和背景样式。需要重启应用生效 删除串流播放历史和播放痕迹记录 删除全部播放历史? 清空搜索历史 @@ -574,9 +574,9 @@ 处理 电台 精选 - 自动(系统主题) + 自动(设备主题) 下载已开始 - 在此选择您最喜欢的夜间主题 + 你可以在下面选择喜爱的夜晚主题 选择你最喜欢的夜间主题 — %s 夜间主题 显示频道详情 @@ -609,8 +609,8 @@ 你会被问到在哪里保存每个下载 尚未设置下载文件夹,现在选择默认下载文件夹 平板模式 - 关闭 - 开启 + 关 + 开 评论功能已停用 进度条缩略图预览 不显示 @@ -735,8 +735,8 @@ 音轨 ExoPlayer 设置 如遇解码器初始化方面的问题可开启此选项。启用后,如主解码器初始化失败,ExoPlayer 将使用较低优先级的解码器进行播放。请注意,这可能导致播放性能下降 - 将主标签页选择器移到底部 - 主标签页位置 + 将主选项卡选择器移至底部 + 主选项卡位置 %1$s %2$s 媒体隧道功能在你的设备上默认停用,因为已知你的设备型号不支持它。 无直播 diff --git a/fastlane/metadata/android/bn_BD/changelogs/1015.txt b/fastlane/metadata/android/bn_BD/changelogs/1015.txt new file mode 100644 index 000000000..46d760d46 --- /dev/null +++ b/fastlane/metadata/android/bn_BD/changelogs/1015.txt @@ -0,0 +1 @@ +এটি একটি হটফিক্স প্রকাশ media.ccc.de. এর জন্য মেরামত করা হচ্ছে স্ট্রিমিং । নিন হ্যাকিং এর মজা ! diff --git a/fastlane/metadata/android/id/changelogs/1015.txt b/fastlane/metadata/android/id/changelogs/1015.txt new file mode 100644 index 000000000..8d1d657b2 --- /dev/null +++ b/fastlane/metadata/android/id/changelogs/1015.txt @@ -0,0 +1 @@ +Ini adalah rilis perbaikan cepat untuk memperbaiki siaran langsung di media.ccc.de. Selamat meretas! From eec848d56d22b864a418e8e02f8d9774a7312e8d Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Thu, 24 Sep 2026 21:51:40 +0200 Subject: [PATCH 052/155] Translated using Weblate (Ukrainian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Swedish) Currently translated at 87.0% (54 of 62 strings) Translated using Weblate (Estonian) Currently translated at 77.4% (48 of 62 strings) Translated using Weblate (Afrikaans) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Spanish) Currently translated at 69.3% (43 of 62 strings) Translated using Weblate (Korean) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Indonesian) Currently translated at 67.7% (42 of 62 strings) Translated using Weblate (Czech) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (French) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (German) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Polish) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 94.7% (36 of 38 strings) Co-authored-by: Agnieszka C Co-authored-by: Arka Biswas Co-authored-by: Dot Max Co-authored-by: Edward Thomson Co-authored-by: Femini Co-authored-by: Fjuro Co-authored-by: Ghost of Sparta Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: Irene Co-authored-by: Jeusu Co-authored-by: Mickaël Binos Co-authored-by: Oğuz Ersen Co-authored-by: Priit Jõerüüt Co-authored-by: Trunars Co-authored-by: VfBFan Co-authored-by: Yauhen Co-authored-by: justcontributor Co-authored-by: lellyrt215 Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/af/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/az/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/be/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bg/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bn_BD/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/et/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hans/ Translation: NewPipe/compose --- .../composeResources/values-af/strings.xml | 38 ++++++++++++++++++ .../composeResources/values-az/strings.xml | 24 +++++++++++ .../composeResources/values-be/strings.xml | 24 +++++++++++ .../composeResources/values-bg/strings.xml | 24 +++++++++++ .../values-bn-rBD/strings.xml | 39 +++++++++++++++++- .../composeResources/values-cs/strings.xml | 24 +++++++++++ .../composeResources/values-de/strings.xml | 24 +++++++++++ .../composeResources/values-es/strings.xml | 5 +++ .../composeResources/values-et/strings.xml | 40 +++++++++++++++++++ .../composeResources/values-fr/strings.xml | 24 +++++++++++ .../composeResources/values-hu/strings.xml | 24 +++++++++++ .../composeResources/values-in/strings.xml | 24 +++++++++++ .../composeResources/values-ko/strings.xml | 24 +++++++++++ .../composeResources/values-pl/strings.xml | 24 +++++++++++ .../values-pt-rBR/strings.xml | 24 +++++++++++ .../composeResources/values-sv/strings.xml | 16 ++++++++ .../composeResources/values-tr/strings.xml | 26 +++++++++++- .../composeResources/values-uk/strings.xml | 24 +++++++++++ .../values-zh-rCN/strings.xml | 24 +++++++++++ 19 files changed, 474 insertions(+), 2 deletions(-) diff --git a/shared/src/commonMain/composeResources/values-af/strings.xml b/shared/src/commonMain/composeResources/values-af/strings.xml index 072e52a9b..a6c7aa77b 100644 --- a/shared/src/commonMain/composeResources/values-af/strings.xml +++ b/shared/src/commonMain/composeResources/values-af/strings.xml @@ -24,4 +24,42 @@ Geskiedenis en kas Opdateerings Rugsteun en herstel + NewPipe Besonderhede + Derdeparty Lisensies + Deur %1$s onder %2$s + Besonderhede & Gereelde Vrae + Lisensies + Libre liggewig streaming op Android. + Dra by + Of jy Ideas het vir; vertaling, ontwerp veranderinge, kode netjies maak, of groot kode veranderinge - hulp word altyd waardeer. Hoe meer gedoen word, hoe beter raak dit! + Bekyk op GitHub + NewPipe word ontwikkel deur vrywilligers wat hul vrye tyd gebruik om die beste verbruikers ondervinding te bring. Gee terug om die ontwikkelaars te help om NewPipe nog beter te maak terwyl hulle n koffie geniet. + Die NewPipe projek is erenstig oor privaatheid. As gevolg daarvan sal die toepassing nie enige data versamel of stoor sonder jou toestemming nie.\nNewPipe se privaatheids beleid verduidelik in detail watter data deur gestuur en gestoor word wanneer jy n "crash report" stuur. + NewPipe Se Lisensie + NewPipe is n kopielinks sagteware: Jy mag dit gebruik, bestudeer, uitdeel en verbeter net soos jy lus kry. Meer spesifiek mag jy dit uitdeel en/ of verander onder die voorwardes van die GNU "General Public License" soos dit gepubliseer is deur die "Free Software Foundation", of weergawe 3 van die lisensie of enige latere weergawe. + Foute Herstel + Tema + Lig + Donker + Swart + Outomaties + Nag Tema + Kies jou gunstelling nag tema— %1$s + "Hierdie opsie is slegs beskikbaar wanneer %1$s gekies word as Tema" + Jy kan jou gunstelling nag tema hieronder kies + Wys \\"Hou vas om in die tou te plaas\\" wenk + Wys wenk wanner die agtergrond gedruk word of die "popup" knoppie in n video \\"Details:\\" + Tabletmodus + Lysaansigmodus + Onderskrifte + Verandering van speler onderskrifte se skaal en agtergrond style. Vir verandering om in werking te tree moet die toepassing herbegin word + Hoofoortjie posisie + Skyf Hoofoortjie posisie kieser na die onderkant + Outo + Aan + Af + Lys + Grid + Kaartjie + Kanselleer diff --git a/shared/src/commonMain/composeResources/values-az/strings.xml b/shared/src/commonMain/composeResources/values-az/strings.xml index 518f4505a..66b46a902 100644 --- a/shared/src/commonMain/composeResources/values-az/strings.xml +++ b/shared/src/commonMain/composeResources/values-az/strings.xml @@ -38,4 +38,28 @@ Yenilənmələr Nüsxələmə və bərpa Sazlama + Kolorit + İşıqlı + Qaranlıq + Qara + Avtomatik (cihaz koloriti) + Gecə koloriti + Sevimli gecə koloritinizi seçin — %1$s + Bu seçim yalnız kolorit üçün %1$s seçildikdə əlçatandır + Sevdiyiniz gecə koloritin aşağıda seçə bilərsiniz + \\"Növbələmək üçün basılı saxla"\\ tövsiyəsin göstər + Video \\"Təfsilatlar"\\ səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər + Planşet rejimi + Siyahı görünüş rejimi + Titrlər + Oynadıcı titr mətn miqyasını və arxa plan üslublarını dəyişdir. Effektiv olması üçün tətbiqi yenidən başlatmaq tələb olunur + Əsas tabel mövqeyi + Əsas tabel seçicini aşağıya köçür + Avtomatik + Aktiv et + Bağlı + Siyahı + Şəbəkə + Kart + İmtina et diff --git a/shared/src/commonMain/composeResources/values-be/strings.xml b/shared/src/commonMain/composeResources/values-be/strings.xml index 7c7d75ae3..deceb83e8 100644 --- a/shared/src/commonMain/composeResources/values-be/strings.xml +++ b/shared/src/commonMain/composeResources/values-be/strings.xml @@ -38,4 +38,28 @@ Абнаўленні Рэзервовыя копіі і аднаўленне Адладка + Тэма + Светлая + Цёмная + Чорная + Аўтаматычна (тэма прылады) + Начная тэма + Рэжым планшэта + Рэжым спіса + Субцітры + Скасаваць + Аўтаматычна + Уключыць + Выключыць + Спіс + Сетка + Размяшчэнне ўкладак + Перамясціць радок укладак уніз + Змяніць памер тэксту і стыль фону субцітраў. Каб змены набылі сілу, патрабуецца перазапуск праграмы + Выберыце любімую начную тэму — %1$s + Гэты параметр даступны толькі калі тэмай выбрана %1$s + Улюбёную начную тэму можна выбраць ніжэй + Паказваць падказку «Утрымлівайце, каб дадаць у чаргу» + Паказваць падказку пры націсканні кнопкі «У акне» або «У фоне» на старонцы відэа + Карткі diff --git a/shared/src/commonMain/composeResources/values-bg/strings.xml b/shared/src/commonMain/composeResources/values-bg/strings.xml index 29980b3a4..610812e82 100644 --- a/shared/src/commonMain/composeResources/values-bg/strings.xml +++ b/shared/src/commonMain/composeResources/values-bg/strings.xml @@ -38,4 +38,28 @@ Актуализации Архивиране и възстановяване Отстраняване на грешки + Тема + Светла + Тъмна + Черна + Автоматична (тема на устройството) + Нощна тема + Изберете любимата си нощна тема — %1$s + Тази опция е налична само ако за тема е избрано %1$s + Можете да изберете любимата си нощна тема по-долу + Показване на съвет „Задръжте, за да се поставите на опашка“ + Показване на подсказка при натискане на фона или изскачащия бутон във видеото \\"Подробности:\\" + Режим на таблет + Режим на списъчен изглед + Субтитри + Промяна на мащаба на текста на надписите на плейъра и стиловете на фона. Изисква се рестартиране на приложението, за да влезе в сила + Позиция на основните раздели + Преместване на селектора на главни раздели надолу + Автоматично + Включено + Изключено + Списък + Решетка + Карта + Отказ diff --git a/shared/src/commonMain/composeResources/values-bn-rBD/strings.xml b/shared/src/commonMain/composeResources/values-bn-rBD/strings.xml index 55344e519..afc255db4 100644 --- a/shared/src/commonMain/composeResources/values-bn-rBD/strings.xml +++ b/shared/src/commonMain/composeResources/values-bn-rBD/strings.xml @@ -1,3 +1,40 @@ - \ No newline at end of file + পেছনে + নিউপাইপ ব্যাপারে + তৃতীয়পক্ষ অনুমতি + “%2$s-এর অধীনে %1$s দ্বারা” + পরিচিতি ও প্রশ্নসমূহ + অনুমতিসমূহ + অনুদান + ভাষান্তর , কোড মোছা অথবা প্রয়োজনীয় গুরুত্বপূর্ণ কোড সমন্বয় করার মতো এমন ধারনা যদি আপনার থেকে থাকে তা সব সময় সাদরে গৃহীত হবে । যত উন্নত করা হবে ততই এটি ভালো হয়ে উঠবে ! + গিটহাবে দেখুন + অনুদান + সেচ্ছাসেবক কারিগর নিজেদের অবসর সময়ে তৈরি করেছে নিউপাইপ যা আপনাকে দেয় সেরা ব্যবহাকারি অভিজ্ঞতা । কারিগরদের বিনিময়ে সাহায্য করুন যাতে নিউপাইপ আরো উন্নত হয় যেইসময়টাতে তারা তাদের এককাপ কফি উপোভোগ করছে । + ফিরিয়ে দিন + ওয়েবসাইট + আরো তথ্য ও খবরের জন্য যান নিউপাইপ ওয়েবসাইটে । + নিউপাইপের গোপনীয়তার নীতি + নিউপাইপ প্রজেক্টটি আপনার গোপনীয়তাকে খুবই গুরুত্ব দেয় । তাই , এই অ্যাপ কোনো তথ্যই আপনার অনুমতি ছাড়া সংগ্রহ করে না । আপনি যখন কোনো ক্র্যাশ রিপোর্ট পাঠান তখন কোন্ তথ্য সরবরাহ ও জমা হয় তার বিশদ বিশ্লেষণ করা হয়েছে নিউপাইপের গোপনীয়তার নীতি মালায় । + পড়ুন গোপনীয়তার নীতিমালা + নিউপাইপের অনুমতি + ইতিহাস এবং ক্যাশ + আপডেটস + নিউপাইপ হলো বিনামূল্যের কপিলেফট সফটও্যয়ার । যা আপনি ব্যবহার,চর্চা,ভাগাভাগি এবং স্বেচ্ছায় উন্নত করতে পারেন । বিশেষ করে এটিকে আপনি পূনর্প্রদান এবং পরিবর্তন করতে পারেন মুক্ত সফটও্যয়ার প্রতিষ্ঠানের প্রকাশিত GNU ( General Public License) এর মাধ্যমে, হয় অনুমতি পত্রের ৩য় তম সংস্করণ অথবা পুরোনো কোনো সংস্করণ অনুযায়ী ( আপনার যেটি ইচ্ছা) । + অনুমতিসমূহ পড়ুন + প্রায়ই জিজ্ঞেস করা প্রশ্নসমূহ + আপনার যদি এই অ্যাপ ব্যবহারে অসুবিধে হয়, তবে এইসব সাধারন প্রশ্ন গুলোর উত্তরসমূহ অবশ্যই দেখেনিন । + ওয়েবসাইটে দেখুন + ব্রাউজারে খুলুন + হয়েছে + অনুপলব্ধ + সেটিংস + খুঁজুন + কন্টেন্ট + নটিফিকেশনস + ভিডিও এবং অডিও + ডাউনলোড + উপস্থিতি + সংরক্ষণ এবং পুনরুদ্ধার + ডিবাগ + diff --git a/shared/src/commonMain/composeResources/values-cs/strings.xml b/shared/src/commonMain/composeResources/values-cs/strings.xml index 5fd90b8ff..4ac02913a 100644 --- a/shared/src/commonMain/composeResources/values-cs/strings.xml +++ b/shared/src/commonMain/composeResources/values-cs/strings.xml @@ -38,4 +38,28 @@ Aktualizace Záloha a obnovení Ladění + Motiv + Světlý + Tmavý + Černý + Automaticky (podle zařízení) + Noční motiv + Zvolte si svůj oblíbený noční motiv – %1$s + Tato možnost je dostupná pouze, když je zvolen motiv %1$s + Svůj oblíbený noční motiv si můžete zvolit níže + Zobrazit tip „Podržte pro zařazení do fronty“ + Zobrazit tip po klepnutí na pozadí nebo na vyskakovací tlačítko v „Podrobnostech“ videa + Režim tabletu + Režim zobrazení seznamu + Titulky + Upravit velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace + Pozice hlavních karet + Přesunout výběr hlavní karty dolů + Automaticky + Zapnuto + Vypnuto + Seznam + Mřížka + Karta + Zrušit diff --git a/shared/src/commonMain/composeResources/values-de/strings.xml b/shared/src/commonMain/composeResources/values-de/strings.xml index 8aaa9c57f..dda59ef46 100644 --- a/shared/src/commonMain/composeResources/values-de/strings.xml +++ b/shared/src/commonMain/composeResources/values-de/strings.xml @@ -38,4 +38,28 @@ Aktualisierungen Sichern und Wiederherstellen Fehlersuche + Design + Hell + Dunkel + Schwarz + Automatisch (Gerätedesign) + Nachtdesign + Wähle dein bevorzugtes Nachtdesign aus — %1$s + Diese Option ist nur verfügbar, wenn %1$s als Design ausgewählt wird + Du kannst dein bevorzugtes Nachtdesign unten auswählen + \\„Halten zum Einreihen\\“-Tipp anzeigen + Tipp anzeigen, wenn die Hintergrundwiedergabe- oder Pop-up-Schaltfläche \\„Details:\\“ im Video gedrückt wird + Tablet-Modus + Art der Ansicht + Untertitel + Textgröße und Hintergrund der Untertitel im Player anpassen. Erfordert Neustart der App + Position des Haupttabs + Hauptauswahltab nach unten verschieben + Automatisch + An + Aus + Liste + Raster + Karte + Abbrechen diff --git a/shared/src/commonMain/composeResources/values-es/strings.xml b/shared/src/commonMain/composeResources/values-es/strings.xml index 31480fca7..abb9cfcb4 100644 --- a/shared/src/commonMain/composeResources/values-es/strings.xml +++ b/shared/src/commonMain/composeResources/values-es/strings.xml @@ -38,4 +38,9 @@ Actualizaciones Respaldar y restaurar Depuración + Tema + Claro + Oscuro + Negro + Automático (tema del dispositivo) diff --git a/shared/src/commonMain/composeResources/values-et/strings.xml b/shared/src/commonMain/composeResources/values-et/strings.xml index 5cc604e9a..e70f6d421 100644 --- a/shared/src/commonMain/composeResources/values-et/strings.xml +++ b/shared/src/commonMain/composeResources/values-et/strings.xml @@ -8,4 +8,44 @@ Litsentsid Vaba ja lihtne voogesitus Androidis. Tee kaastööd + Kui sul on ideid kujunduse muutmise, koodi puhastamise või suurema edasiarenduse osas - abi on alati teretulnud. Mida rohkem tehtud, seda paremaks läheb! + Vaata GitHubis + Toeta meid rahaliselt + NewPipe'i arendajad on vabatahtlikud, kes kulutavad oma vaba aega, toomaks sulle parimat kasutuskogemust. On aeg anda tagasi aidates arendajaid ja muuta NewPipe'i veel paremaks, nautides ise tassi kohvi. + Anna kogukonnale tagasi + Veebisait + Täiendava info ja uudiste lugemiseks külasta NewPipe'i veebisaiti. + NewPipe'i andmekaitsepõhimõtted + NewPipe võtab privaatsust väga tõsiselt. Seetõttu ei kogu rakendus ilma nõusolekuta mingeid andmeid. \nNewPipe'i andmekaitsepõhimõtted selgitavad üksikasjalikult, milliseid andmeid saadetakse ja kogutakse veateate koostamisel. + Loe andmekaitsepõhimõtteid + NewPipe'i litsents + NewPipe on vaba ja avatud lähtekoodiga tarkvara. Seda võid kasutada, uurida, jagada ja parandada nii, nagu õigemaks pead. Täpsemalt - seda võid levitada ja/või muuta vastavalt Vaba Tarkvara Sihtasutuse avaldatud GNU Üldise Avaliku Litsentsi v.3 (või sinu valikul hilisema versiooni) tingimustele. + Loe litsentsi + Korduma kippuvad küsimused + Kui sul tekib selle rakenduse kasutamisel probleeme, siis esmalt vaata, kas vastus leidub korduma kippuvate küsimuste hulgas! + Edasi loe veebisaidist + Ava veebibrauseris + Valmis + Pole saadaval + Seadistused + Otsi + Sisu + Teavitused + Video ja heli + Laadi alla + Välimus + Ajalugu ja vahemälu + Tarkvarauuendused + Varundus ja taastamine + Veaotsing + Kujundus + Hele kujundus + Tume kujundus + Süsimust kujundus + Automaatne (seadme kujundus) + Öine kujundus + Vali sulle sobivaim öine kujundus - %1$s + See valik on kasutusel vaid siis, kui kujunduseks on %1$s + Võid alljärgnevast valida sulle sobivaima öise kujunduse + Näita „Lisamiseks hoia“ soovitust diff --git a/shared/src/commonMain/composeResources/values-fr/strings.xml b/shared/src/commonMain/composeResources/values-fr/strings.xml index 3e1b7a49a..ec65fc2dc 100644 --- a/shared/src/commonMain/composeResources/values-fr/strings.xml +++ b/shared/src/commonMain/composeResources/values-fr/strings.xml @@ -38,4 +38,28 @@ Mises à jour Sauvegarde et restauration Corriger + Thème + Clair + Sombre + Noir + Automatique (thème de l'appareil) + Thème « Nuit » + Choisissez votre thème nocturne préféré — %1$s + Cette option n'est disponible que si %1$s est sélectionné comme thème. + Vous pouvez choisir ci-dessous votre thème nocturne préféré + Afficher l'astuce « Maintenir enfoncé pour ajouter à la file d'attente » + Afficher l'astuce lorsque l'on appuie sur l'arrière-plan ou sur le bouton contextuel dans la vidéo « Détails : » + Mode tablette + Mode d'affichage sous forme de liste + Légendes + Modifier la taille du texte des légendes du lecteur et les styles d'arrière-plan. Un redémarrage de l'application est nécessaire pour que les modifications prennent effet. + Emplacement des onglets principaux + Déplacer le sélecteur d'onglets principal vers le bas + Auto + On + Off + Liste + Grille + Carte + Annuler diff --git a/shared/src/commonMain/composeResources/values-hu/strings.xml b/shared/src/commonMain/composeResources/values-hu/strings.xml index 9a92085d5..e5a10d747 100644 --- a/shared/src/commonMain/composeResources/values-hu/strings.xml +++ b/shared/src/commonMain/composeResources/values-hu/strings.xml @@ -38,4 +38,28 @@ Frissítések Biztonsági mentés és visszaállítás Hibakeresés + Téma + Világos + Sötét + Fekete + Automatikus (eszköz témája) + Éjszakai téma + Válassza ki a kedvenc éjszakai témáját — %1$s + Táblagép mód + Feliratok + Ez a lehetőség csak akkor érhető el, ha a(z) %1$s van kiválasztva témaként + Az alábbiakban kiválaszthatja kedvenc éjszakai témáját + \\"Tartsa lenyomva a sorba állításhoz\\" tipp megjelenítése + Tipp megjelenítése a háttér vagy a felugró ablak gombjának megnyomásakor a videó \\"Részletek:\\" részében + Listanézet mód + A lejátszó feliratának, szövegméretének és háttérstílusainak módosítása. A módosítások érvénybe lépéséhez újra kell indítani az alkalmazást + Fő lapok elhelyezkedése + A fő lapválasztó elhelyezése alulra + Automatikus + Be + Ki + Lista + Rács + Kártya + Mégse diff --git a/shared/src/commonMain/composeResources/values-in/strings.xml b/shared/src/commonMain/composeResources/values-in/strings.xml index 540f47b22..22b6ce7e2 100644 --- a/shared/src/commonMain/composeResources/values-in/strings.xml +++ b/shared/src/commonMain/composeResources/values-in/strings.xml @@ -38,4 +38,28 @@ Pembaruan Cadangkan dan Pulihkan Debug + Otomatis (sesuai perangkat) + Terang + Gelap + Hitam + Tema + Tema gelap + Pilih tema malam favorit anda — %1$s + Opsi ini hanya tersedia jika %1$s dipilih untuk tema + Anda bisa memilih tema malam favorit Anda di bawah ini + Tampilkan tip \\"Tahan menambahkan ke antrian\\" + Tampilkan tip saat menekan tombol latar belakang atau tombol pop-up di video \\"Detail:\\" + Mode tablet + Mode tampilan daftar + Teks + Ubah skala teks keterangan pemutar dan gaya latar belakang. Dibutuhkan mulai ulang aplikasi agar perubahan berlaku. + Posisi tab utama + Pindahkan tab utama ke bagian bawah + Otomatis + Hidup + Nonaktif + Daftar + Kisi + Kartu + Batal diff --git a/shared/src/commonMain/composeResources/values-ko/strings.xml b/shared/src/commonMain/composeResources/values-ko/strings.xml index 371b4bad0..838ceef70 100644 --- a/shared/src/commonMain/composeResources/values-ko/strings.xml +++ b/shared/src/commonMain/composeResources/values-ko/strings.xml @@ -38,4 +38,28 @@ 업데이트 백업 및 복원 디버그 + 테마 + 밝게 + 어둡게 + 검정 + 자동 (기기 테마) + 야간 테마 + 선호하는 야간 테마를 선택하세요 — %1$s + 태블릿 모드 + 목록 보기 모드 + 자막 + 메인 탭 위치 + 메인 탭 선택기를 하단으로 이동 + 자동 + 켬 + 끔 + 목록 + 격자 + 카드 + 취소 + 플레이어 자막 글씨 크기나 배경 서식을 변경합니다. 적용하려면 앱을 다시 시작해야 합니다 + 이 옵션은 %1$s 테마를 선택해야 이용할 수 있습니다 + 아래에서 선호하는 야간 테마를 선택할 수 있습니다 + \\"길게 눌러 대기열에 추가\\" 팁 표시 + 비디오 "세부사항:"에서 배경 또는 팝업 버튼을 누를 때 팁 표시 diff --git a/shared/src/commonMain/composeResources/values-pl/strings.xml b/shared/src/commonMain/composeResources/values-pl/strings.xml index 2a79ff1d7..8d30cb8fb 100644 --- a/shared/src/commonMain/composeResources/values-pl/strings.xml +++ b/shared/src/commonMain/composeResources/values-pl/strings.xml @@ -38,4 +38,28 @@ Aktualizacje Kopia zapasowa i przywracanie Debugowanie + Motyw + Jasny + Ciemny + Czarny + Automatyczny (motyw urządzenia) + Motyw nocny + Wybierz swój ulubiony motyw nocny — %1$s + Ta opcja jest dostępna tylko wtedy, gdy %1$s jest wybrany jako motyw + Możesz wybrać swój ulubiony motyw nocny poniżej + Pokazuj poradę „Przytrzymaj, aby dodać” + Pokaż wskazówkę po naciśnięciu tła lub wyskakującego przycisku „Szczegóły” w odtwarzaczu + Tryb tabletu + Tryb widoku listy + Napisy + Zmodyfikuj rozmiar tekstu napisów odtwarzacza i style tła. Wymaga ponownego uruchomienia aplikacji, aby zmiany zostały uwzględnione + Pozycja kart głównych + Przenieś selektor kart głównych na dół + Automatyczny + Włączony + Wyłączony + Lista + Siatka + Karta + Anuluj diff --git a/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml b/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml index 56c4e8967..3f0d54f36 100644 --- a/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -38,4 +38,28 @@ Atualizações Backup e restauração Depuração + Tema + Claro + Escuro + Preto + Automático (tema do dispositivo) + Tema noturno + Selecione seu tema noturno favorito — %1$s + Esta opção só está disponível se %1$s estiver selecionado como Tema + Você pode selecionar seu tema noturno favorito abaixo + Mostrar dica \\"Segure para enfileirar\\" + Mostrar dica ao pressionar fundo ou botão pop-up no vídeo \\"Detalhes:\\" + Modo tablet + Modo de visualização de lista + Legendas + Modifique a escala do texto da legenda do player e os estilos de fundo. Requer reinicialização do aplicativo para entrar em vigor + Posição das guias principais + Mover seletor da guia principal para baixo + Automático + Sim + Não + Lista + Grade + Cartão + Cancelar diff --git a/shared/src/commonMain/composeResources/values-sv/strings.xml b/shared/src/commonMain/composeResources/values-sv/strings.xml index 28d7884e7..a1946e427 100644 --- a/shared/src/commonMain/composeResources/values-sv/strings.xml +++ b/shared/src/commonMain/composeResources/values-sv/strings.xml @@ -38,4 +38,20 @@ Uppdateringar Säkerhetskopiera och återställ Felsökning + Avbryt + Kort + Tema + Ljus + Mörk + Svart + Automatiskt (enhetens förvalda) + Natt-tema + Välj ditt favorittema för nattläge — %1$s + Detta kan bara väljas om %1$s väljs som tema + Välj ditt favorittema för nattläge nedan + Visa tips för \\"Håll för att köa\\" + Visa tips när du trycker på bakgrunds- eller popup-knappen i videons \\"Detaljer:\\" + Surfplatteläge + Listläge + Undertexter diff --git a/shared/src/commonMain/composeResources/values-tr/strings.xml b/shared/src/commonMain/composeResources/values-tr/strings.xml index 37dbafa4e..fe946dba8 100644 --- a/shared/src/commonMain/composeResources/values-tr/strings.xml +++ b/shared/src/commonMain/composeResources/values-tr/strings.xml @@ -16,7 +16,7 @@ Web sitesi Daha çok bilgi ve haber için NewPipe web sitesini ziyaret edin. NewPipe'ın Gizlilik İlkesi - NewPipe projesi, gizliliğinizi çok önemsiyor. Bu nedenle, uygulama sizin izniniz olmadan herhangi bir veri toplamaz.\nNewPipe\\'ın gizlilik ilkesi, çökme raporu gönderdiğinizde hangi verilerin gönderildiğini ve saklandığını ayrıntılı olarak açıklar. + NewPipe projesi, gizliliğinizi çok önemsiyor. Bu nedenle, uygulama izniniz olmadan herhangi bir veri toplamaz.\nNewPipe\\'ın gizlilik ilkesi, çökme raporu gönderdiğinizde hangi verilerin gönderildiğini ve saklandığını ayrıntılı olarak açıklar. Gizlilik ilkesini oku NewPipe'ın Lisansı NewPipe, telif müsaadeli özgür yazılımdır: İstediğiniz gibi kullanabilir, öğrenebilir, paylaşabilir ve geliştirebilirsiniz. Özellikle, Özgür Yazılım Vakfı tarafından yayımlanan GNU Genel Kamu Lisansı 3. sürümü veya (isterseniz) daha sonraki sürümleri koşulları altında yeniden dağıtabilir ve/veya değiştirebilirsiniz. @@ -38,4 +38,28 @@ Güncellemeler Yedekle ve geri yükle Hata ayıklama + Tema + Açık + Koyu + Siyah + Kendiliğinden (aygıt teması) + Gece teması + Gözde gece temanızı seçin — %1$s + Bu seçenek yalnızca tema için %1$s seçildiğinde kullanılabilir + Gözde gece temanızı aşağıdan seçebilirsiniz + \\"Basılı tutarak kuyruğa ekle\\" ipucunu göster + Video \\"Ayrıntılar:\\" sayfasında arka plan ya da açılır pencere düğmesine basıldığında ipucu göster + Tablet kipi + Liste görünümü kipi + Alt yazılar + Oynatıcı alt yazı metin ölçeğini ve arka plan biçimini değiştirin. Etkili olması için uygulamayı yeniden başlatma gerektirir + Ana sekme konumu + Ana sekme seçiciyi alta taşı + Kendiliğinden + Aç + Kapalı + Liste + Izgara + Kart + İptal diff --git a/shared/src/commonMain/composeResources/values-uk/strings.xml b/shared/src/commonMain/composeResources/values-uk/strings.xml index 82c630bda..15e71e216 100644 --- a/shared/src/commonMain/composeResources/values-uk/strings.xml +++ b/shared/src/commonMain/composeResources/values-uk/strings.xml @@ -38,4 +38,28 @@ Резервна копія та відновлення Налагодження %1$s за ліцензією %2$s + Тема + Світла + Темна + Чорна + Автоматична (тема пристрою) + Нічна тема + Виберіть улюблену нічну тему — %1$s + Ця опція доступна, лише якщо темою вибрано %1$s + Ви можете вибрати улюблену нічну тему нижче + Показувати підказку «Затисніть, щоб додати до черги» + Показувати підказку при натисканні на тло або кнопку спливного вікна у відео \\"Подробиці:\\" + Режим планшета + Режим списку + Субтитри + Змінити масштаб тексту субтитрів програвача та стилі тла. Потрібен перезапуск, щоб застосувати зміни + Розміщення головних вкладок + Перемістити селектор головних вкладок униз + Автоматично + Увімкнути + Вимкнути + Список + Сітка + Картки + Скасувати diff --git a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml index d801aa72c..975fcbdde 100644 --- a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -38,4 +38,28 @@ 更新 备份和恢复 调试 + 主题 + 浅 + 深 + 黑 + 自动(设备主题) + 夜间主题 + 选择喜爱的夜晚主题 —— %1$s + 该选项仅在选择 %1$s 作为主题时可用 + 你可以在下面选择喜爱的夜晚主题 + 显示 \\"按住加入队列\\" 提示 + 在视频 \\"详情:\\" 中按住背景或弹窗时显示提示 + 平板模式 + 列表视图模式 + 字幕 + 修改播放器字幕文本缩放和背景样式。需要重启应用生效 + 主选项卡位置 + 将主选项卡选择器移至底部 + 自动 + 开 + 关 + 列表 + 网格 + 卡片 + 取消 From a17881d653e14d67bd06497c663ebc6823124001 Mon Sep 17 00:00:00 2001 From: muco-j98 Date: Fri, 25 Sep 2026 14:51:00 +0200 Subject: [PATCH 053/155] hide current fragment when opening settings search --- .../org/schabi/newpipe/settings/SettingsActivity.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java index 41d7033e2..606077679 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java @@ -17,6 +17,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.core.view.SoftwareKeyboardControllerCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; +import androidx.fragment.app.FragmentTransaction; import androidx.preference.Preference; import androidx.preference.PreferenceFragmentCompat; @@ -304,9 +305,13 @@ public class SettingsActivity extends AppCompatActivity implements final var keyboardController = new SoftwareKeyboardControllerCompat(searchEditText); if (active) { - getSupportFragmentManager() - .beginTransaction() - .add(FRAGMENT_HOLDER_ID, searchFragment, PreferenceSearchFragment.NAME) + final FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); + final Fragment current = getSupportFragmentManager() + .findFragmentById(FRAGMENT_HOLDER_ID); + if (current != null) { + ft.hide(current); + } + ft.add(FRAGMENT_HOLDER_ID, searchFragment, PreferenceSearchFragment.NAME) .addToBackStack(PreferenceSearchFragment.NAME) .commit(); From 7e5df38aad4b2c035332b3f71aee3064d4fdaae4 Mon Sep 17 00:00:00 2001 From: muco-j98 Date: Sat, 26 Sep 2026 17:16:49 +0200 Subject: [PATCH 054/155] remove current fragment instead of hiding it when searching settings --- .../main/java/org/schabi/newpipe/settings/SettingsActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java index 606077679..467604305 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java @@ -309,7 +309,7 @@ public class SettingsActivity extends AppCompatActivity implements final Fragment current = getSupportFragmentManager() .findFragmentById(FRAGMENT_HOLDER_ID); if (current != null) { - ft.hide(current); + ft.remove(current); } ft.add(FRAGMENT_HOLDER_ID, searchFragment, PreferenceSearchFragment.NAME) .addToBackStack(PreferenceSearchFragment.NAME) From 9b72634679da578499a740c582819f9c083c0860 Mon Sep 17 00:00:00 2001 From: muco-j98 Date: Mon, 28 Sep 2026 15:39:23 +0200 Subject: [PATCH 055/155] document includePartiallyPlayed parameter in FeedDAO --- .../main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index 5861fa767..0c5f1d34d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -27,6 +27,10 @@ abstract class FeedDAO { * [FeedGroupEntity.GROUP_ALL_ID] to not filter by group * @param includePlayed if false, only return all of the live, never-played or non-finished * feed streams (see `@see` items); if true no filter is applied + * @param includePartiallyPlayed if false, exclude streams that have been partially + * played, keeping only never-played streams or streams whose + * playback position is within the start/end playback thresholds; + * if true, no partial-playback filter is applied * @param uploadDateBefore get only streams uploaded before this date (useful to filter out * future streams); use null to not filter by upload date * @return the feed streams filtered according to the conditions provided in the parameters From f931afa8413167b83181ad124afcc11a9dfe2ac5 Mon Sep 17 00:00:00 2001 From: Samuel Date: Sun, 27 Sep 2026 06:27:51 +0200 Subject: [PATCH 056/155] Enabled asynchronous ARM Memory Tagging Extension (MTE) Security Enabled asynchronous ARM Memory Tagging Extension (MTE) on supported Android devices. The setting applies to the Android app and is active where the device supports this capability. --- app/src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 31ebc123b..7db343959 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -37,6 +37,7 @@ android:logo="@mipmap/ic_launcher" android:resizeableActivity="true" android:theme="@style/OpeningTheme" + android:memtagMode="async" tools:ignore="AllowBackup"> Date: Sun, 4 Oct 2026 18:55:03 +0530 Subject: [PATCH 057/155] Show full subtitle names when the service exposes them MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit YouTube ships a user-facing `name` field per caption track that can differ even when the language code is identical (e.g. "English - CC1" vs "English - DTVCC1"). The extractor now surfaces that string via `SubtitlesStream#getName()`; prefer it in the player's caption menu so tracks that share a language code can finally be told apart. Falls back to the locale-derived display name when the service doesn't expose a track name. Fixes #9218. Depends on TeamNewPipe/NewPipeExtractor#1551 — the version-catalog pointer in libs.versions.toml is temporarily targeted at ibrahim-iqbal/NewPipeExtractor and will be flipped back to TeamNewPipe once the extractor PR merges. --- .../java/org/schabi/newpipe/player/helper/PlayerHelper.java | 5 ++++- gradle/libs.versions.toml | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 25844f799..9b2f5a03f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -116,7 +116,10 @@ public final class PlayerHelper { @NonNull public static String captionLanguageOf(@NonNull final Context context, @NonNull final SubtitlesStream subtitles) { - final String displayName = subtitles.getDisplayLanguageName(); + final String serviceName = subtitles.getName(); + final String displayName = serviceName != null && !serviceName.isEmpty() + ? serviceName + : subtitles.getDisplayLanguageName(); return displayName + (subtitles.isAutoGenerated() ? " (" + context.getString(R.string.caption_auto_generated) + ")" : ""); } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 308e3b494..e1abf3ca8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "13a655fe53e0c3065f88725fc1fb594c3ede0169" +teamnewpipe-newpipe-extractor = "d66acff2536c68db2abbfa308399337e8dd686e2" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" @@ -152,7 +152,7 @@ lisawray-groupie-core = { module = "com.github.lisawray.groupie:groupie", versio lisawray-groupie-viewbinding = { module = "com.github.lisawray.groupie:groupie-viewbinding", version.ref = "groupie" } livefront-bridge = { module = "com.github.livefront:bridge", version.ref = "bridge" } mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoCore" } -newpipe-extractor = { module = "com.github.TeamNewPipe:NewPipeExtractor", version.ref = "teamnewpipe-newpipe-extractor" } +newpipe-extractor = { module = "com.github.ibrahim-iqbal:NewPipeExtractor", version.ref = "teamnewpipe-newpipe-extractor" } newpipe-filepicker = { module = "com.github.TeamNewPipe:NoNonsense-FilePicker", version.ref = "teamnewpipe-filepicker" } newpipe-nanojson = { module = "com.github.TeamNewPipe:nanojson", version.ref = "teamnewpipe-nanojson" } noties-markwon-core = { module = "io.noties.markwon:core", version.ref = "markwon" } From cc79c90bc77ed863e2804ca898c03da7f5c5c7db Mon Sep 17 00:00:00 2001 From: ibrahim-iqbal Date: Tue, 6 Oct 2026 11:32:07 +0530 Subject: [PATCH 058/155] Address review: rename to trackName, use isBlank, point at merged extractor - serviceName -> trackName, since 'service' means YouTube/SoundCloud elsewhere in this codebase. - isEmpty() -> isBlank(), per review suggestion. - Extractor dependency now points at TeamNewPipe/NewPipeExtractor at the commit that merged (#1551), instead of my fork. --- .../java/org/schabi/newpipe/player/helper/PlayerHelper.java | 6 +++--- gradle/libs.versions.toml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 9b2f5a03f..73951b0ad 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -116,9 +116,9 @@ public final class PlayerHelper { @NonNull public static String captionLanguageOf(@NonNull final Context context, @NonNull final SubtitlesStream subtitles) { - final String serviceName = subtitles.getName(); - final String displayName = serviceName != null && !serviceName.isEmpty() - ? serviceName + final String trackName = subtitles.getName(); + final String displayName = trackName != null && !trackName.isBlank() + ? trackName : subtitles.getDisplayLanguageName(); return displayName + (subtitles.isAutoGenerated() ? " (" + context.getString(R.string.caption_auto_generated) + ")" : ""); diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e1abf3ca8..230bf09b9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "d66acff2536c68db2abbfa308399337e8dd686e2" +teamnewpipe-newpipe-extractor = "65cabc2ba5216ee871ace4a9963c08bdbf5d5dc0" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" @@ -152,7 +152,7 @@ lisawray-groupie-core = { module = "com.github.lisawray.groupie:groupie", versio lisawray-groupie-viewbinding = { module = "com.github.lisawray.groupie:groupie-viewbinding", version.ref = "groupie" } livefront-bridge = { module = "com.github.livefront:bridge", version.ref = "bridge" } mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoCore" } -newpipe-extractor = { module = "com.github.ibrahim-iqbal:NewPipeExtractor", version.ref = "teamnewpipe-newpipe-extractor" } +newpipe-extractor = { module = "com.github.TeamNewPipe:NewPipeExtractor", version.ref = "teamnewpipe-newpipe-extractor" } newpipe-filepicker = { module = "com.github.TeamNewPipe:NoNonsense-FilePicker", version.ref = "teamnewpipe-filepicker" } newpipe-nanojson = { module = "com.github.TeamNewPipe:nanojson", version.ref = "teamnewpipe-nanojson" } noties-markwon-core = { module = "io.noties.markwon:core", version.ref = "markwon" } From e61cc362841a95b567147488bf94b7c2b470a318 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Fri, 2 Oct 2026 15:45:43 +0200 Subject: [PATCH 059/155] Translated using Weblate (Chinese (Simplified Han script)) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Haitian) Currently translated at 1.4% (11 of 778 strings) Added translation using Weblate (Haitian) Co-authored-by: Hosted Weblate Co-authored-by: Hougan Mòs Co-authored-by: Joel A Co-authored-by: RainSlide Co-authored-by: Sup! 0_0 --- app/src/main/res/values-ar/strings.xml | 10 +++++----- app/src/main/res/values-ht/strings.xml | 13 +++++++++++++ app/src/main/res/values-sv/strings.xml | 8 ++++---- app/src/main/res/values-zh-rCN/strings.xml | 6 ++---- 4 files changed, 24 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/values-ht/strings.xml diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index edb4f142f..4574dc17f 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -265,7 +265,7 @@ تم تغيير الصورة المصغرة لقائمة التشغيل. بدون تسميات توضيحية تسميات توضيحية - تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل التطبيق لتصبح التغييرات سارية المفعول + تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل لتصبح التغييرات سارية المفعول قد تتسبب مراقبة تسرب الذاكرة في عدم استجابة التطبيق عند تفريغ السجلات تقرير الأخطاء خارج دورة الحياة فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها @@ -315,8 +315,7 @@ إلغاء الارتباط (قد يسبب تشويه) هل تريد أيضا استيراد الإعدادات؟ سياسة خصوصية NewPipe - يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك. -\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال. + يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك.\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال. اقرأ سياسة الخصوصية من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية. \nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا. @@ -622,7 +621,7 @@ المميزة حل بدأ التنزيل - يمكنك اختيار نسقك الليلي المفضل أدناه + يمكنك تحديد سمة الليل المفضلة لديك أدناه حدد موضوعك الليلي المفضل — %s تلقائي (سمة الجهاز) الثيم الليلي @@ -913,7 +912,7 @@ استيراد الاشتراكات تصدير الاشتراكات - إسترد الاشتراكات من ملف JSON تم تصديره مسبقاً + إسترد الاشتراكات من ملف .json تم تصديره مسبقاً قم بتصدير اشتراكاتك إلى ملف بصيغة .json الاستيراد من التصدير السابق سيوقف NewPipe الدعم لنظام أندرويد 5 @@ -935,4 +934,5 @@ استيراد %d اشتراكًا… استيراد %d اشتراك… + الدورات diff --git a/app/src/main/res/values-ht/strings.xml b/app/src/main/res/values-ht/strings.xml new file mode 100644 index 000000000..1c6df383d --- /dev/null +++ b/app/src/main/res/values-ht/strings.xml @@ -0,0 +1,13 @@ + + + Kontribye + Kit ou gen lide pou tradiksyon, chanjman nan konsepsyon, netwayaj kòd, oswa gwo chanjman nan kòd la menm—nou toujou akeyi èd. Plis nou fè bagay yo avanse, se plis rezilta a ap pi bon! + Gade sou GitHub + Fè yon don + Se volontè ki devlope NewPipe; yo pase tan lib yo ap travay pou ofri w pi bon eksperyans itilizatè posib. Ou ka bay yon kontribisyon pou ede devlopè yo fè NewPipe vin pi bon toujou, pandan y ap jwi yon tas kafe. + Bay an retou + Sitwèb + Vizite sitwèb NewPipe la pou plis enfòmasyon ak nouvèl. + Politik Konfidansyalite NewPipe + Li politik konfidansyalite a + diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 7a1c06ef5..f331b0ffc 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -236,7 +236,7 @@ Byt namn 1 objekt borttaget. NewPipes integritetspolicy - NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. \nNewPipes integritetspolicy beskriver vilka uppgifter som skickas och lagras när du skickar en kraschrapport. + NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. \nNewPipes integritetspolicy beskriver i detalj vilka uppgifter som skickas och lagras när du skickar en kraschrapport. Läs integritetspolicyn NewPipe är fri programvara under en copyleft-licens: du får använda, studera, dela och förbättra programmet. Du får distribuera och ändra det enligt villkoren i GNU General Public License, version 3 eller, om du föredrar det, en senare version. Senast spelade @@ -325,7 +325,7 @@ Listläge Lista Rutnät - Automatisk + Auto En NewPipe-uppdatering är tillgänglig! Slutförda pausad @@ -712,8 +712,8 @@ original beskrivande dubbad - Placera väljaren för huvudflikar längst ned - Huvudflikarnas placering + Flytta huvudflikarna längst ned + Huvudflikarnas position Inga strömningar Inga direktsändningar Medietunnel har inaktiverats som standard på din enhet eftersom enhetsmodellen inte stöder funktionen. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 5637da411..bbc461f59 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -327,8 +327,7 @@ NewPipe 是 Copyleft 的自由软件:您可以随时使用、研究共享和改进它。您可以根据自由软件基金会发布的 GNU 通用公共许可证 GPLv3 或(由您选择的)任何更高版本的许可证重新分发或修改该许可证。 是否要导入设置? NewPipe 隐私政策 - NewPipe 项目非常重视您的隐私。因此,未经您的同意,应用程序不会收集任何数据。 -\nNewPipe 的隐私政策详细解释了发送崩溃报告时会发送和存储的数据。 + NewPipe 项目非常重视您的隐私。因此,未经您的同意,本应用不会收集任何数据。 \nNewPipe 的隐私政策详细解释了发送崩溃报告时会发送和存储的数据。 阅读隐私政策 为了遵守欧盟的《通用数据保护条例 (GDPR)》,我们特此提醒您注意 NewPipe 的隐私政策,请您仔细阅读。 \n您必须在同意以后才能向我们发送错误报告。 @@ -646,8 +645,7 @@ 创建一条错误通知 找不到适合此操作的文件管理器。 \n请安装一文件管理器或尝试在下载设置中禁用“%s” - 找不到适合此操作的文件管理器。 -\n请安装兼容存储访问框架(SAF)的文件管理器 + 找不到适合此操作的文件管理器。 \n请安装兼容存储访问框架(SAF)的文件管理器 NewPipe 遇到了一个错误,点击此处报告此错误 置顶评论 LeakCanary 不可用 From d7bc8d56ede37e325aedbf280f6c560a114b8c07 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 6 Oct 2026 11:42:22 +0200 Subject: [PATCH 060/155] Translated using Weblate (Italian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Haitian) Currently translated at 1.4% (11 of 778 strings) Added translation using Weblate (Haitian) Co-authored-by: Hosted Weblate Co-authored-by: Hougan Mòs Co-authored-by: Joel A Co-authored-by: RainSlide Co-authored-by: Random Co-authored-by: Sup! 0_0 --- app/src/main/res/values-it/strings.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 0767320bc..338ce0d04 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -295,7 +295,7 @@ Azione di apertura preferita Azione predefinita all\'apertura del contenuto — %s Sottotitoli - Modifica dimensione e stile dei sottotitoli. Riavviare per applicare le modifiche + Modifica la scala del testo dei sottotitoli e gli stili di sfondo. Richiede il riavvio dell\'app per applicare Elimina la cronologia delle visualizzazioni Elimina la cronologia degli elementi riprodotti e le posizioni di riproduzione Eliminare la cronologia delle visualizzazioni\? @@ -344,10 +344,10 @@ Schede mostrate nella pagina principale Aggiornamenti Mostra una notifica per suggerire l\'aggiornamento dell\'app se una nuova versione è disponibile - Modalità visualizzazione lista + Modalità vista elenco Lista Griglia - Automatica + Auto Aggiornamento di NewPipe disponibile! Completati In corso @@ -595,7 +595,7 @@ In evidenza Risolvi Download avviato - Qua sotto è possibile selezionare il tema notturno preferito + Puoi selezionare il tuo tema notturno qui sotto Seleziona il tema notturno preferito — %s Automatico (tema del dispositivo) Tema notturno @@ -628,8 +628,8 @@ A partire da Android 10 è supportato solo il Framework di accesso all\'archiviazione È necessario specificare la destinazione di ogni dowload Non è impostata alcuna cartella per i file scaricati, scegliere quella predefinita - Disattivata - Attiva + Off + On Modalità tablet Non mostrare Qualità bassa (più piccola) @@ -719,7 +719,7 @@ Importa o esporta iscrizioni dal menu a 3 punti Questa opzione è disponibile solo se %s è selezionato come Tema Copia negli appunti non riuscita - Schede + Scheda Disattiva copertina permanente Le playlist in grigio contengono già questo elemento. Doppione aggiunto %d volta/e @@ -762,8 +762,8 @@ Questa soluzione alternativa rilascia e re-istanzia i codec video quando si verifica una modifica della superficie, invece di impostare direttamente la superficie sul codec. Già usata da ExoPlayer su alcuni dispositivi con questo problema, questa impostazione ha effetto solo su Android 6 e versioni successive \n \nL\'attivazione di questa opzione potrebbe impedire errori di riproduzione passando al lettore video attuale o passando a schermo intero - Posizione delle schede principali - Sposta in fondo il selettore della scheda principale + Posizione schede principali + Sposta le schede principali in fondo Il tunneling multimediale è stato disabilitato per impostazione predefinita sul dispositivo in uso, poiché è noto che il modello del dispositivo non lo supporta. Nessuna trasmissione Nessuna trasmissione in diretta From 708257888532b68effa2f37d33971001817898d9 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 6 Oct 2026 11:42:25 +0200 Subject: [PATCH 061/155] Translated using Weblate (Italian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Arabic) Currently translated at 93.5% (58 of 62 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (62 of 62 strings) Translated using Weblate (Haitian) Currently translated at 29.0% (18 of 62 strings) Added translation using Weblate (Haitian) Co-authored-by: Hosted Weblate Co-authored-by: Hougan Mòs Co-authored-by: Joel A Co-authored-by: RainSlide Co-authored-by: Random Co-authored-by: Sup! 0_0 Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ht/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hans/ Translation: NewPipe/compose --- .../composeResources/values-ar/strings.xml | 20 ++++++++++++++++ .../composeResources/values-ht/strings.xml | 21 ++++++++++++++++ .../composeResources/values-it/strings.xml | 24 +++++++++++++++++++ .../composeResources/values-sv/strings.xml | 10 +++++++- .../values-zh-rCN/strings.xml | 2 +- 5 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 shared/src/commonMain/composeResources/values-ht/strings.xml diff --git a/shared/src/commonMain/composeResources/values-ar/strings.xml b/shared/src/commonMain/composeResources/values-ar/strings.xml index 6b8ade022..efd495357 100644 --- a/shared/src/commonMain/composeResources/values-ar/strings.xml +++ b/shared/src/commonMain/composeResources/values-ar/strings.xml @@ -38,4 +38,24 @@ النسخ الاحتياطي والاستعادة السجل والملفات المؤقتة تصحيح الأخطاء + إلغاء + السمة + فاتح + داكن + أسود + تلقائي (سمة الجهاز) + الثيم الليلي + اختر سمة الليل المفضلة لديك — %1$s + هذا الخيار متاح فقط إذا تم تحديد %1$s للثيم + يمكنك تحديد سمة الليل المفضلة لديك أدناه + وضع الجهاز اللوحي + وضع عرض قائمة + تسميات توضيحية + تعديل مشغل نص التسمية التوضيحية وأنماط الخلفية. يتطلب إعادة تشغيل لتصبح التغييرات سارية المفعول + موضع علامات التبويب الرئيسية + انقل محدد علامة التبويب الرئيسي إلى الأسفل + تلقائي + القائمة + الشبكة + البطاقة diff --git a/shared/src/commonMain/composeResources/values-ht/strings.xml b/shared/src/commonMain/composeResources/values-ht/strings.xml new file mode 100644 index 000000000..98d95db43 --- /dev/null +++ b/shared/src/commonMain/composeResources/values-ht/strings.xml @@ -0,0 +1,21 @@ + + + Retounen + Konsènan NewPipe + Lisans twazyèm pati + Pa %1$s anba %2$s + Konsènan & Kesyon yo poze souvan + Lisans + Difizyon ki lejè epi lib sou Android. + Kontribye + Kit ou gen lide pou tradiksyon, chanjman nan konsepsyon, netwayaj kòd, oswa gwo chanjman nan kòd la menm—nou toujou akeyi èd. Plis nou fè bagay yo avanse, se plis rezilta a ap pi bon! + Gade sou GitHub + Fè yon don + Se volontè ki devlope NewPipe; yo pase tan lib yo ap travay pou ofri w pi bon eksperyans itilizatè posib. Ou ka bay yon kontribisyon pou ede devlopè yo fè NewPipe vin pi bon toujou, pandan y ap jwi yon tas kafe. + Bay an retou + Sitwèb + Vizite sitwèb NewPipe la pou plis enfòmasyon ak nouvèl. + Politik Konfidansyalite NewPipe + Pwojè NewPipe la pran konfidansyalite w trè oserye. Se poutèt sa, aplikasyon an pa kolekte okenn done san ou pa bay konsantman w.\nPolitik konfidansyalite NewPipe la eksplike an detay ki done yo voye epi estoke lè w voye yon rapò sou yon erè ki lakòz aplikasyon an fèmen (crash report). + Li politik konfidansyalite a + diff --git a/shared/src/commonMain/composeResources/values-it/strings.xml b/shared/src/commonMain/composeResources/values-it/strings.xml index d862ef661..cbd2eb2bb 100644 --- a/shared/src/commonMain/composeResources/values-it/strings.xml +++ b/shared/src/commonMain/composeResources/values-it/strings.xml @@ -38,4 +38,28 @@ Aggiornamenti Backup e ripristino Debug + Tema + Chiaro + Scuro + Nero + Automatico (tema del dispositivo) + Tema notturno + Seleziona il tuo tema notturno preferito — %1$s + Questa opzione è disponibile solo se %1$s è selezionato come tema + Puoi selezionare il tuo tema notturno qui sotto + Mostra suggerimento \\"Tieni premuto per accodare \\" + Mostra suggerimento quando premi lo sfondo o il pulsante popup nei \\"Dettagli:\\" del video + Modalità tablet + Modalità vista elenco + Sottotitoli + Modifica la scala del testo dei sottotitoli e gli stili di sfondo. Richiede il riavvio dell'app per applicare + Posizione schede principali + Sposta le schede principali in fondo + Auto + On + Off + Lista + Griglia + Scheda + Annulla diff --git a/shared/src/commonMain/composeResources/values-sv/strings.xml b/shared/src/commonMain/composeResources/values-sv/strings.xml index a1946e427..0a0492c60 100644 --- a/shared/src/commonMain/composeResources/values-sv/strings.xml +++ b/shared/src/commonMain/composeResources/values-sv/strings.xml @@ -1,6 +1,6 @@ - NewPipe-projektet tar din integritet på stort allvar. Därför samlar appen inte in någon data utan ditt samtycke.\nNewPipes integritetspolicy förklarar i detalj vilken data som skickas och lagras då du skickar en kraschrapport. + NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. \nNewPipes integritetspolicy beskriver i detalj vilka uppgifter som skickas och lagras när du skickar en kraschrapport. Tillbaka Om NewPipe Tredjepartslicenser @@ -54,4 +54,12 @@ Surfplatteläge Listläge Undertexter + På + Av + Lista + Rutnät + Ändra spelarens textstorlek och bakgrundsstil. Appen måste startas om innan ändringarna börjar gälla + Huvudflikarnas position + Flytta huvudflikarna längst ned + Auto diff --git a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml index 975fcbdde..ccb4ba734 100644 --- a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -24,7 +24,7 @@ 在网站上查看 在浏览器中打开 完成 - NewPipe 项目非常严肃地对待您的隐私。因此,本应用没有您的同意不收集任何数据。\nNewPipe 的隐私政策详细解释发送崩溃报告时发送和存储的数据。 + NewPipe 项目非常重视您的隐私。因此,未经您的同意,本应用不会收集任何数据。 \nNewPipe 的隐私政策详细解释了发送崩溃报告时会发送和存储的数据。 不可用 由%1$s制作,在%2$s协议下发行 设置 From 76c04216608c7dc8b323cadffd8944130f7e3c77 Mon Sep 17 00:00:00 2001 From: Alexis M Date: Tue, 6 Oct 2026 17:34:24 +0200 Subject: [PATCH 062/155] Keep the chosen audio track for downloads The "recovery" info for an audio stream was using format and bitrate only, which did not take into account services with multiple audio tracks (e.g. Youtube dubs), leading to the wrong audio being selected. Fixes #13267 --- .../main/java/us/shandian/giga/get/DownloadMissionRecover.java | 2 ++ app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/us/shandian/giga/get/DownloadMissionRecover.java b/app/src/main/java/us/shandian/giga/get/DownloadMissionRecover.java index e001c6f3f..d3c007bb2 100644 --- a/app/src/main/java/us/shandian/giga/get/DownloadMissionRecover.java +++ b/app/src/main/java/us/shandian/giga/get/DownloadMissionRecover.java @@ -16,6 +16,7 @@ import java.io.InterruptedIOException; import java.net.HttpURLConnection; import java.nio.channels.ClosedByInterruptException; import java.util.List; +import java.util.Objects; import us.shandian.giga.get.DownloadMission.HttpError; @@ -135,6 +136,7 @@ public class DownloadMissionRecover extends Thread { for (final AudioStream audio : mExtractor.getAudioStreams()) { if (audio.getAverageBitrate() == mRecovery.getDesiredBitrate() && audio.getFormat() == mRecovery.getFormat() + && Objects.equals(audio.getAudioTrackId(), mRecovery.getDesired()) && audio.getDeliveryMethod() == DeliveryMethod.PROGRESSIVE_HTTP) { url = audio.getContent(); break; diff --git a/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt b/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt index c145b8506..f704666f8 100644 --- a/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt +++ b/app/src/main/java/us/shandian/giga/get/MissionRecoveryInfo.kt @@ -21,6 +21,7 @@ class MissionRecoveryInfo( constructor(stream: Stream) : this(format = stream.format) { when (stream) { is AudioStream -> { + desired = stream.audioTrackId desiredBitrate = stream.getAverageBitrate() isDesired2 = false kind = 'a' @@ -49,7 +50,7 @@ class MissionRecoveryInfo( when (kind) { 'a' -> { str.append("audio") - info = "bitrate=$desiredBitrate" + info = "bitrate=$desiredBitrate track=$desired" } 'v' -> { From be28d12b776aa5a684d41b56cc62674c1bac75e7 Mon Sep 17 00:00:00 2001 From: Mudsir Wazir Date: Wed, 7 Oct 2026 05:13:23 +0500 Subject: [PATCH 063/155] a11y: contentDescription for play button and sort icon (#13851) Co-authored-by: wized2 Co-authored-by: tobigr --- app/src/main/res/layout/fragment_video_detail.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 1a4711581..7aa22db2f 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -51,13 +51,13 @@ Date: Tue, 28 Apr 2026 15:53:20 +0800 Subject: [PATCH 064/155] [History sort mode] Fix inconsistent History title when opened from sidebar When the History page was opened from the sidebar, onResume() always reset the top bar title to "History", regardless of the selected sort mode. Now, show the current sort mode instead. Also the sort mode to string resource mapping is moved into StatisticSortMode, so new modes can be added without changing displaySortMode(). --- .../history/StatisticsPlaylistFragment.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java index 43b7f1c0d..33da13b23 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java @@ -102,7 +102,7 @@ public class StatisticsPlaylistFragment public void onResume() { super.onResume(); if (activity != null) { - setTitle(activity.getString(R.string.title_activity_history)); + displaySortMode(sortMode); } } @@ -384,9 +384,24 @@ public class StatisticsPlaylistFragment return new SinglePlayQueue(streamInfoItems, index); } + private void displaySortMode(final StatisticSortMode mode) { + final int resourceIdOfSortMode = mode.getResourceId(); + setTitle(getString(resourceIdOfSortMode)); + } + private enum StatisticSortMode { - LAST_PLAYED, - MOST_PLAYED, + LAST_PLAYED(R.string.title_last_played), + MOST_PLAYED(R.string.title_most_played); + + private final int resourceId; + + StatisticSortMode(final int theResourceId) { + this.resourceId = theResourceId; + } + + int getResourceId() { + return resourceId; + } } } From 5a1dd5be4a98fc591a04995128c34490ac94483e Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 7 Oct 2026 01:20:30 -0700 Subject: [PATCH 065/155] resolve conflicts from rebase --- .../kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt index 51b357452..376f6a134 100644 --- a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt @@ -50,4 +50,4 @@ class JVMAppearanceActions : AppearanceActions { else -> DesktopOs.UNKNOWN } } -} \ No newline at end of file +} From d45382ba9e485a38543ea20e451ab27faed8ff13 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 10 Jul 2026 02:28:13 +0100 Subject: [PATCH 066/155] add appearance settings screen --- .../app/viewmodel/settings/AppearanceSettingsViewModel.kt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt index c6602dd50..a58185769 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt @@ -9,16 +9,10 @@ import androidx.lifecycle.ViewModel import com.russhwolf.settings.Settings import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import net.newpipe.app.platform.AppearanceActions -import net.newpipe.app.preferences.AppearancePreferences import org.koin.core.annotation.KoinViewModel @KoinViewModel -class AppearanceSettingsViewModel( - private val settings: Settings, - private val appearanceActions: AppearanceActions, -) : ViewModel() { val theme: StateFlow field = MutableStateFlow( @@ -68,13 +62,11 @@ class AppearanceSettingsViewModel( fun setTheme(value: String) { settings.putString(AppearancePreferences.KEY_THEME, value) theme.value = value - appearanceActions.applyThemeChange(value) } fun setNightTheme(value: String) { settings.putString(AppearancePreferences.KEY_NIGHT_THEME, value) nightTheme.value = value - appearanceActions.applyThemeChange(theme.value) } fun setHoldToAppend(value: Boolean) { From 32341bdd992eb547563147c8c864eb9c1b05f3e2 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 15 Jul 2026 08:36:51 +0100 Subject: [PATCH 067/155] refactored to include appearance settings keys --- .../kotlin/net/newpipe/app/preferences/AppearancePreference.kt | 2 +- .../app/viewmodel/settings/AppearanceSettingsViewModel.kt | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt index ce3b36584..184b5f6c8 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt @@ -36,4 +36,4 @@ object AppearancePreferences { const val DEFAULT_LIST_VIEW_MODE = LIST_VIEW_AUTO const val DEFAULT_HOLD_TO_APPEND = true const val DEFAULT_MAIN_TABS_POSITION = false -} +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt index a58185769..bc02c56d6 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.ViewModel import com.russhwolf.settings.Settings import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import net.newpipe.app.preferences.AppearancePreferences import org.koin.core.annotation.KoinViewModel From 551e5ab691634fac2e299d9cf1a8b232cfc1e4af Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 15 Jul 2026 13:39:09 +0100 Subject: [PATCH 068/155] fix settings debug disappearance --- .../kotlin/net/newpipe/app/preferences/AppearancePreference.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt index 184b5f6c8..ce3b36584 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/AppearancePreference.kt @@ -36,4 +36,4 @@ object AppearancePreferences { const val DEFAULT_LIST_VIEW_MODE = LIST_VIEW_AUTO const val DEFAULT_HOLD_TO_APPEND = true const val DEFAULT_MAIN_TABS_POSITION = false -} \ No newline at end of file +} From 1baecc704b14500cc059856030310ee7cc85790b Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Thu, 16 Jul 2026 23:10:06 +0100 Subject: [PATCH 069/155] add videoaudio preference keys --- .../app/preferences/VideoAudioPreferences.kt | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt new file mode 100644 index 000000000..a19b28df2 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt @@ -0,0 +1,64 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.preferences + +/** + * Preference keys, values, and defaults for the Video & Audio settings screen. + */ + +object VideoAudioPreferences { + const val KEY_DEFAULT_RESOLUTION = "default_resolution" + const val KEY_DEFAULT_POPUP_RESOLUTION = "default_popup_resolution" + const val KEY_LIMIT_MOBILE_DATA_USAGE = "limit_mobile_data_usage" + const val KEY_SHOW_HIGHER_RESOLUTIONS = "show_higher_resolutions" + const val KEY_DEFAULT_VIDEO_FORMAT = "default_video_format" + const val KEY_DEFAULT_AUDIO_FORMAT = "default_audio_format" + const val KEY_PREFER_DESCRIPTIVE_AUDIO = "prefer_descriptive_audio" + + // Special resolution values that need a localized label + const val BEST_RESOLUTION = "best_resolution" + const val LIMIT_DATA_USAGE_NONE = "limit_data_usage_none" + + // Video/audio format values. + const val VIDEO_MP4 = "video_mp4" + const val VIDEO_WEBM = "video_webm" + const val VIDEO_3GP = "video_3gp" + const val AUDIO_M4A = "audio_m4a" + const val AUDIO_WEBM = "audio_webm" + + const val DEFAULT_RESOLUTION = "720p60" + const val DEFAULT_POPUP_RESOLUTION = "480p" + const val DEFAULT_LIMIT_MOBILE_DATA_USAGE = LIMIT_DATA_USAGE_NONE + const val DEFAULT_SHOW_HIGHER_RESOLUTIONS = false + const val DEFAULT_VIDEO_FORMAT = VIDEO_MP4 + const val DEFAULT_AUDIO_FORMAT = AUDIO_M4A + const val DEFAULT_PREFER_ORIGINAL_AUDIO = true + const val DEFAULT_PREFER_DESCRIPTIVE_AUDIO = false + + /** Higher resolutions, hidden behind the "show higher resolutions" toggle. */ + val HIGH_RESOLUTIONS = listOf("2160p", "1440p") + + /** Base playback resolutions, highest quality first, "best" pinned at the top. */ + val BASE_RESOLUTIONS = listOf( + BEST_RESOLUTION, "1080p60", "1080p", "720p60", "720p", "480p", "360p", "240p", "144p" + ) + + /** Base mobile-data limit resolutions, "no limit" pinned at the top. */ + val BASE_MOBILE_DATA_RESOLUTIONS = listOf( + LIMIT_DATA_USAGE_NONE, "1080p60", "1080p", "720p60", "720p", "480p", "360p", "240p", "144p" + ) + + val VIDEO_FORMATS = listOf(VIDEO_MP4 to "MPEG-4", VIDEO_WEBM to "WebM", VIDEO_3GP to "3GP") + + val AUDIO_FORMATS = listOf(AUDIO_M4A to "M4A", AUDIO_WEBM to "WebM") + + fun resolutions(showHigher: Boolean): List = insertHighResolutions(BASE_RESOLUTIONS, showHigher) + + fun mobileDataResolutions(showHigher: Boolean): List = insertHighResolutions(BASE_MOBILE_DATA_RESOLUTIONS, showHigher) + + private fun insertHighResolutions(base: List, showHigher: Boolean): List = + if (!showHigher) base else base.toMutableList().apply { addAll(1, HIGH_RESOLUTIONS) } +} From ac3fb1d8abf2b7b5c8d3801bb640eb574e10a720 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Thu, 16 Jul 2026 23:39:10 +0100 Subject: [PATCH 070/155] add video audio screen and viewmodel --- .../composeResources/values/strings.xml | 15 ++ .../app/preferences/VideoAudioPreferences.kt | 1 + .../settings/VideoAudioSettingsScreen.kt | 205 ++++++++++++++++++ .../settings/VideoAudioSettingsViewModel.kt | 148 +++++++++++++ 4 files changed, 369 insertions(+) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml index 71fded2db..335375bdf 100644 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ b/shared/src/commonMain/composeResources/values/strings.xml @@ -74,4 +74,19 @@ Card Cancel + + Default resolution + Default popup resolution + Limit resolution when using mobile data + Show higher resolutions + Only some devices can play 2K/4K videos + Default video format + Default audio format + Prefer original audio + Select the original audio track regardless of the language + Prefer descriptive audio + Select an audio track with descriptions for visually impaired people if available + Best resolution + No limit + diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt index a19b28df2..7d8e65e2e 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt @@ -16,6 +16,7 @@ object VideoAudioPreferences { const val KEY_SHOW_HIGHER_RESOLUTIONS = "show_higher_resolutions" const val KEY_DEFAULT_VIDEO_FORMAT = "default_video_format" const val KEY_DEFAULT_AUDIO_FORMAT = "default_audio_format" + const val KEY_PREFER_ORIGINAL_AUDIO = "prefer_original_audio" const val KEY_PREFER_DESCRIPTIVE_AUDIO = "prefer_descriptive_audio" // Special resolution values that need a localized label diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt new file mode 100644 index 000000000..0e52457cf --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt @@ -0,0 +1,205 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.screen.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import net.newpipe.app.composable.ListPreference +import net.newpipe.app.composable.ListPreferenceEntry +import net.newpipe.app.composable.SwitchPreference +import net.newpipe.app.composable.TopAppBar +import net.newpipe.app.navigation.Navigator +import net.newpipe.app.preferences.VideoAudioPreferences +import net.newpipe.app.preview.ThemePreviewProvider +import net.newpipe.app.viewmodel.settings.VideoAudioSettingsViewModel +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.best_resolution +import newpipe.shared.generated.resources.default_audio_format_title +import newpipe.shared.generated.resources.default_popup_resolution_title +import newpipe.shared.generated.resources.default_resolution_title +import newpipe.shared.generated.resources.default_video_format_title +import newpipe.shared.generated.resources.limit_data_usage_none_description +import newpipe.shared.generated.resources.limit_mobile_data_usage_title +import newpipe.shared.generated.resources.prefer_descriptive_audio_summary +import newpipe.shared.generated.resources.prefer_descriptive_audio_title +import newpipe.shared.generated.resources.prefer_original_audio_summary +import newpipe.shared.generated.resources.prefer_original_audio_title +import newpipe.shared.generated.resources.settings_category_video_audio_title +import newpipe.shared.generated.resources.show_higher_resolutions_summary +import newpipe.shared.generated.resources.show_higher_resolutions_title +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel + +@Composable +fun VideoAudioSettingsScreen( + navigator: Navigator = koinInject(), + viewModel: VideoAudioSettingsViewModel = koinViewModel() +) { + val defaultResolution by viewModel.defaultResolution.collectAsStateWithLifecycle() + val defaultPopupResolution by viewModel.defaultPopupResolution.collectAsStateWithLifecycle() + val mobileDataResolution by viewModel.mobileDataResolution.collectAsStateWithLifecycle() + val showHigherResolutions by viewModel.showHigherResolutions.collectAsStateWithLifecycle() + val resolutionValues by viewModel.resolutionValues.collectAsStateWithLifecycle() + val mobileDataResolutionValues by viewModel.mobileDataResolutionValues.collectAsStateWithLifecycle() + val videoFormat by viewModel.videoFormat.collectAsStateWithLifecycle() + val audioFormat by viewModel.audioFormat.collectAsStateWithLifecycle() + val preferOriginalAudio by viewModel.preferOriginalAudio.collectAsStateWithLifecycle() + val preferDescriptiveAudio by viewModel.preferDescriptiveAudio.collectAsStateWithLifecycle() + + VideoAudioSettingsScreenContent( + defaultResolution = defaultResolution, + defaultPopupResolution = defaultPopupResolution, + mobileDataResolution = mobileDataResolution, + showHigherResolutions = showHigherResolutions, + resolutionValues = resolutionValues, + mobileDataResolutionValues = mobileDataResolutionValues, + videoFormat = videoFormat, + audioFormat = audioFormat, + preferOriginalAudio = preferOriginalAudio, + preferDescriptiveAudio = preferDescriptiveAudio, + onDefaultResolutionChange = viewModel::setDefaultResolution, + onDefaultPopupResolutionChange = viewModel::setDefaultPopupResolution, + onMobileDataResolutionChange = viewModel::setMobileDataResolution, + onShowHigherResolutionsChange = viewModel::setShowHigherResolutions, + onVideoFormatChange = viewModel::setVideoFormat, + onAudioFormatChange = viewModel::setAudioFormat, + onPreferOriginalAudioChange = viewModel::setPreferOriginalAudio, + onPreferDescriptiveAudioChange = viewModel::setPreferDescriptiveAudio, + onNavigateUp = { navigator.navigateUp() } + ) +} + +@Composable +fun VideoAudioSettingsScreenContent( + defaultResolution: String = VideoAudioPreferences.DEFAULT_RESOLUTION, + defaultPopupResolution: String = VideoAudioPreferences.DEFAULT_POPUP_RESOLUTION, + mobileDataResolution: String = VideoAudioPreferences.DEFAULT_LIMIT_MOBILE_DATA_USAGE, + showHigherResolutions: Boolean = VideoAudioPreferences.DEFAULT_SHOW_HIGHER_RESOLUTIONS, + resolutionValues: List = VideoAudioPreferences.BASE_RESOLUTIONS, + mobileDataResolutionValues: List = VideoAudioPreferences.BASE_MOBILE_DATA_RESOLUTIONS, + videoFormat: String = VideoAudioPreferences.DEFAULT_VIDEO_FORMAT, + audioFormat: String = VideoAudioPreferences.DEFAULT_AUDIO_FORMAT, + preferOriginalAudio: Boolean = VideoAudioPreferences.DEFAULT_PREFER_ORIGINAL_AUDIO, + preferDescriptiveAudio: Boolean = VideoAudioPreferences.DEFAULT_PREFER_DESCRIPTIVE_AUDIO, + onDefaultResolutionChange: (String) -> Unit = {}, + onDefaultPopupResolutionChange: (String) -> Unit = {}, + onMobileDataResolutionChange: (String) -> Unit = {}, + onShowHigherResolutionsChange: (Boolean) -> Unit = {}, + onVideoFormatChange: (String) -> Unit = {}, + onAudioFormatChange: (String) -> Unit = {}, + onPreferOriginalAudioChange: (Boolean) -> Unit = {}, + onPreferDescriptiveAudioChange: (Boolean) -> Unit = {}, + onNavigateUp: () -> Unit = {} +) { + val bestResolutionLabel = stringResource(Res.string.best_resolution) + val noLimitLabel = stringResource(Res.string.limit_data_usage_none_description) + + fun resolutionEntry(value: String) = ListPreferenceEntry( + value = value, + title = if (value == VideoAudioPreferences.BEST_RESOLUTION) bestResolutionLabel else value + ) + + fun mobileDataEntry(value: String) = ListPreferenceEntry( + value = value, + title = if (value == VideoAudioPreferences.LIMIT_DATA_USAGE_NONE) noLimitLabel else value + ) + + val resolutionEntries = resolutionValues.map(::resolutionEntry) + val mobileDataEntries = mobileDataResolutionValues.map(::mobileDataEntry) + val videoFormatEntries = VideoAudioPreferences.VIDEO_FORMATS.map { (value, label) -> + ListPreferenceEntry(value, label) + } + val audioFormatEntries = VideoAudioPreferences.AUDIO_FORMATS.map { (value, label) -> + ListPreferenceEntry(value, label) + } + + Scaffold( + topBar = { + TopAppBar( + title = stringResource(Res.string.settings_category_video_audio_title), + onNavigateUp = onNavigateUp + ) + } + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(top = paddingValues.calculateTopPadding()) + .verticalScroll(rememberScrollState()) + .padding(WindowInsets.navigationBars.asPaddingValues()) + ) { + ListPreference( + title = stringResource(Res.string.default_resolution_title), + entries = resolutionEntries, + selectedValue = defaultResolution, + onValueSelected = onDefaultResolutionChange + ) + ListPreference( + title = stringResource(Res.string.default_popup_resolution_title), + entries = resolutionEntries, + selectedValue = defaultPopupResolution, + onValueSelected = onDefaultPopupResolutionChange + ) + ListPreference( + title = stringResource(Res.string.limit_mobile_data_usage_title), + entries = mobileDataEntries, + selectedValue = mobileDataResolution, + onValueSelected = onMobileDataResolutionChange + ) + SwitchPreference( + title = stringResource(Res.string.show_higher_resolutions_title), + summary = stringResource(Res.string.show_higher_resolutions_summary), + checked = showHigherResolutions, + onCheckedChange = onShowHigherResolutionsChange + ) + ListPreference( + title = stringResource(Res.string.default_video_format_title), + entries = videoFormatEntries, + selectedValue = videoFormat, + onValueSelected = onVideoFormatChange + ) + ListPreference( + title = stringResource(Res.string.default_audio_format_title), + entries = audioFormatEntries, + selectedValue = audioFormat, + onValueSelected = onAudioFormatChange + ) + SwitchPreference( + title = stringResource(Res.string.prefer_original_audio_title), + summary = stringResource(Res.string.prefer_original_audio_summary), + checked = preferOriginalAudio, + onCheckedChange = onPreferOriginalAudioChange + ) + SwitchPreference( + title = stringResource(Res.string.prefer_descriptive_audio_title), + summary = stringResource(Res.string.prefer_descriptive_audio_summary), + checked = preferDescriptiveAudio, + onCheckedChange = onPreferDescriptiveAudioChange + ) + } + } +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun VideoAudioSettingsScreenPreview() { + VideoAudioSettingsScreenContent() +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt new file mode 100644 index 000000000..4aac58452 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt @@ -0,0 +1,148 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.viewmodel.settings + +import androidx.lifecycle.ViewModel +import com.russhwolf.settings.Settings +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import net.newpipe.app.preferences.VideoAudioPreferences +import org.koin.core.annotation.KoinViewModel + +@KoinViewModel +class VideoAudioSettingsViewModel(private val settings: Settings) : ViewModel() { + + val defaultResolution: StateFlow + field = MutableStateFlow( + settings.getString( + VideoAudioPreferences.KEY_DEFAULT_RESOLUTION, + VideoAudioPreferences.DEFAULT_RESOLUTION + ) + ) + + val defaultPopupResolution: StateFlow + field = MutableStateFlow( + settings.getString( + VideoAudioPreferences.KEY_DEFAULT_POPUP_RESOLUTION, + VideoAudioPreferences.DEFAULT_POPUP_RESOLUTION + ) + ) + + val mobileDataResolution: StateFlow + field = MutableStateFlow( + settings.getString( + VideoAudioPreferences.KEY_LIMIT_MOBILE_DATA_USAGE, + VideoAudioPreferences.DEFAULT_LIMIT_MOBILE_DATA_USAGE + ) + ) + + val showHigherResolutions: StateFlow + field = MutableStateFlow( + settings.getBoolean( + VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS, + VideoAudioPreferences.DEFAULT_SHOW_HIGHER_RESOLUTIONS + ) + ) + + /** Resolution values available for the default & popup pickers; grows with [showHigherResolutions]. */ + val resolutionValues: StateFlow> + field = MutableStateFlow(VideoAudioPreferences.resolutions(showHigherResolutions.value)) + + /** Resolution values for the mobile-data limit picker; grows with [showHigherResolutions]. */ + val mobileDataResolutionValues: StateFlow> + field = MutableStateFlow(VideoAudioPreferences.mobileDataResolutions(showHigherResolutions.value)) + + val videoFormat: StateFlow + field = MutableStateFlow( + settings.getString( + VideoAudioPreferences.KEY_DEFAULT_VIDEO_FORMAT, + VideoAudioPreferences.DEFAULT_VIDEO_FORMAT + ) + ) + + val audioFormat: StateFlow + field = MutableStateFlow( + settings.getString( + VideoAudioPreferences.KEY_DEFAULT_AUDIO_FORMAT, + VideoAudioPreferences.DEFAULT_AUDIO_FORMAT + ) + ) + + val preferOriginalAudio: StateFlow + field = MutableStateFlow( + settings.getBoolean( + VideoAudioPreferences.KEY_PREFER_ORIGINAL_AUDIO, + VideoAudioPreferences.DEFAULT_PREFER_ORIGINAL_AUDIO + ) + ) + + val preferDescriptiveAudio: StateFlow + field = MutableStateFlow( + settings.getBoolean( + VideoAudioPreferences.KEY_PREFER_DESCRIPTIVE_AUDIO, + VideoAudioPreferences.DEFAULT_PREFER_DESCRIPTIVE_AUDIO + ) + ) + + fun setDefaultResolution(value: String) { + settings.putString(VideoAudioPreferences.KEY_DEFAULT_RESOLUTION, value) + defaultResolution.value = value + } + + fun setDefaultPopupResolution(value: String) { + settings.putString(VideoAudioPreferences.KEY_DEFAULT_POPUP_RESOLUTION, value) + defaultPopupResolution.value = value + } + + fun setMobileDataResolution(value: String) { + settings.putString(VideoAudioPreferences.KEY_LIMIT_MOBILE_DATA_USAGE, value) + mobileDataResolution.value = value + } + + /** + * Toggling higher resolutions rebuilds the pickers' option lists. When turning the option + * off, any currently selected high resolution is reset to the top entry, matching the legacy + * screen (which called `setValueIndex(0)`). + */ + fun setShowHigherResolutions(value: Boolean) { + settings.putBoolean(VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS, value) + showHigherResolutions.value = value + resolutionValues.value = VideoAudioPreferences.resolutions(value) + mobileDataResolutionValues.value = VideoAudioPreferences.mobileDataResolutions(value) + + if (!value) { + if (defaultResolution.value in VideoAudioPreferences.HIGH_RESOLUTIONS) { + setDefaultResolution(VideoAudioPreferences.BEST_RESOLUTION) + } + if (defaultPopupResolution.value in VideoAudioPreferences.HIGH_RESOLUTIONS) { + setDefaultPopupResolution(VideoAudioPreferences.BEST_RESOLUTION) + } + if (mobileDataResolution.value in VideoAudioPreferences.HIGH_RESOLUTIONS) { + setMobileDataResolution(VideoAudioPreferences.LIMIT_DATA_USAGE_NONE) + } + } + } + + fun setVideoFormat(value: String) { + settings.putString(VideoAudioPreferences.KEY_DEFAULT_VIDEO_FORMAT, value) + videoFormat.value = value + } + + fun setAudioFormat(value: String) { + settings.putString(VideoAudioPreferences.KEY_DEFAULT_AUDIO_FORMAT, value) + audioFormat.value = value + } + + fun setPreferOriginalAudio(value: Boolean) { + settings.putBoolean(VideoAudioPreferences.KEY_PREFER_ORIGINAL_AUDIO, value) + preferOriginalAudio.value = value + } + + fun setPreferDescriptiveAudio(value: Boolean) { + settings.putBoolean(VideoAudioPreferences.KEY_PREFER_DESCRIPTIVE_AUDIO, value) + preferDescriptiveAudio.value = value + } +} From 24fc4d119448029d44a6493fb67631062db3b817 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Thu, 16 Jul 2026 23:46:35 +0100 Subject: [PATCH 071/155] setup navigation for videoaudio settings --- .../kotlin/net/newpipe/app/navigation/Destination.kt | 3 +++ .../kotlin/net/newpipe/app/navigation/NavModule.kt | 5 +++++ .../net/newpipe/app/screen/settings/SettingsHomeScreen.kt | 6 ++++-- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt index 49f6f0900..0d0c8c172 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt @@ -15,6 +15,9 @@ import net.newpipe.app.model.License @Serializable sealed interface Destination : NavKey { + @Serializable + data object VideoAudioSettings : Destination + @Serializable data object AppearanceSettings : Destination diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt index d7f6f3b61..1030e1433 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt @@ -10,6 +10,7 @@ import co.touchlab.kermit.Logger import net.newpipe.app.screen.about.AboutScreen import net.newpipe.app.screen.settings.AppearanceSettingsScreen import net.newpipe.app.screen.settings.SettingsHomeScreen +import net.newpipe.app.screen.settings.VideoAudioSettingsScreen import org.koin.core.annotation.KoinExperimentalAPI import org.koin.core.annotation.Provided import org.koin.core.annotation.Singleton @@ -37,6 +38,10 @@ fun navModule() = module { navigation { AppearanceSettingsScreen() } + + navigation { + VideoAudioSettingsScreen() + } } /** diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt index 520aee0f1..e3cadd514 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt @@ -52,8 +52,10 @@ fun SettingsHomeScreen( icon = type.icon, onClick = { when (type) { - SettingsCategoryType.APPEARANCE -> - navigator.navigateTo(Destination.AppearanceSettings) + SettingsCategoryType.APPEARANCE -> navigator.navigateTo(Destination.AppearanceSettings) + + SettingsCategoryType.VIDEO_AUDIO -> navigator.navigateTo(Destination.VideoAudioSettings) + // TODO: wire remaining sub-screens as they are migrated else -> Unit } From 800d175aa2174d3a2c75821bc92ddf55aab3fced Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 22 Jul 2026 12:32:53 +0100 Subject: [PATCH 072/155] theme changes rebuild host activity --- .../settings/AppearanceSettingsViewModel.kt | 7 ++++ .../app/platform/JVMAppearanceActions.kt | 40 +------------------ 2 files changed, 8 insertions(+), 39 deletions(-) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt index bc02c56d6..c6602dd50 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt @@ -9,11 +9,16 @@ import androidx.lifecycle.ViewModel import com.russhwolf.settings.Settings import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow +import net.newpipe.app.platform.AppearanceActions import net.newpipe.app.preferences.AppearancePreferences import org.koin.core.annotation.KoinViewModel @KoinViewModel +class AppearanceSettingsViewModel( + private val settings: Settings, + private val appearanceActions: AppearanceActions, +) : ViewModel() { val theme: StateFlow field = MutableStateFlow( @@ -63,11 +68,13 @@ import org.koin.core.annotation.KoinViewModel fun setTheme(value: String) { settings.putString(AppearancePreferences.KEY_THEME, value) theme.value = value + appearanceActions.applyThemeChange(value) } fun setNightTheme(value: String) { settings.putString(AppearancePreferences.KEY_NIGHT_THEME, value) nightTheme.value = value + appearanceActions.applyThemeChange(theme.value) } fun setHoldToAppend(value: Boolean) { diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt index 376f6a134..e30360d45 100644 --- a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt @@ -5,49 +5,11 @@ package net.newpipe.app.platform -import co.touchlab.kermit.Logger import org.koin.core.annotation.Singleton -import java.io.IOException @Singleton(binds = [AppearanceActions::class]) class JVMAppearanceActions : AppearanceActions { - - private val captionSettingsCommand: List? = when (currentOs()) { - DesktopOs.WINDOWS -> - // Closed-caption styling page - listOf("cmd", "/c", "start", "", "ms-settings:easeofaccess-closedcaptioning") - - // Subtitles & captions styling pane. This is community-documented,so on newer macOS it may open the Accessibility pane without directing to Captions. - DesktopOs.MAC -> - listOf("open", "x-apple.systempreferences:com.apple.preference.universalaccess?Captions") - - // Nothing for Linux yet - DesktopOs.LINUX, - DesktopOs.UNKNOWN -> null - } - - override fun isCaptionSettingsAvailable() = captionSettingsCommand != null - - override fun openCaptionSettings() { - val command = captionSettingsCommand ?: return - try { - ProcessBuilder(command).start() - } catch (exception: IOException) { - Logger.e(messageString = "Could not open caption settings", throwable = exception) - } - } + override fun openCaptionSettings() = Unit override fun applyThemeChange(theme: String) = Unit - - private enum class DesktopOs { WINDOWS, MAC, LINUX, UNKNOWN } - - private fun currentOs(): DesktopOs { - val osName = System.getProperty("os.name").orEmpty().lowercase() - return when { - osName.startsWith("windows") -> DesktopOs.WINDOWS - osName.startsWith("mac") -> DesktopOs.MAC - osName.contains("nux") || osName.contains("nix") || osName.contains("aix") -> DesktopOs.LINUX - else -> DesktopOs.UNKNOWN - } - } } From 8d994b27d7249ae00728c8bdf7eadb3cea574389 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 22 Jul 2026 20:33:33 +0100 Subject: [PATCH 073/155] hide caption setting on platforms without support --- .../kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt index e30360d45..ff96862cc 100644 --- a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt @@ -9,6 +9,9 @@ import org.koin.core.annotation.Singleton @Singleton(binds = [AppearanceActions::class]) class JVMAppearanceActions : AppearanceActions { + + override fun isCaptionSettingsAvailable() = false + override fun openCaptionSettings() = Unit override fun applyThemeChange(theme: String) = Unit From b8f9c5852380e1d1b5d501653c4566edf9aada62 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 22 Jul 2026 21:24:24 +0100 Subject: [PATCH 074/155] handle jvm captions for different desktop platforms --- .../app/platform/JVMAppearanceActions.kt | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt index ff96862cc..51b357452 100644 --- a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMAppearanceActions.kt @@ -5,14 +5,49 @@ package net.newpipe.app.platform +import co.touchlab.kermit.Logger import org.koin.core.annotation.Singleton +import java.io.IOException @Singleton(binds = [AppearanceActions::class]) class JVMAppearanceActions : AppearanceActions { - override fun isCaptionSettingsAvailable() = false + private val captionSettingsCommand: List? = when (currentOs()) { + DesktopOs.WINDOWS -> + // Closed-caption styling page + listOf("cmd", "/c", "start", "", "ms-settings:easeofaccess-closedcaptioning") - override fun openCaptionSettings() = Unit + // Subtitles & captions styling pane. This is community-documented,so on newer macOS it may open the Accessibility pane without directing to Captions. + DesktopOs.MAC -> + listOf("open", "x-apple.systempreferences:com.apple.preference.universalaccess?Captions") + + // Nothing for Linux yet + DesktopOs.LINUX, + DesktopOs.UNKNOWN -> null + } + + override fun isCaptionSettingsAvailable() = captionSettingsCommand != null + + override fun openCaptionSettings() { + val command = captionSettingsCommand ?: return + try { + ProcessBuilder(command).start() + } catch (exception: IOException) { + Logger.e(messageString = "Could not open caption settings", throwable = exception) + } + } override fun applyThemeChange(theme: String) = Unit -} + + private enum class DesktopOs { WINDOWS, MAC, LINUX, UNKNOWN } + + private fun currentOs(): DesktopOs { + val osName = System.getProperty("os.name").orEmpty().lowercase() + return when { + osName.startsWith("windows") -> DesktopOs.WINDOWS + osName.startsWith("mac") -> DesktopOs.MAC + osName.contains("nux") || osName.contains("nix") || osName.contains("aix") -> DesktopOs.LINUX + else -> DesktopOs.UNKNOWN + } + } +} \ No newline at end of file From 939ff4254fe6e2a0cd794b88a14894106acceb63 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 22 Jul 2026 22:28:25 +0100 Subject: [PATCH 075/155] refactored code and added video/audio settings test --- .../settings/VideoAudioSettingsScreen.kt | 9 ++- .../settings/VideoAudioSettingsViewModel.kt | 15 ----- .../settings/VideoAudioSettingsScreenTest.kt | 55 +++++++++++++++++++ 3 files changed, 62 insertions(+), 17 deletions(-) create mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt index 0e52457cf..02a6b8506 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt @@ -16,6 +16,7 @@ import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewWrapper @@ -56,8 +57,12 @@ fun VideoAudioSettingsScreen( val defaultPopupResolution by viewModel.defaultPopupResolution.collectAsStateWithLifecycle() val mobileDataResolution by viewModel.mobileDataResolution.collectAsStateWithLifecycle() val showHigherResolutions by viewModel.showHigherResolutions.collectAsStateWithLifecycle() - val resolutionValues by viewModel.resolutionValues.collectAsStateWithLifecycle() - val mobileDataResolutionValues by viewModel.mobileDataResolutionValues.collectAsStateWithLifecycle() + val resolutionValues = remember(showHigherResolutions) { + VideoAudioPreferences.resolutions(showHigherResolutions) + } + val mobileDataResolutionValues = remember(showHigherResolutions) { + VideoAudioPreferences.mobileDataResolutions(showHigherResolutions) + } val videoFormat by viewModel.videoFormat.collectAsStateWithLifecycle() val audioFormat by viewModel.audioFormat.collectAsStateWithLifecycle() val preferOriginalAudio by viewModel.preferOriginalAudio.collectAsStateWithLifecycle() diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt index 4aac58452..9a467688e 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt @@ -47,14 +47,6 @@ class VideoAudioSettingsViewModel(private val settings: Settings) : ViewModel() ) ) - /** Resolution values available for the default & popup pickers; grows with [showHigherResolutions]. */ - val resolutionValues: StateFlow> - field = MutableStateFlow(VideoAudioPreferences.resolutions(showHigherResolutions.value)) - - /** Resolution values for the mobile-data limit picker; grows with [showHigherResolutions]. */ - val mobileDataResolutionValues: StateFlow> - field = MutableStateFlow(VideoAudioPreferences.mobileDataResolutions(showHigherResolutions.value)) - val videoFormat: StateFlow field = MutableStateFlow( settings.getString( @@ -102,16 +94,9 @@ class VideoAudioSettingsViewModel(private val settings: Settings) : ViewModel() mobileDataResolution.value = value } - /** - * Toggling higher resolutions rebuilds the pickers' option lists. When turning the option - * off, any currently selected high resolution is reset to the top entry, matching the legacy - * screen (which called `setValueIndex(0)`). - */ fun setShowHigherResolutions(value: Boolean) { settings.putBoolean(VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS, value) showHigherResolutions.value = value - resolutionValues.value = VideoAudioPreferences.resolutions(value) - mobileDataResolutionValues.value = VideoAudioPreferences.mobileDataResolutions(value) if (!value) { if (defaultResolution.value in VideoAudioPreferences.HIGH_RESOLUTIONS) { diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt new file mode 100644 index 000000000..0731e89dc --- /dev/null +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.screen.settings + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.v2.runComposeUiTest +import com.russhwolf.settings.MapSettings +import com.russhwolf.settings.Settings +import kotlin.test.Test +import net.newpipe.app.extensions.withKoin +import net.newpipe.app.preferences.VideoAudioPreferences +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.best_resolution +import newpipe.shared.generated.resources.default_resolution_title +import newpipe.shared.generated.resources.settings_category_video_audio_title +import org.jetbrains.compose.resources.getString +import org.koin.dsl.module + +@OptIn(ExperimentalTestApi::class) +class VideoAudioSettingsScreenTest { + + private val emptySettings = module { + single { MapSettings() } + } + + @Test + fun rendersTitleAndResolutionRow() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { VideoAudioSettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.settings_category_video_audio_title)).assertIsDisplayed() + onNodeWithText(getString(Res.string.default_resolution_title)).assertIsDisplayed() + } + ) + } + + @Test + fun bestResolutionShowsLocalizedLabelAsSummary() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { + VideoAudioSettingsScreenContent(defaultResolution = VideoAudioPreferences.BEST_RESOLUTION) + }, + onContent = { + onNodeWithText(getString(Res.string.best_resolution)).assertIsDisplayed() + } + ) + } +} \ No newline at end of file From 62784f3cad3318709b777bb1e9cc17ed8285e63b Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 22 Jul 2026 23:22:44 +0100 Subject: [PATCH 076/155] add string resources and remaining preference keys --- .../composeResources/values/strings.xml | 63 +++++++++++++ .../app/composable/PreferenceCategoryTitle.kt | 2 + .../app/preferences/VideoAudioPreferences.kt | 90 ++++++++++++++++++- 3 files changed, 153 insertions(+), 2 deletions(-) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml index 335375bdf..579c27a7c 100644 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ b/shared/src/commonMain/composeResources/values/strings.xml @@ -89,4 +89,67 @@ Best resolution No limit + + Player + Use external video player + Removes audio at some resolutions + Use external audio player + Show \"Play with Kodi\" option + Display an option to play a video via Kodi media center + Seekbar thumbnail preview + High quality (larger) + Low quality (smaller) + Don\'t show + + + Behavior + Preferred \'open\' action + Default action when opening content — %1$s + Show info + Video player + Background player + Popup player + Download + Add to playlist + Enqueue + Always ask + Minimize on app switch + Action when switching to other app from main video player — %1$s + None + Minimize to background player + Minimize to popup player + Start main player in fullscreen + Do not start videos in the mini player, but turn to fullscreen mode directly, if auto rotation is locked. You can still access the mini player by exiting fullscreen + Autoplay + Start playback automatically — %1$s + Always + Only on Wi-Fi + Never + Auto-enqueue next stream + Continue ending (non-repeating) playback queue by appending a related stream + Resume playing + Continue playing after interruptions (e.g. phonecalls) + Left gesture action + Choose gesture for left half of player screen + Right gesture action + Choose gesture for right half of player screen + Brightness + Volume + None + Remember popup properties + Remember last size and position of popup + Use fast inexact seek + Inexact seek allows the player to seek to positions faster with reduced precision. Seeking for 5, 15 or 25 seconds doesn\'t work with this + Fast-forward/-rewind seek duration + Due to ExoPlayer constraints the seek duration was set to %1$d seconds + Ask for confirmation before clearing a queue + Switching from one player to another may replace your queue + Ignore hardware media button events + Useful, for instance, if you are using a headset with broken physical buttons + + %1$d second + %1$d seconds + + + diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt new file mode 100644 index 000000000..f6d2235bb --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt @@ -0,0 +1,2 @@ +package net.newpipe.app.composable + diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt index 7d8e65e2e..26a2818f3 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt @@ -19,6 +19,27 @@ object VideoAudioPreferences { const val KEY_PREFER_ORIGINAL_AUDIO = "prefer_original_audio" const val KEY_PREFER_DESCRIPTIVE_AUDIO = "prefer_descriptive_audio" + // Player section + const val KEY_USE_EXTERNAL_VIDEO_PLAYER = "use_external_video_player" + const val KEY_USE_EXTERNAL_AUDIO_PLAYER = "use_external_audio_player" + const val KEY_SHOW_PLAY_WITH_KODI = "show_play_with_kodi" + const val KEY_SEEKBAR_PREVIEW_THUMBNAIL = "seekbar_preview_thumbnail_key" + + // Behavior section + const val KEY_PREFERRED_OPEN_ACTION = "preferred_open_action_key" + const val KEY_MINIMIZE_ON_EXIT = "minimize_on_exit_key" + const val KEY_START_MAIN_PLAYER_FULLSCREEN = "start_main_player_fullscreen_key" + const val KEY_AUTOPLAY = "autoplay_key" + const val KEY_AUTO_QUEUE = "auto_queue_key" + const val KEY_RESUME_ON_AUDIO_FOCUS_GAIN = "resume_on_audio_focus_gain" + const val KEY_LEFT_GESTURE_CONTROL = "left_gesture_control" + const val KEY_RIGHT_GESTURE_CONTROL = "right_gesture_control" + const val KEY_POPUP_REMEMBER_SIZE_POS = "popup_remember_size_pos_key" + const val KEY_USE_INEXACT_SEEK = "use_inexact_seek_key" + const val KEY_SEEK_DURATION = "seek_duration" + const val KEY_CLEAR_QUEUE_CONFIRMATION = "clear_queue_confirmation_key" + const val KEY_IGNORE_HARDWARE_MEDIA_BUTTONS = "ignore_hardware_media_buttons_key" + // Special resolution values that need a localized label const val BEST_RESOLUTION = "best_resolution" const val LIMIT_DATA_USAGE_NONE = "limit_data_usage_none" @@ -30,6 +51,36 @@ object VideoAudioPreferences { const val AUDIO_M4A = "audio_m4a" const val AUDIO_WEBM = "audio_webm" + // Seekbar preview thumbnail values. + const val SEEKBAR_THUMBNAIL_HIGH_QUALITY = "seekbar_preview_thumbnail_high_quality" + const val SEEKBAR_THUMBNAIL_LOW_QUALITY = "seekbar_preview_thumbnail_low_quality" + const val SEEKBAR_THUMBNAIL_NONE = "seekbar_preview_thumbnail_none" + + // Preferred open action values. + const val OPEN_ACTION_SHOW_INFO = "show_info" + const val OPEN_ACTION_VIDEO_PLAYER = "video_player" + const val OPEN_ACTION_BACKGROUND_PLAYER = "background_player" + const val OPEN_ACTION_POPUP_PLAYER = "popup_player" + const val OPEN_ACTION_DOWNLOAD = "download" + const val OPEN_ACTION_ADD_TO_PLAYLIST = "add_to_playlist" + const val OPEN_ACTION_ENQUEUE = "enqueue" + const val OPEN_ACTION_ALWAYS_ASK = "always_ask_player" + + // Minimize on exit values. + const val MINIMIZE_ON_EXIT_NONE = "minimize_on_exit_none_key" + const val MINIMIZE_ON_EXIT_BACKGROUND = "minimize_on_exit_background_key" + const val MINIMIZE_ON_EXIT_POPUP = "minimize_on_exit_popup_key" + + // Autoplay values. + const val AUTOPLAY_ALWAYS = "autoplay_always_key" + const val AUTOPLAY_WIFI = "autoplay_wifi_key" + const val AUTOPLAY_NEVER = "autoplay_never_key" + + // Player gesture values. + const val GESTURE_BRIGHTNESS = "brightness_control" + const val GESTURE_VOLUME = "volume_control" + const val GESTURE_NONE = "none_control" + const val DEFAULT_RESOLUTION = "720p60" const val DEFAULT_POPUP_RESOLUTION = "480p" const val DEFAULT_LIMIT_MOBILE_DATA_USAGE = LIMIT_DATA_USAGE_NONE @@ -38,6 +89,25 @@ object VideoAudioPreferences { const val DEFAULT_AUDIO_FORMAT = AUDIO_M4A const val DEFAULT_PREFER_ORIGINAL_AUDIO = true const val DEFAULT_PREFER_DESCRIPTIVE_AUDIO = false + const val DEFAULT_USE_EXTERNAL_VIDEO_PLAYER = false + const val DEFAULT_USE_EXTERNAL_AUDIO_PLAYER = false + const val DEFAULT_SHOW_PLAY_WITH_KODI = false + const val DEFAULT_SEEKBAR_PREVIEW_THUMBNAIL = SEEKBAR_THUMBNAIL_HIGH_QUALITY + const val DEFAULT_PREFERRED_OPEN_ACTION = OPEN_ACTION_ALWAYS_ASK + const val DEFAULT_MINIMIZE_ON_EXIT = MINIMIZE_ON_EXIT_BACKGROUND + const val DEFAULT_START_MAIN_PLAYER_FULLSCREEN = false + const val DEFAULT_AUTOPLAY = AUTOPLAY_WIFI + const val DEFAULT_AUTO_QUEUE = false + const val DEFAULT_RESUME_ON_AUDIO_FOCUS_GAIN = false + const val DEFAULT_LEFT_GESTURE_CONTROL = GESTURE_BRIGHTNESS + const val DEFAULT_RIGHT_GESTURE_CONTROL = GESTURE_VOLUME + const val DEFAULT_POPUP_REMEMBER_SIZE_POS = true + const val DEFAULT_USE_INEXACT_SEEK = false + const val DEFAULT_SEEK_DURATION_MS = "10000" + const val DEFAULT_CLEAR_QUEUE_CONFIRMATION = false + const val DEFAULT_IGNORE_HARDWARE_MEDIA_BUTTONS = false + + private const val MILLIS_PER_SECOND = 1000 /** Higher resolutions, hidden behind the "show higher resolutions" toggle. */ val HIGH_RESOLUTIONS = listOf("2160p", "1440p") @@ -56,10 +126,26 @@ object VideoAudioPreferences { val AUDIO_FORMATS = listOf(AUDIO_M4A to "M4A", AUDIO_WEBM to "WebM") + /** Seek durations in milliseconds, stored as strings like the legacy app. */ + val SEEK_DURATIONS_MS = listOf("5000", "10000", "15000", "20000", "25000", "30000") + fun resolutions(showHigher: Boolean): List = insertHighResolutions(BASE_RESOLUTIONS, showHigher) fun mobileDataResolutions(showHigher: Boolean): List = insertHighResolutions(BASE_MOBILE_DATA_RESOLUTIONS, showHigher) - private fun insertHighResolutions(base: List, showHigher: Boolean): List = - if (!showHigher) base else base.toMutableList().apply { addAll(1, HIGH_RESOLUTIONS) } + fun seekDurationSeconds(durationMs: String): Int = durationMs.toInt() / MILLIS_PER_SECOND + + /** ExoPlayer can't inexact-seek in 5-second steps in audio, so those durations are hidden. */ + fun seekDurationsMs(inexactSeek: Boolean): List = if (!inexactSeek) SEEK_DURATIONS_MS else SEEK_DURATIONS_MS.filter { seekDurationSeconds(it) % 10 != 5 } + + /** + * The seek duration to switch to when [inexactSeek] hides the currently selected one or null when no adjustment is needed. + */ + fun adjustedSeekDurationMs(currentMs: String, inexactSeek: Boolean): String? { + if (!inexactSeek) return null + val seconds = seekDurationSeconds(currentMs) + return if (seconds % 10 == 5) ((seconds + 5) * MILLIS_PER_SECOND).toString() else null + } + + private fun insertHighResolutions(base: List, showHigher: Boolean): List = if (!showHigher) base else base.toMutableList().apply { addAll(1, HIGH_RESOLUTIONS) } } From 561afbf5a64d1775c03dc2f879ae45ce2ddb74a0 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 22 Jul 2026 23:32:34 +0100 Subject: [PATCH 077/155] update the video-audio screen viewmodel, and tests --- .../composeResources/values/strings.xml | 6 +- .../app/composable/PreferenceCategoryTitle.kt | 34 ++ .../settings/VideoAudioSettingsScreen.kt | 338 +++++++++++++++++- .../settings/VideoAudioSettingsViewModel.kt | 197 ++++++---- .../settings/VideoAudioSettingsScreenTest.kt | 17 +- 5 files changed, 507 insertions(+), 85 deletions(-) diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml index 579c27a7c..0e2ff467c 100644 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ b/shared/src/commonMain/composeResources/values/strings.xml @@ -58,7 +58,7 @@ Select your favorite night theme — %1$s This option is only available if %1$s is selected for Theme You can select your favorite night theme below - Show \"Hold to enqueue\" tip + Show "Hold to enqueue" tip Show tip when pressing the background or the popup button in video \"Details:\" Tablet mode List view mode @@ -94,7 +94,7 @@ Use external video player Removes audio at some resolutions Use external audio player - Show \"Play with Kodi\" option + Show "Play with Kodi" option Display an option to play a video via Kodi media center Seekbar thumbnail preview High quality (larger) @@ -103,7 +103,7 @@ Behavior - Preferred \'open\' action + Preferred 'open' action Default action when opening content — %1$s Show info Video player diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt index f6d2235bb..f1af2acdc 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt @@ -1,2 +1,36 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + package net.newpipe.app.composable +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.compose.ui.unit.dp +import net.newpipe.app.preview.ThemePreviewProvider + +/** + * Section header inside a settings screen + */ +@Composable +fun PreferenceCategoryTitle(title: String, modifier: Modifier = Modifier) { + Text( + text = title, + modifier = modifier.padding(start = 16.dp, top = 24.dp, end = 16.dp, bottom = 8.dp), + color = MaterialTheme.colorScheme.primary, + style = MaterialTheme.typography.titleSmall + ) +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun PreferenceCategoryTitlePreview() { + PreferenceCategoryTitle(title = "Player") +} \ No newline at end of file diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt index 02a6b8506..b44233dec 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt @@ -14,15 +14,20 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewWrapper import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.launch import net.newpipe.app.composable.ListPreference import net.newpipe.app.composable.ListPreferenceEntry +import net.newpipe.app.composable.PreferenceCategoryTitle import net.newpipe.app.composable.SwitchPreference import net.newpipe.app.composable.TopAppBar import net.newpipe.app.navigation.Navigator @@ -30,20 +35,77 @@ import net.newpipe.app.preferences.VideoAudioPreferences import net.newpipe.app.preview.ThemePreviewProvider import net.newpipe.app.viewmodel.settings.VideoAudioSettingsViewModel import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.add_to_playlist +import newpipe.shared.generated.resources.always +import newpipe.shared.generated.resources.always_ask_open_action +import newpipe.shared.generated.resources.auto_queue_summary +import newpipe.shared.generated.resources.auto_queue_title +import newpipe.shared.generated.resources.autoplay_summary +import newpipe.shared.generated.resources.autoplay_title +import newpipe.shared.generated.resources.background_player import newpipe.shared.generated.resources.best_resolution +import newpipe.shared.generated.resources.brightness +import newpipe.shared.generated.resources.clear_queue_confirmation_summary +import newpipe.shared.generated.resources.clear_queue_confirmation_title import newpipe.shared.generated.resources.default_audio_format_title import newpipe.shared.generated.resources.default_popup_resolution_title import newpipe.shared.generated.resources.default_resolution_title import newpipe.shared.generated.resources.default_video_format_title +import newpipe.shared.generated.resources.dont_show +import newpipe.shared.generated.resources.download +import newpipe.shared.generated.resources.enqueue_stream +import newpipe.shared.generated.resources.high_quality_larger +import newpipe.shared.generated.resources.ignore_hardware_media_buttons_summary +import newpipe.shared.generated.resources.ignore_hardware_media_buttons_title +import newpipe.shared.generated.resources.left_gesture_control_summary +import newpipe.shared.generated.resources.left_gesture_control_title import newpipe.shared.generated.resources.limit_data_usage_none_description import newpipe.shared.generated.resources.limit_mobile_data_usage_title +import newpipe.shared.generated.resources.low_quality_smaller +import newpipe.shared.generated.resources.minimize_on_exit_background_description +import newpipe.shared.generated.resources.minimize_on_exit_none_description +import newpipe.shared.generated.resources.minimize_on_exit_popup_description +import newpipe.shared.generated.resources.minimize_on_exit_summary +import newpipe.shared.generated.resources.minimize_on_exit_title +import newpipe.shared.generated.resources.never +import newpipe.shared.generated.resources.new_seek_duration_toast +import newpipe.shared.generated.resources.none +import newpipe.shared.generated.resources.popup_player +import newpipe.shared.generated.resources.popup_remember_size_pos_summary +import newpipe.shared.generated.resources.popup_remember_size_pos_title import newpipe.shared.generated.resources.prefer_descriptive_audio_summary import newpipe.shared.generated.resources.prefer_descriptive_audio_title import newpipe.shared.generated.resources.prefer_original_audio_summary import newpipe.shared.generated.resources.prefer_original_audio_title +import newpipe.shared.generated.resources.preferred_open_action_settings_summary +import newpipe.shared.generated.resources.preferred_open_action_settings_title +import newpipe.shared.generated.resources.resume_on_audio_focus_gain_summary +import newpipe.shared.generated.resources.resume_on_audio_focus_gain_title +import newpipe.shared.generated.resources.right_gesture_control_summary +import newpipe.shared.generated.resources.right_gesture_control_title +import newpipe.shared.generated.resources.seconds +import newpipe.shared.generated.resources.seek_duration_title +import newpipe.shared.generated.resources.seekbar_preview_thumbnail_title +import newpipe.shared.generated.resources.settings_category_player_behavior_title +import newpipe.shared.generated.resources.settings_category_player_title import newpipe.shared.generated.resources.settings_category_video_audio_title import newpipe.shared.generated.resources.show_higher_resolutions_summary import newpipe.shared.generated.resources.show_higher_resolutions_title +import newpipe.shared.generated.resources.show_info +import newpipe.shared.generated.resources.show_play_with_kodi_summary +import newpipe.shared.generated.resources.show_play_with_kodi_title +import newpipe.shared.generated.resources.start_main_player_fullscreen_summary +import newpipe.shared.generated.resources.start_main_player_fullscreen_title +import newpipe.shared.generated.resources.use_external_audio_player_title +import newpipe.shared.generated.resources.use_external_video_player_summary +import newpipe.shared.generated.resources.use_external_video_player_title +import newpipe.shared.generated.resources.use_inexact_seek_summary +import newpipe.shared.generated.resources.use_inexact_seek_title +import newpipe.shared.generated.resources.video_player +import newpipe.shared.generated.resources.volume +import newpipe.shared.generated.resources.wifi_only +import org.jetbrains.compose.resources.getString +import org.jetbrains.compose.resources.pluralStringResource import org.jetbrains.compose.resources.stringResource import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel @@ -57,16 +119,38 @@ fun VideoAudioSettingsScreen( val defaultPopupResolution by viewModel.defaultPopupResolution.collectAsStateWithLifecycle() val mobileDataResolution by viewModel.mobileDataResolution.collectAsStateWithLifecycle() val showHigherResolutions by viewModel.showHigherResolutions.collectAsStateWithLifecycle() + val videoFormat by viewModel.videoFormat.collectAsStateWithLifecycle() + val audioFormat by viewModel.audioFormat.collectAsStateWithLifecycle() + val preferOriginalAudio by viewModel.preferOriginalAudio.collectAsStateWithLifecycle() + val preferDescriptiveAudio by viewModel.preferDescriptiveAudio.collectAsStateWithLifecycle() + val useExternalVideoPlayer by viewModel.useExternalVideoPlayer.collectAsStateWithLifecycle() + val useExternalAudioPlayer by viewModel.useExternalAudioPlayer.collectAsStateWithLifecycle() + val showPlayWithKodi by viewModel.showPlayWithKodi.collectAsStateWithLifecycle() + val seekbarPreviewThumbnail by viewModel.seekbarPreviewThumbnail.collectAsStateWithLifecycle() + val preferredOpenAction by viewModel.preferredOpenAction.collectAsStateWithLifecycle() + val minimizeOnExit by viewModel.minimizeOnExit.collectAsStateWithLifecycle() + val startMainPlayerFullscreen by viewModel.startMainPlayerFullscreen.collectAsStateWithLifecycle() + val autoplay by viewModel.autoplay.collectAsStateWithLifecycle() + val autoQueue by viewModel.autoQueue.collectAsStateWithLifecycle() + val resumeOnAudioFocusGain by viewModel.resumeOnAudioFocusGain.collectAsStateWithLifecycle() + val leftGestureControl by viewModel.leftGestureControl.collectAsStateWithLifecycle() + val rightGestureControl by viewModel.rightGestureControl.collectAsStateWithLifecycle() + val popupRememberSizePos by viewModel.popupRememberSizePos.collectAsStateWithLifecycle() + val useInexactSeek by viewModel.useInexactSeek.collectAsStateWithLifecycle() + val seekDuration by viewModel.seekDuration.collectAsStateWithLifecycle() + val clearQueueConfirmation by viewModel.clearQueueConfirmation.collectAsStateWithLifecycle() + val ignoreHardwareMediaButtons by viewModel.ignoreHardwareMediaButtons.collectAsStateWithLifecycle() + + // Option lists are pure functions of their toggles, so derive them instead of storing them. val resolutionValues = remember(showHigherResolutions) { VideoAudioPreferences.resolutions(showHigherResolutions) } val mobileDataResolutionValues = remember(showHigherResolutions) { VideoAudioPreferences.mobileDataResolutions(showHigherResolutions) } - val videoFormat by viewModel.videoFormat.collectAsStateWithLifecycle() - val audioFormat by viewModel.audioFormat.collectAsStateWithLifecycle() - val preferOriginalAudio by viewModel.preferOriginalAudio.collectAsStateWithLifecycle() - val preferDescriptiveAudio by viewModel.preferDescriptiveAudio.collectAsStateWithLifecycle() + val seekDurationValues = remember(useInexactSeek) { + VideoAudioPreferences.seekDurationsMs(useInexactSeek) + } VideoAudioSettingsScreenContent( defaultResolution = defaultResolution, @@ -79,6 +163,24 @@ fun VideoAudioSettingsScreen( audioFormat = audioFormat, preferOriginalAudio = preferOriginalAudio, preferDescriptiveAudio = preferDescriptiveAudio, + useExternalVideoPlayer = useExternalVideoPlayer, + useExternalAudioPlayer = useExternalAudioPlayer, + showPlayWithKodi = showPlayWithKodi, + seekbarPreviewThumbnail = seekbarPreviewThumbnail, + preferredOpenAction = preferredOpenAction, + minimizeOnExit = minimizeOnExit, + startMainPlayerFullscreen = startMainPlayerFullscreen, + autoplay = autoplay, + autoQueue = autoQueue, + resumeOnAudioFocusGain = resumeOnAudioFocusGain, + leftGestureControl = leftGestureControl, + rightGestureControl = rightGestureControl, + popupRememberSizePos = popupRememberSizePos, + useInexactSeek = useInexactSeek, + seekDuration = seekDuration, + seekDurationValues = seekDurationValues, + clearQueueConfirmation = clearQueueConfirmation, + ignoreHardwareMediaButtons = ignoreHardwareMediaButtons, onDefaultResolutionChange = viewModel::setDefaultResolution, onDefaultPopupResolutionChange = viewModel::setDefaultPopupResolution, onMobileDataResolutionChange = viewModel::setMobileDataResolution, @@ -87,6 +189,23 @@ fun VideoAudioSettingsScreen( onAudioFormatChange = viewModel::setAudioFormat, onPreferOriginalAudioChange = viewModel::setPreferOriginalAudio, onPreferDescriptiveAudioChange = viewModel::setPreferDescriptiveAudio, + onUseExternalVideoPlayerChange = viewModel::setUseExternalVideoPlayer, + onUseExternalAudioPlayerChange = viewModel::setUseExternalAudioPlayer, + onShowPlayWithKodiChange = viewModel::setShowPlayWithKodi, + onSeekbarPreviewThumbnailChange = viewModel::setSeekbarPreviewThumbnail, + onPreferredOpenActionChange = viewModel::setPreferredOpenAction, + onMinimizeOnExitChange = viewModel::setMinimizeOnExit, + onStartMainPlayerFullscreenChange = viewModel::setStartMainPlayerFullscreen, + onAutoplayChange = viewModel::setAutoplay, + onAutoQueueChange = viewModel::setAutoQueue, + onResumeOnAudioFocusGainChange = viewModel::setResumeOnAudioFocusGain, + onLeftGestureControlChange = viewModel::setLeftGestureControl, + onRightGestureControlChange = viewModel::setRightGestureControl, + onPopupRememberSizePosChange = viewModel::setPopupRememberSizePos, + onUseInexactSeekChange = viewModel::setUseInexactSeek, + onSeekDurationChange = viewModel::setSeekDuration, + onClearQueueConfirmationChange = viewModel::setClearQueueConfirmation, + onIgnoreHardwareMediaButtonsChange = viewModel::setIgnoreHardwareMediaButtons, onNavigateUp = { navigator.navigateUp() } ) } @@ -103,6 +222,24 @@ fun VideoAudioSettingsScreenContent( audioFormat: String = VideoAudioPreferences.DEFAULT_AUDIO_FORMAT, preferOriginalAudio: Boolean = VideoAudioPreferences.DEFAULT_PREFER_ORIGINAL_AUDIO, preferDescriptiveAudio: Boolean = VideoAudioPreferences.DEFAULT_PREFER_DESCRIPTIVE_AUDIO, + useExternalVideoPlayer: Boolean = VideoAudioPreferences.DEFAULT_USE_EXTERNAL_VIDEO_PLAYER, + useExternalAudioPlayer: Boolean = VideoAudioPreferences.DEFAULT_USE_EXTERNAL_AUDIO_PLAYER, + showPlayWithKodi: Boolean = VideoAudioPreferences.DEFAULT_SHOW_PLAY_WITH_KODI, + seekbarPreviewThumbnail: String = VideoAudioPreferences.DEFAULT_SEEKBAR_PREVIEW_THUMBNAIL, + preferredOpenAction: String = VideoAudioPreferences.DEFAULT_PREFERRED_OPEN_ACTION, + minimizeOnExit: String = VideoAudioPreferences.DEFAULT_MINIMIZE_ON_EXIT, + startMainPlayerFullscreen: Boolean = VideoAudioPreferences.DEFAULT_START_MAIN_PLAYER_FULLSCREEN, + autoplay: String = VideoAudioPreferences.DEFAULT_AUTOPLAY, + autoQueue: Boolean = VideoAudioPreferences.DEFAULT_AUTO_QUEUE, + resumeOnAudioFocusGain: Boolean = VideoAudioPreferences.DEFAULT_RESUME_ON_AUDIO_FOCUS_GAIN, + leftGestureControl: String = VideoAudioPreferences.DEFAULT_LEFT_GESTURE_CONTROL, + rightGestureControl: String = VideoAudioPreferences.DEFAULT_RIGHT_GESTURE_CONTROL, + popupRememberSizePos: Boolean = VideoAudioPreferences.DEFAULT_POPUP_REMEMBER_SIZE_POS, + useInexactSeek: Boolean = VideoAudioPreferences.DEFAULT_USE_INEXACT_SEEK, + seekDuration: String = VideoAudioPreferences.DEFAULT_SEEK_DURATION_MS, + seekDurationValues: List = VideoAudioPreferences.SEEK_DURATIONS_MS, + clearQueueConfirmation: Boolean = VideoAudioPreferences.DEFAULT_CLEAR_QUEUE_CONFIRMATION, + ignoreHardwareMediaButtons: Boolean = VideoAudioPreferences.DEFAULT_IGNORE_HARDWARE_MEDIA_BUTTONS, onDefaultResolutionChange: (String) -> Unit = {}, onDefaultPopupResolutionChange: (String) -> Unit = {}, onMobileDataResolutionChange: (String) -> Unit = {}, @@ -111,8 +248,28 @@ fun VideoAudioSettingsScreenContent( onAudioFormatChange: (String) -> Unit = {}, onPreferOriginalAudioChange: (Boolean) -> Unit = {}, onPreferDescriptiveAudioChange: (Boolean) -> Unit = {}, + onUseExternalVideoPlayerChange: (Boolean) -> Unit = {}, + onUseExternalAudioPlayerChange: (Boolean) -> Unit = {}, + onShowPlayWithKodiChange: (Boolean) -> Unit = {}, + onSeekbarPreviewThumbnailChange: (String) -> Unit = {}, + onPreferredOpenActionChange: (String) -> Unit = {}, + onMinimizeOnExitChange: (String) -> Unit = {}, + onStartMainPlayerFullscreenChange: (Boolean) -> Unit = {}, + onAutoplayChange: (String) -> Unit = {}, + onAutoQueueChange: (Boolean) -> Unit = {}, + onResumeOnAudioFocusGainChange: (Boolean) -> Unit = {}, + onLeftGestureControlChange: (String) -> Unit = {}, + onRightGestureControlChange: (String) -> Unit = {}, + onPopupRememberSizePosChange: (Boolean) -> Unit = {}, + onUseInexactSeekChange: (Boolean) -> Unit = {}, + onSeekDurationChange: (String) -> Unit = {}, + onClearQueueConfirmationChange: (Boolean) -> Unit = {}, + onIgnoreHardwareMediaButtonsChange: (Boolean) -> Unit = {}, onNavigateUp: () -> Unit = {} ) { + val scope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } + val bestResolutionLabel = stringResource(Res.string.best_resolution) val noLimitLabel = stringResource(Res.string.limit_data_usage_none_description) @@ -126,6 +283,8 @@ fun VideoAudioSettingsScreenContent( title = if (value == VideoAudioPreferences.LIMIT_DATA_USAGE_NONE) noLimitLabel else value ) + fun selectedTitle(entries: List, value: String) = entries.firstOrNull { it.value == value }?.title.orEmpty() + val resolutionEntries = resolutionValues.map(::resolutionEntry) val mobileDataEntries = mobileDataResolutionValues.map(::mobileDataEntry) val videoFormatEntries = VideoAudioPreferences.VIDEO_FORMATS.map { (value, label) -> @@ -134,6 +293,40 @@ fun VideoAudioSettingsScreenContent( val audioFormatEntries = VideoAudioPreferences.AUDIO_FORMATS.map { (value, label) -> ListPreferenceEntry(value, label) } + val seekbarThumbnailEntries = listOf( + ListPreferenceEntry(VideoAudioPreferences.SEEKBAR_THUMBNAIL_HIGH_QUALITY, stringResource(Res.string.high_quality_larger)), + ListPreferenceEntry(VideoAudioPreferences.SEEKBAR_THUMBNAIL_LOW_QUALITY, stringResource(Res.string.low_quality_smaller)), + ListPreferenceEntry(VideoAudioPreferences.SEEKBAR_THUMBNAIL_NONE, stringResource(Res.string.dont_show)) + ) + val openActionEntries = listOf( + ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_SHOW_INFO, stringResource(Res.string.show_info)), + ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_VIDEO_PLAYER, stringResource(Res.string.video_player)), + ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_BACKGROUND_PLAYER, stringResource(Res.string.background_player)), + ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_POPUP_PLAYER, stringResource(Res.string.popup_player)), + ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_DOWNLOAD, stringResource(Res.string.download)), + ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_ADD_TO_PLAYLIST, stringResource(Res.string.add_to_playlist)), + ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_ENQUEUE, stringResource(Res.string.enqueue_stream)), + ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_ALWAYS_ASK, stringResource(Res.string.always_ask_open_action)) + ) + val minimizeOnExitEntries = listOf( + ListPreferenceEntry(VideoAudioPreferences.MINIMIZE_ON_EXIT_NONE, stringResource(Res.string.minimize_on_exit_none_description)), + ListPreferenceEntry(VideoAudioPreferences.MINIMIZE_ON_EXIT_BACKGROUND, stringResource(Res.string.minimize_on_exit_background_description)), + ListPreferenceEntry(VideoAudioPreferences.MINIMIZE_ON_EXIT_POPUP, stringResource(Res.string.minimize_on_exit_popup_description)) + ) + val autoplayEntries = listOf( + ListPreferenceEntry(VideoAudioPreferences.AUTOPLAY_ALWAYS, stringResource(Res.string.always)), + ListPreferenceEntry(VideoAudioPreferences.AUTOPLAY_WIFI, stringResource(Res.string.wifi_only)), + ListPreferenceEntry(VideoAudioPreferences.AUTOPLAY_NEVER, stringResource(Res.string.never)) + ) + val gestureEntries = listOf( + ListPreferenceEntry(VideoAudioPreferences.GESTURE_BRIGHTNESS, stringResource(Res.string.brightness)), + ListPreferenceEntry(VideoAudioPreferences.GESTURE_VOLUME, stringResource(Res.string.volume)), + ListPreferenceEntry(VideoAudioPreferences.GESTURE_NONE, stringResource(Res.string.none)) + ) + val seekDurationEntries = seekDurationValues.map { value -> + val seconds = VideoAudioPreferences.seekDurationSeconds(value) + ListPreferenceEntry(value, pluralStringResource(Res.plurals.seconds, seconds, seconds)) + } Scaffold( topBar = { @@ -141,7 +334,8 @@ fun VideoAudioSettingsScreenContent( title = stringResource(Res.string.settings_category_video_audio_title), onNavigateUp = onNavigateUp ) - } + }, + snackbarHost = { SnackbarHost(snackbarHostState) } ) { paddingValues -> Column( modifier = Modifier @@ -198,6 +392,140 @@ fun VideoAudioSettingsScreenContent( checked = preferDescriptiveAudio, onCheckedChange = onPreferDescriptiveAudioChange ) + + // TODO: ExoPlayer settings sub-screen link goes here once that screen is migrated. + + PreferenceCategoryTitle(title = stringResource(Res.string.settings_category_player_title)) + SwitchPreference( + title = stringResource(Res.string.use_external_video_player_title), + summary = stringResource(Res.string.use_external_video_player_summary), + checked = useExternalVideoPlayer, + onCheckedChange = onUseExternalVideoPlayerChange + ) + SwitchPreference( + title = stringResource(Res.string.use_external_audio_player_title), + checked = useExternalAudioPlayer, + onCheckedChange = onUseExternalAudioPlayerChange + ) + SwitchPreference( + title = stringResource(Res.string.show_play_with_kodi_title), + summary = stringResource(Res.string.show_play_with_kodi_summary), + checked = showPlayWithKodi, + onCheckedChange = onShowPlayWithKodiChange + ) + ListPreference( + title = stringResource(Res.string.seekbar_preview_thumbnail_title), + entries = seekbarThumbnailEntries, + selectedValue = seekbarPreviewThumbnail, + onValueSelected = onSeekbarPreviewThumbnailChange + ) + + PreferenceCategoryTitle(title = stringResource(Res.string.settings_category_player_behavior_title)) + ListPreference( + title = stringResource(Res.string.preferred_open_action_settings_title), + entries = openActionEntries, + selectedValue = preferredOpenAction, + onValueSelected = onPreferredOpenActionChange, + summary = stringResource( + Res.string.preferred_open_action_settings_summary, + selectedTitle(openActionEntries, preferredOpenAction) + ) + ) + // TODO(follow-up): when popup is selected without draw-over-apps permission, the + // legacy screen shows a snackbar linking to the system permission settings. Needs a + // platform actions interface (like AppearanceActions) and is deliberately deferred. + ListPreference( + title = stringResource(Res.string.minimize_on_exit_title), + entries = minimizeOnExitEntries, + selectedValue = minimizeOnExit, + onValueSelected = onMinimizeOnExitChange, + summary = stringResource( + Res.string.minimize_on_exit_summary, + selectedTitle(minimizeOnExitEntries, minimizeOnExit) + ) + ) + SwitchPreference( + title = stringResource(Res.string.start_main_player_fullscreen_title), + summary = stringResource(Res.string.start_main_player_fullscreen_summary), + checked = startMainPlayerFullscreen, + onCheckedChange = onStartMainPlayerFullscreenChange + ) + ListPreference( + title = stringResource(Res.string.autoplay_title), + entries = autoplayEntries, + selectedValue = autoplay, + onValueSelected = onAutoplayChange, + summary = stringResource( + Res.string.autoplay_summary, + selectedTitle(autoplayEntries, autoplay) + ) + ) + SwitchPreference( + title = stringResource(Res.string.auto_queue_title), + summary = stringResource(Res.string.auto_queue_summary), + checked = autoQueue, + onCheckedChange = onAutoQueueChange + ) + SwitchPreference( + title = stringResource(Res.string.resume_on_audio_focus_gain_title), + summary = stringResource(Res.string.resume_on_audio_focus_gain_summary), + checked = resumeOnAudioFocusGain, + onCheckedChange = onResumeOnAudioFocusGainChange + ) + ListPreference( + title = stringResource(Res.string.left_gesture_control_title), + entries = gestureEntries, + selectedValue = leftGestureControl, + onValueSelected = onLeftGestureControlChange, + summary = stringResource(Res.string.left_gesture_control_summary) + ) + ListPreference( + title = stringResource(Res.string.right_gesture_control_title), + entries = gestureEntries, + selectedValue = rightGestureControl, + onValueSelected = onRightGestureControlChange, + summary = stringResource(Res.string.right_gesture_control_summary) + ) + SwitchPreference( + title = stringResource(Res.string.popup_remember_size_pos_title), + summary = stringResource(Res.string.popup_remember_size_pos_summary), + checked = popupRememberSizePos, + onCheckedChange = onPopupRememberSizePosChange + ) + SwitchPreference( + title = stringResource(Res.string.use_inexact_seek_title), + summary = stringResource(Res.string.use_inexact_seek_summary), + checked = useInexactSeek, + onCheckedChange = { checked -> + // The view model applies the same adjustment. this only decides whether to + // tell the user about it, mirroring the legacy toast. + VideoAudioPreferences.adjustedSeekDurationMs(seekDuration, checked)?.let { adjustedMs -> + val newSeconds = VideoAudioPreferences.seekDurationSeconds(adjustedMs) + scope.launch { + snackbarHostState.showSnackbar(getString(Res.string.new_seek_duration_toast, newSeconds)) + } + } + onUseInexactSeekChange(checked) + } + ) + ListPreference( + title = stringResource(Res.string.seek_duration_title), + entries = seekDurationEntries, + selectedValue = seekDuration, + onValueSelected = onSeekDurationChange + ) + SwitchPreference( + title = stringResource(Res.string.clear_queue_confirmation_title), + summary = stringResource(Res.string.clear_queue_confirmation_summary), + checked = clearQueueConfirmation, + onCheckedChange = onClearQueueConfirmationChange + ) + SwitchPreference( + title = stringResource(Res.string.ignore_hardware_media_buttons_title), + summary = stringResource(Res.string.ignore_hardware_media_buttons_summary), + checked = ignoreHardwareMediaButtons, + onCheckedChange = onIgnoreHardwareMediaButtonsChange + ) } } } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt index 9a467688e..49b67ad80 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt @@ -16,87 +16,88 @@ import org.koin.core.annotation.KoinViewModel class VideoAudioSettingsViewModel(private val settings: Settings) : ViewModel() { val defaultResolution: StateFlow - field = MutableStateFlow( - settings.getString( - VideoAudioPreferences.KEY_DEFAULT_RESOLUTION, - VideoAudioPreferences.DEFAULT_RESOLUTION - ) - ) + field = stringFlow(VideoAudioPreferences.KEY_DEFAULT_RESOLUTION, VideoAudioPreferences.DEFAULT_RESOLUTION) val defaultPopupResolution: StateFlow - field = MutableStateFlow( - settings.getString( - VideoAudioPreferences.KEY_DEFAULT_POPUP_RESOLUTION, - VideoAudioPreferences.DEFAULT_POPUP_RESOLUTION - ) - ) + field = stringFlow(VideoAudioPreferences.KEY_DEFAULT_POPUP_RESOLUTION, VideoAudioPreferences.DEFAULT_POPUP_RESOLUTION) val mobileDataResolution: StateFlow - field = MutableStateFlow( - settings.getString( - VideoAudioPreferences.KEY_LIMIT_MOBILE_DATA_USAGE, - VideoAudioPreferences.DEFAULT_LIMIT_MOBILE_DATA_USAGE - ) - ) + field = stringFlow(VideoAudioPreferences.KEY_LIMIT_MOBILE_DATA_USAGE, VideoAudioPreferences.DEFAULT_LIMIT_MOBILE_DATA_USAGE) val showHigherResolutions: StateFlow - field = MutableStateFlow( - settings.getBoolean( - VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS, - VideoAudioPreferences.DEFAULT_SHOW_HIGHER_RESOLUTIONS - ) - ) + field = booleanFlow(VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS, VideoAudioPreferences.DEFAULT_SHOW_HIGHER_RESOLUTIONS) val videoFormat: StateFlow - field = MutableStateFlow( - settings.getString( - VideoAudioPreferences.KEY_DEFAULT_VIDEO_FORMAT, - VideoAudioPreferences.DEFAULT_VIDEO_FORMAT - ) - ) + field = stringFlow(VideoAudioPreferences.KEY_DEFAULT_VIDEO_FORMAT, VideoAudioPreferences.DEFAULT_VIDEO_FORMAT) val audioFormat: StateFlow - field = MutableStateFlow( - settings.getString( - VideoAudioPreferences.KEY_DEFAULT_AUDIO_FORMAT, - VideoAudioPreferences.DEFAULT_AUDIO_FORMAT - ) - ) + field = stringFlow(VideoAudioPreferences.KEY_DEFAULT_AUDIO_FORMAT, VideoAudioPreferences.DEFAULT_AUDIO_FORMAT) val preferOriginalAudio: StateFlow - field = MutableStateFlow( - settings.getBoolean( - VideoAudioPreferences.KEY_PREFER_ORIGINAL_AUDIO, - VideoAudioPreferences.DEFAULT_PREFER_ORIGINAL_AUDIO - ) - ) + field = booleanFlow(VideoAudioPreferences.KEY_PREFER_ORIGINAL_AUDIO, VideoAudioPreferences.DEFAULT_PREFER_ORIGINAL_AUDIO) val preferDescriptiveAudio: StateFlow - field = MutableStateFlow( - settings.getBoolean( - VideoAudioPreferences.KEY_PREFER_DESCRIPTIVE_AUDIO, - VideoAudioPreferences.DEFAULT_PREFER_DESCRIPTIVE_AUDIO - ) - ) + field = booleanFlow(VideoAudioPreferences.KEY_PREFER_DESCRIPTIVE_AUDIO, VideoAudioPreferences.DEFAULT_PREFER_DESCRIPTIVE_AUDIO) - fun setDefaultResolution(value: String) { - settings.putString(VideoAudioPreferences.KEY_DEFAULT_RESOLUTION, value) - defaultResolution.value = value - } + val useExternalVideoPlayer: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_USE_EXTERNAL_VIDEO_PLAYER, VideoAudioPreferences.DEFAULT_USE_EXTERNAL_VIDEO_PLAYER) - fun setDefaultPopupResolution(value: String) { - settings.putString(VideoAudioPreferences.KEY_DEFAULT_POPUP_RESOLUTION, value) - defaultPopupResolution.value = value - } + val useExternalAudioPlayer: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_USE_EXTERNAL_AUDIO_PLAYER, VideoAudioPreferences.DEFAULT_USE_EXTERNAL_AUDIO_PLAYER) - fun setMobileDataResolution(value: String) { - settings.putString(VideoAudioPreferences.KEY_LIMIT_MOBILE_DATA_USAGE, value) - mobileDataResolution.value = value - } + val showPlayWithKodi: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_SHOW_PLAY_WITH_KODI, VideoAudioPreferences.DEFAULT_SHOW_PLAY_WITH_KODI) + + val seekbarPreviewThumbnail: StateFlow + field = stringFlow(VideoAudioPreferences.KEY_SEEKBAR_PREVIEW_THUMBNAIL, VideoAudioPreferences.DEFAULT_SEEKBAR_PREVIEW_THUMBNAIL) + + val preferredOpenAction: StateFlow + field = stringFlow(VideoAudioPreferences.KEY_PREFERRED_OPEN_ACTION, VideoAudioPreferences.DEFAULT_PREFERRED_OPEN_ACTION) + + val minimizeOnExit: StateFlow + field = stringFlow(VideoAudioPreferences.KEY_MINIMIZE_ON_EXIT, VideoAudioPreferences.DEFAULT_MINIMIZE_ON_EXIT) + + val startMainPlayerFullscreen: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_START_MAIN_PLAYER_FULLSCREEN, VideoAudioPreferences.DEFAULT_START_MAIN_PLAYER_FULLSCREEN) + + val autoplay: StateFlow + field = stringFlow(VideoAudioPreferences.KEY_AUTOPLAY, VideoAudioPreferences.DEFAULT_AUTOPLAY) + + val autoQueue: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_AUTO_QUEUE, VideoAudioPreferences.DEFAULT_AUTO_QUEUE) + + val resumeOnAudioFocusGain: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_RESUME_ON_AUDIO_FOCUS_GAIN, VideoAudioPreferences.DEFAULT_RESUME_ON_AUDIO_FOCUS_GAIN) + + val leftGestureControl: StateFlow + field = stringFlow(VideoAudioPreferences.KEY_LEFT_GESTURE_CONTROL, VideoAudioPreferences.DEFAULT_LEFT_GESTURE_CONTROL) + + val rightGestureControl: StateFlow + field = stringFlow(VideoAudioPreferences.KEY_RIGHT_GESTURE_CONTROL, VideoAudioPreferences.DEFAULT_RIGHT_GESTURE_CONTROL) + + val popupRememberSizePos: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_POPUP_REMEMBER_SIZE_POS, VideoAudioPreferences.DEFAULT_POPUP_REMEMBER_SIZE_POS) + + val useInexactSeek: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_USE_INEXACT_SEEK, VideoAudioPreferences.DEFAULT_USE_INEXACT_SEEK) + + val seekDuration: StateFlow + field = stringFlow(VideoAudioPreferences.KEY_SEEK_DURATION, VideoAudioPreferences.DEFAULT_SEEK_DURATION_MS) + + val clearQueueConfirmation: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_CLEAR_QUEUE_CONFIRMATION, VideoAudioPreferences.DEFAULT_CLEAR_QUEUE_CONFIRMATION) + + val ignoreHardwareMediaButtons: StateFlow + field = booleanFlow(VideoAudioPreferences.KEY_IGNORE_HARDWARE_MEDIA_BUTTONS, VideoAudioPreferences.DEFAULT_IGNORE_HARDWARE_MEDIA_BUTTONS) + + fun setDefaultResolution(value: String) = defaultResolution.persist(VideoAudioPreferences.KEY_DEFAULT_RESOLUTION, value) + + fun setDefaultPopupResolution(value: String) = defaultPopupResolution.persist(VideoAudioPreferences.KEY_DEFAULT_POPUP_RESOLUTION, value) + + fun setMobileDataResolution(value: String) = mobileDataResolution.persist(VideoAudioPreferences.KEY_LIMIT_MOBILE_DATA_USAGE, value) fun setShowHigherResolutions(value: Boolean) { - settings.putBoolean(VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS, value) - showHigherResolutions.value = value + showHigherResolutions.persist(VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS, value) if (!value) { if (defaultResolution.value in VideoAudioPreferences.HIGH_RESOLUTIONS) { @@ -111,23 +112,67 @@ class VideoAudioSettingsViewModel(private val settings: Settings) : ViewModel() } } - fun setVideoFormat(value: String) { - settings.putString(VideoAudioPreferences.KEY_DEFAULT_VIDEO_FORMAT, value) - videoFormat.value = value + fun setVideoFormat(value: String) = videoFormat.persist(VideoAudioPreferences.KEY_DEFAULT_VIDEO_FORMAT, value) + + fun setAudioFormat(value: String) = audioFormat.persist(VideoAudioPreferences.KEY_DEFAULT_AUDIO_FORMAT, value) + + fun setPreferOriginalAudio(value: Boolean) = preferOriginalAudio.persist(VideoAudioPreferences.KEY_PREFER_ORIGINAL_AUDIO, value) + + fun setPreferDescriptiveAudio(value: Boolean) = preferDescriptiveAudio.persist(VideoAudioPreferences.KEY_PREFER_DESCRIPTIVE_AUDIO, value) + + fun setUseExternalVideoPlayer(value: Boolean) = useExternalVideoPlayer.persist(VideoAudioPreferences.KEY_USE_EXTERNAL_VIDEO_PLAYER, value) + + fun setUseExternalAudioPlayer(value: Boolean) = useExternalAudioPlayer.persist(VideoAudioPreferences.KEY_USE_EXTERNAL_AUDIO_PLAYER, value) + + fun setShowPlayWithKodi(value: Boolean) = showPlayWithKodi.persist(VideoAudioPreferences.KEY_SHOW_PLAY_WITH_KODI, value) + + fun setSeekbarPreviewThumbnail(value: String) = seekbarPreviewThumbnail.persist(VideoAudioPreferences.KEY_SEEKBAR_PREVIEW_THUMBNAIL, value) + + fun setPreferredOpenAction(value: String) = preferredOpenAction.persist(VideoAudioPreferences.KEY_PREFERRED_OPEN_ACTION, value) + + fun setMinimizeOnExit(value: String) = minimizeOnExit.persist(VideoAudioPreferences.KEY_MINIMIZE_ON_EXIT, value) + + fun setStartMainPlayerFullscreen(value: Boolean) = startMainPlayerFullscreen.persist(VideoAudioPreferences.KEY_START_MAIN_PLAYER_FULLSCREEN, value) + + fun setAutoplay(value: String) = autoplay.persist(VideoAudioPreferences.KEY_AUTOPLAY, value) + + fun setAutoQueue(value: Boolean) = autoQueue.persist(VideoAudioPreferences.KEY_AUTO_QUEUE, value) + + fun setResumeOnAudioFocusGain(value: Boolean) = resumeOnAudioFocusGain.persist(VideoAudioPreferences.KEY_RESUME_ON_AUDIO_FOCUS_GAIN, value) + + fun setLeftGestureControl(value: String) = leftGestureControl.persist(VideoAudioPreferences.KEY_LEFT_GESTURE_CONTROL, value) + + fun setRightGestureControl(value: String) = rightGestureControl.persist(VideoAudioPreferences.KEY_RIGHT_GESTURE_CONTROL, value) + + fun setPopupRememberSizePos(value: Boolean) = popupRememberSizePos.persist(VideoAudioPreferences.KEY_POPUP_REMEMBER_SIZE_POS, value) + + /** + * Enabling inexact seek hides 5-second-step durations. If the current selection becomes + * hidden it is bumped by 5 seconds, matching the legacy screen (which also showed a toast; + * the screen shows a snackbar based on the same [VideoAudioPreferences.adjustedSeekDurationMs]). + */ + fun setUseInexactSeek(value: Boolean) { + useInexactSeek.persist(VideoAudioPreferences.KEY_USE_INEXACT_SEEK, value) + VideoAudioPreferences.adjustedSeekDurationMs(seekDuration.value, value)?.let(::setSeekDuration) } - fun setAudioFormat(value: String) { - settings.putString(VideoAudioPreferences.KEY_DEFAULT_AUDIO_FORMAT, value) - audioFormat.value = value + fun setSeekDuration(value: String) = seekDuration.persist(VideoAudioPreferences.KEY_SEEK_DURATION, value) + + fun setClearQueueConfirmation(value: Boolean) = clearQueueConfirmation.persist(VideoAudioPreferences.KEY_CLEAR_QUEUE_CONFIRMATION, value) + + fun setIgnoreHardwareMediaButtons(value: Boolean) = ignoreHardwareMediaButtons.persist(VideoAudioPreferences.KEY_IGNORE_HARDWARE_MEDIA_BUTTONS, value) + + private fun stringFlow(key: String, defaultValue: String) = MutableStateFlow(settings.getString(key, defaultValue)) + + private fun booleanFlow(key: String, defaultValue: Boolean) = MutableStateFlow(settings.getBoolean(key, defaultValue)) + + private fun MutableStateFlow.persist(key: String, newValue: String) { + settings.putString(key, newValue) + value = newValue } - fun setPreferOriginalAudio(value: Boolean) { - settings.putBoolean(VideoAudioPreferences.KEY_PREFER_ORIGINAL_AUDIO, value) - preferOriginalAudio.value = value - } - - fun setPreferDescriptiveAudio(value: Boolean) { - settings.putBoolean(VideoAudioPreferences.KEY_PREFER_DESCRIPTIVE_AUDIO, value) - preferDescriptiveAudio.value = value + private fun MutableStateFlow.persist(key: String, newValue: Boolean) { + settings.putBoolean(key, newValue) + value = newValue } } diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt index 0731e89dc..1ab8c6063 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt @@ -8,6 +8,7 @@ package net.newpipe.app.screen.settings import androidx.compose.ui.test.ExperimentalTestApi import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performScrollTo import androidx.compose.ui.test.v2.runComposeUiTest import com.russhwolf.settings.MapSettings import com.russhwolf.settings.Settings @@ -17,6 +18,7 @@ import net.newpipe.app.preferences.VideoAudioPreferences import newpipe.shared.generated.resources.Res import newpipe.shared.generated.resources.best_resolution import newpipe.shared.generated.resources.default_resolution_title +import newpipe.shared.generated.resources.settings_category_player_title import newpipe.shared.generated.resources.settings_category_video_audio_title import org.jetbrains.compose.resources.getString import org.koin.dsl.module @@ -40,6 +42,19 @@ class VideoAudioSettingsScreenTest { ) } + @Test + fun rendersPlayerCategoryHeader() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { VideoAudioSettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.settings_category_player_title)) + .performScrollTo() + .assertIsDisplayed() + } + ) + } + @Test fun bestResolutionShowsLocalizedLabelAsSummary() = runComposeUiTest { withKoin( @@ -52,4 +67,4 @@ class VideoAudioSettingsScreenTest { } ) } -} \ No newline at end of file +} From a663449f05c2c78a88714e2d71d65fed407ba602 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Thu, 6 Aug 2026 23:33:43 +0100 Subject: [PATCH 078/155] add exoplayer settings --- .../composeResources/values/strings.xml | 22 ++- .../net/newpipe/app/navigation/Destination.kt | 3 + .../net/newpipe/app/navigation/NavModule.kt | 5 + .../app/preferences/ExoPlayerPreferences.kt | 27 ++++ .../settings/ExoPlayerSettingsScreen.kt | 151 ++++++++++++++++++ .../settings/VideoAudioSettingsScreen.kt | 14 +- .../settings/ExoPlayerSettingsViewModel.kt | 68 ++++++++ .../settings/ExoPlayerSettingsScreenTest.kt | 67 ++++++++ .../settings/VideoAudioSettingsScreenTest.kt | 14 ++ 9 files changed, 364 insertions(+), 7 deletions(-) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreen.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/ExoPlayerSettingsViewModel.kt create mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml index 0e2ff467c..637d82f64 100644 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ b/shared/src/commonMain/composeResources/values/strings.xml @@ -23,7 +23,7 @@ Website Visit the NewPipe Website for more info and news. NewPipe's Privacy Policy - The NewPipe project takes your privacy very seriously. Therefore, the app does not collect any data without your consent.\nNewPipe\'s privacy policy explains in detail what data is sent and stored when you send a crash report. + The NewPipe project takes your privacy very seriously. Therefore, the app does not collect any data without your consent.\nNewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report. Read privacy policy NewPipe's License NewPipe is copyleft libre software: You can use, study, share, and improve it at will. Specifically you can redistribute 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. @@ -59,7 +59,7 @@ This option is only available if %1$s is selected for Theme You can select your favorite night theme below Show "Hold to enqueue" tip - Show tip when pressing the background or the popup button in video \"Details:\" + Show tip when pressing the background or the popup button in video "Details:" Tablet mode List view mode Captions @@ -99,7 +99,7 @@ Seekbar thumbnail preview High quality (larger) Low quality (smaller) - Don\'t show + Don't show Behavior @@ -139,7 +139,7 @@ Remember popup properties Remember last size and position of popup Use fast inexact seek - Inexact seek allows the player to seek to positions faster with reduced precision. Seeking for 5, 15 or 25 seconds doesn\'t work with this + Inexact seek allows the player to seek to positions faster with reduced precision. Seeking for 5, 15 or 25 seconds doesn't work with this Fast-forward/-rewind seek duration Due to ExoPlayer constraints the seek duration was set to %1$d seconds Ask for confirmation before clearing a queue @@ -151,5 +151,19 @@ %1$d seconds + + ExoPlayer settings + Manage some ExoPlayer settings. These changes require a player restart to take effect + Playback load interval size + Change the load interval size on progressive contents (currently %1$s). A lower value may speed up their initial loading + ExoPlayer default + Use ExoPlayer's decoder fallback feature + Enable this option if you have decoder initialization issues, which falls back to lower-priority decoders if primary decoders initialization fail. This may result in poor playback performance than when using primary decoders + Disable media tunneling + Disable media tunneling if you experience a black screen or stuttering on video playback. + Media tunneling was disabled by default on your device because your device model is known to not support it. + Always use ExoPlayer's video output surface setting workaround + This workaround releases and re-instantiates video codecs when a surface change occurs, instead of setting the surface to the codec directly. Already used by ExoPlayer on some devices with this issue, this setting has only an effect on Android 6 and higher\n\nEnabling this option may prevent playback errors when switching the current video player or switching to fullscreen + diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt index 0d0c8c172..4290abadb 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt @@ -15,6 +15,9 @@ import net.newpipe.app.model.License @Serializable sealed interface Destination : NavKey { + @Serializable + data object ExoPlayerSettings : Destination + @Serializable data object VideoAudioSettings : Destination diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt index 1030e1433..aae14584f 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt @@ -9,6 +9,7 @@ import androidx.compose.runtime.mutableStateListOf import co.touchlab.kermit.Logger import net.newpipe.app.screen.about.AboutScreen import net.newpipe.app.screen.settings.AppearanceSettingsScreen +import net.newpipe.app.screen.settings.ExoPlayerSettingsScreen import net.newpipe.app.screen.settings.SettingsHomeScreen import net.newpipe.app.screen.settings.VideoAudioSettingsScreen import org.koin.core.annotation.KoinExperimentalAPI @@ -42,6 +43,10 @@ fun navModule() = module { navigation { VideoAudioSettingsScreen() } + + navigation { + ExoPlayerSettingsScreen() + } } /** diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt new file mode 100644 index 000000000..2e0691bc7 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt @@ -0,0 +1,27 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.preferences + +object ExoPlayerPreferences { + const val KEY_PROGRESSIVE_LOAD_INTERVAL = "progressive_load_interval" + const val KEY_USE_EXOPLAYER_DECODER_FALLBACK = "use_exoplayer_decoder_fallback_key" + const val KEY_DISABLE_MEDIA_TUNNELING = "disable_media_tunneling_key" + const val KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY = "disabled_media_tunneling_automatically_key" + const val KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND = "always_use_exoplayer_set_output_surface_workaround_key" + + const val PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT = "exoplayer_default" + + const val DEFAULT_PROGRESSIVE_LOAD_INTERVAL = "64" + const val DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK = false + const val DEFAULT_DISABLE_MEDIA_TUNNELING = false + const val DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND = false + + const val MEDIA_TUNNELING_AUTO_DISABLED = 1 + const val MEDIA_TUNNELING_USER_MANAGED = 0 + const val MEDIA_TUNNELING_FLAG_UNSET = -1 + + val PROGRESSIVE_LOAD_INTERVALS = listOf("1", "16", "64", "256", PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT) +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreen.kt new file mode 100644 index 000000000..52d6de061 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreen.kt @@ -0,0 +1,151 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.screen.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Scaffold +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import net.newpipe.app.composable.ListPreference +import net.newpipe.app.composable.ListPreferenceEntry +import net.newpipe.app.composable.SwitchPreference +import net.newpipe.app.composable.TopAppBar +import net.newpipe.app.navigation.Navigator +import net.newpipe.app.preferences.ExoPlayerPreferences +import net.newpipe.app.preview.ThemePreviewProvider +import net.newpipe.app.viewmodel.settings.ExoPlayerSettingsViewModel +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.always_use_exoplayer_set_output_surface_workaround_summary +import newpipe.shared.generated.resources.always_use_exoplayer_set_output_surface_workaround_title +import newpipe.shared.generated.resources.disable_media_tunneling_automatic_info +import newpipe.shared.generated.resources.disable_media_tunneling_summary +import newpipe.shared.generated.resources.disable_media_tunneling_title +import newpipe.shared.generated.resources.progressive_load_interval_exoplayer_default +import newpipe.shared.generated.resources.progressive_load_interval_summary +import newpipe.shared.generated.resources.progressive_load_interval_title +import newpipe.shared.generated.resources.settings_category_exoplayer_title +import newpipe.shared.generated.resources.use_exoplayer_decoder_fallback_summary +import newpipe.shared.generated.resources.use_exoplayer_decoder_fallback_title +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel + +@Composable +fun ExoPlayerSettingsScreen( + navigator: Navigator = koinInject(), + viewModel: ExoPlayerSettingsViewModel = koinViewModel() +) { + val progressiveLoadInterval by viewModel.progressiveLoadInterval.collectAsStateWithLifecycle() + val useExoplayerDecoderFallback by viewModel.useExoplayerDecoderFallback.collectAsStateWithLifecycle() + val disableMediaTunneling by viewModel.disableMediaTunneling.collectAsStateWithLifecycle() + val mediaTunnelingAutoDisabled by viewModel.mediaTunnelingAutoDisabled.collectAsStateWithLifecycle() + val alwaysUseSetOutputSurfaceWorkaround by viewModel.alwaysUseSetOutputSurfaceWorkaround.collectAsStateWithLifecycle() + + ExoPlayerSettingsScreenContent( + progressiveLoadInterval = progressiveLoadInterval, + useExoplayerDecoderFallback = useExoplayerDecoderFallback, + disableMediaTunneling = disableMediaTunneling, + mediaTunnelingAutoDisabled = mediaTunnelingAutoDisabled, + alwaysUseSetOutputSurfaceWorkaround = alwaysUseSetOutputSurfaceWorkaround, + onProgressiveLoadIntervalChange = viewModel::setProgressiveLoadInterval, + onUseExoplayerDecoderFallbackChange = viewModel::setUseExoplayerDecoderFallback, + onDisableMediaTunnelingChange = viewModel::setDisableMediaTunneling, + onAlwaysUseSetOutputSurfaceWorkaroundChange = viewModel::setAlwaysUseSetOutputSurfaceWorkaround, + onNavigateUp = { navigator.navigateUp() } + ) +} + +@Composable +fun ExoPlayerSettingsScreenContent( + progressiveLoadInterval: String = ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL, + useExoplayerDecoderFallback: Boolean = ExoPlayerPreferences.DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK, + disableMediaTunneling: Boolean = ExoPlayerPreferences.DEFAULT_DISABLE_MEDIA_TUNNELING, + mediaTunnelingAutoDisabled: Boolean = false, + alwaysUseSetOutputSurfaceWorkaround: Boolean = ExoPlayerPreferences.DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, + onProgressiveLoadIntervalChange: (String) -> Unit = {}, + onUseExoplayerDecoderFallbackChange: (Boolean) -> Unit = {}, + onDisableMediaTunnelingChange: (Boolean) -> Unit = {}, + onAlwaysUseSetOutputSurfaceWorkaroundChange: (Boolean) -> Unit = {}, + onNavigateUp: () -> Unit = {} +) { + val exoPlayerDefaultLabel = stringResource(Res.string.progressive_load_interval_exoplayer_default) + + val loadIntervalEntries = ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVALS.map { value -> + ListPreferenceEntry( + value = value, + title = if (value == ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT) exoPlayerDefaultLabel else "$value KiB" + ) + } + val selectedLoadIntervalTitle = loadIntervalEntries.firstOrNull { it.value == progressiveLoadInterval }?.title.orEmpty() + + val tunnelingBaseSummary = stringResource(Res.string.disable_media_tunneling_summary) + val tunnelingSummary = if (mediaTunnelingAutoDisabled) { + tunnelingBaseSummary + " " + stringResource(Res.string.disable_media_tunneling_automatic_info) + } else { + tunnelingBaseSummary + } + + Scaffold( + topBar = { + TopAppBar( + title = stringResource(Res.string.settings_category_exoplayer_title), + onNavigateUp = onNavigateUp + ) + } + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(top = paddingValues.calculateTopPadding()) + .verticalScroll(rememberScrollState()) + .padding(WindowInsets.navigationBars.asPaddingValues()) + ) { + ListPreference( + title = stringResource(Res.string.progressive_load_interval_title), + entries = loadIntervalEntries, + selectedValue = progressiveLoadInterval, + onValueSelected = onProgressiveLoadIntervalChange, + summary = stringResource(Res.string.progressive_load_interval_summary, selectedLoadIntervalTitle) + ) + SwitchPreference( + title = stringResource(Res.string.use_exoplayer_decoder_fallback_title), + summary = stringResource(Res.string.use_exoplayer_decoder_fallback_summary), + checked = useExoplayerDecoderFallback, + onCheckedChange = onUseExoplayerDecoderFallbackChange + ) + SwitchPreference( + title = stringResource(Res.string.disable_media_tunneling_title), + summary = tunnelingSummary, + checked = disableMediaTunneling, + onCheckedChange = onDisableMediaTunnelingChange + ) + SwitchPreference( + title = stringResource(Res.string.always_use_exoplayer_set_output_surface_workaround_title), + summary = stringResource(Res.string.always_use_exoplayer_set_output_surface_workaround_summary), + checked = alwaysUseSetOutputSurfaceWorkaround, + onCheckedChange = onAlwaysUseSetOutputSurfaceWorkaroundChange + ) + } + } +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun ExoPlayerSettingsScreenPreview() { + ExoPlayerSettingsScreenContent() +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt index b44233dec..dbfdd2e63 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt @@ -28,8 +28,10 @@ import kotlinx.coroutines.launch import net.newpipe.app.composable.ListPreference import net.newpipe.app.composable.ListPreferenceEntry import net.newpipe.app.composable.PreferenceCategoryTitle +import net.newpipe.app.composable.PreferenceRow import net.newpipe.app.composable.SwitchPreference import net.newpipe.app.composable.TopAppBar +import net.newpipe.app.navigation.Destination import net.newpipe.app.navigation.Navigator import net.newpipe.app.preferences.VideoAudioPreferences import net.newpipe.app.preview.ThemePreviewProvider @@ -86,6 +88,8 @@ import newpipe.shared.generated.resources.right_gesture_control_title import newpipe.shared.generated.resources.seconds import newpipe.shared.generated.resources.seek_duration_title import newpipe.shared.generated.resources.seekbar_preview_thumbnail_title +import newpipe.shared.generated.resources.settings_category_exoplayer_summary +import newpipe.shared.generated.resources.settings_category_exoplayer_title import newpipe.shared.generated.resources.settings_category_player_behavior_title import newpipe.shared.generated.resources.settings_category_player_title import newpipe.shared.generated.resources.settings_category_video_audio_title @@ -206,6 +210,7 @@ fun VideoAudioSettingsScreen( onSeekDurationChange = viewModel::setSeekDuration, onClearQueueConfirmationChange = viewModel::setClearQueueConfirmation, onIgnoreHardwareMediaButtonsChange = viewModel::setIgnoreHardwareMediaButtons, + onOpenExoPlayerSettings = { navigator.navigateTo(Destination.ExoPlayerSettings) }, onNavigateUp = { navigator.navigateUp() } ) } @@ -265,6 +270,7 @@ fun VideoAudioSettingsScreenContent( onSeekDurationChange: (String) -> Unit = {}, onClearQueueConfirmationChange: (Boolean) -> Unit = {}, onIgnoreHardwareMediaButtonsChange: (Boolean) -> Unit = {}, + onOpenExoPlayerSettings: () -> Unit = {}, onNavigateUp: () -> Unit = {} ) { val scope = rememberCoroutineScope() @@ -393,7 +399,11 @@ fun VideoAudioSettingsScreenContent( onCheckedChange = onPreferDescriptiveAudioChange ) - // TODO: ExoPlayer settings sub-screen link goes here once that screen is migrated. + PreferenceRow( + title = stringResource(Res.string.settings_category_exoplayer_title), + summary = stringResource(Res.string.settings_category_exoplayer_summary), + onClick = onOpenExoPlayerSettings + ) PreferenceCategoryTitle(title = stringResource(Res.string.settings_category_player_title)) SwitchPreference( @@ -497,8 +507,6 @@ fun VideoAudioSettingsScreenContent( summary = stringResource(Res.string.use_inexact_seek_summary), checked = useInexactSeek, onCheckedChange = { checked -> - // The view model applies the same adjustment. this only decides whether to - // tell the user about it, mirroring the legacy toast. VideoAudioPreferences.adjustedSeekDurationMs(seekDuration, checked)?.let { adjustedMs -> val newSeconds = VideoAudioPreferences.seekDurationSeconds(adjustedMs) scope.launch { diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/ExoPlayerSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/ExoPlayerSettingsViewModel.kt new file mode 100644 index 000000000..ef45f6db6 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/ExoPlayerSettingsViewModel.kt @@ -0,0 +1,68 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.viewmodel.settings + +import androidx.lifecycle.ViewModel +import com.russhwolf.settings.Settings +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import net.newpipe.app.preferences.ExoPlayerPreferences +import org.koin.core.annotation.KoinViewModel + +@KoinViewModel +class ExoPlayerSettingsViewModel(private val settings: Settings) : ViewModel() { + + val progressiveLoadInterval: StateFlow + field = stringFlow(ExoPlayerPreferences.KEY_PROGRESSIVE_LOAD_INTERVAL, ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL) + + val useExoplayerDecoderFallback: StateFlow + field = booleanFlow(ExoPlayerPreferences.KEY_USE_EXOPLAYER_DECODER_FALLBACK, ExoPlayerPreferences.DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK) + + val disableMediaTunneling: StateFlow + field = booleanFlow(ExoPlayerPreferences.KEY_DISABLE_MEDIA_TUNNELING, ExoPlayerPreferences.DEFAULT_DISABLE_MEDIA_TUNNELING) + + val alwaysUseSetOutputSurfaceWorkaround: StateFlow + field = booleanFlow(ExoPlayerPreferences.KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, ExoPlayerPreferences.DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND) + + val mediaTunnelingAutoDisabled: StateFlow + field = MutableStateFlow( + settings.getInt( + ExoPlayerPreferences.KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY, + ExoPlayerPreferences.MEDIA_TUNNELING_FLAG_UNSET + ) == ExoPlayerPreferences.MEDIA_TUNNELING_AUTO_DISABLED + ) + + fun setProgressiveLoadInterval(value: String) = progressiveLoadInterval.persist(ExoPlayerPreferences.KEY_PROGRESSIVE_LOAD_INTERVAL, value) + + fun setUseExoplayerDecoderFallback(value: Boolean) = useExoplayerDecoderFallback.persist(ExoPlayerPreferences.KEY_USE_EXOPLAYER_DECODER_FALLBACK, value) + + fun setDisableMediaTunneling(value: Boolean) { + disableMediaTunneling.persist(ExoPlayerPreferences.KEY_DISABLE_MEDIA_TUNNELING, value) + if (!value) { + settings.putInt( + ExoPlayerPreferences.KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY, + ExoPlayerPreferences.MEDIA_TUNNELING_USER_MANAGED + ) + mediaTunnelingAutoDisabled.value = false + } + } + + fun setAlwaysUseSetOutputSurfaceWorkaround(value: Boolean) = alwaysUseSetOutputSurfaceWorkaround.persist(ExoPlayerPreferences.KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, value) + + private fun stringFlow(key: String, defaultValue: String) = MutableStateFlow(settings.getString(key, defaultValue)) + + private fun booleanFlow(key: String, defaultValue: Boolean) = MutableStateFlow(settings.getBoolean(key, defaultValue)) + + private fun MutableStateFlow.persist(key: String, newValue: String) { + settings.putString(key, newValue) + value = newValue + } + + private fun MutableStateFlow.persist(key: String, newValue: Boolean) { + settings.putBoolean(key, newValue) + value = newValue + } +} diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt new file mode 100644 index 000000000..8b82827c0 --- /dev/null +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.screen.settings + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.v2.runComposeUiTest +import com.russhwolf.settings.MapSettings +import com.russhwolf.settings.Settings +import kotlin.test.Test +import net.newpipe.app.extensions.withKoin +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.disable_media_tunneling_automatic_info +import newpipe.shared.generated.resources.progressive_load_interval_summary +import newpipe.shared.generated.resources.progressive_load_interval_title +import newpipe.shared.generated.resources.settings_category_exoplayer_title +import org.jetbrains.compose.resources.getString +import org.koin.dsl.module + +@OptIn(ExperimentalTestApi::class) +class ExoPlayerSettingsScreenTest { + + private val emptySettings = module { + single { MapSettings() } + } + + @Test + fun rendersTitleAndLoadIntervalRow() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { ExoPlayerSettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.settings_category_exoplayer_title)).assertIsDisplayed() + onNodeWithText(getString(Res.string.progressive_load_interval_title)).assertIsDisplayed() + } + ) + } + + @Test + fun loadIntervalSummaryShowsSelectedEntryLabel() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { ExoPlayerSettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.progressive_load_interval_summary, "64 KiB")).assertIsDisplayed() + } + ) + } + + @Test + fun mediaTunnelingInfoShownOnlyWhenAutoDisabled() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { ExoPlayerSettingsScreenContent(mediaTunnelingAutoDisabled = true) }, + onContent = { + onNodeWithText(getString(Res.string.disable_media_tunneling_automatic_info), substring = true) + .performScrollTo() + .assertIsDisplayed() + } + ) + } +} diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt index 1ab8c6063..755f10aa4 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt @@ -18,6 +18,7 @@ import net.newpipe.app.preferences.VideoAudioPreferences import newpipe.shared.generated.resources.Res import newpipe.shared.generated.resources.best_resolution import newpipe.shared.generated.resources.default_resolution_title +import newpipe.shared.generated.resources.settings_category_exoplayer_title import newpipe.shared.generated.resources.settings_category_player_title import newpipe.shared.generated.resources.settings_category_video_audio_title import org.jetbrains.compose.resources.getString @@ -67,4 +68,17 @@ class VideoAudioSettingsScreenTest { } ) } + + @Test + fun rendersExoPlayerSettingsLink() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { VideoAudioSettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.settings_category_exoplayer_title)) + .performScrollTo() + .assertIsDisplayed() + } + ) + } } From 793a6bc337c62ad73574a24ed1e6e36f061f2a0e Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Mon, 21 Sep 2026 23:51:48 -0700 Subject: [PATCH 079/155] pr feedback update --- gradle/libs.versions.toml | 2 +- settings.gradle.kts | 4 +--- .../app/composable/PreferenceCategoryTitle.kt | 2 +- .../kotlin/net/newpipe/app/navigation/NavModule.kt | 4 ++-- .../app/preferences/VideoAudioPreferences.kt | 12 +++++++++++- ...erSettingsScreen.kt => PlayerSettingsScreen.kt} | 14 +++++++------- .../settings/AppearanceSettingsViewModel.kt | 1 - ...ingsViewModel.kt => PlayerSettingsViewModel.kt} | 2 +- .../screen/settings/ExoPlayerSettingsScreenTest.kt | 6 +++--- 9 files changed, 27 insertions(+), 20 deletions(-) rename shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/{ExoPlayerSettingsScreen.kt => PlayerSettingsScreen.kt} (95%) rename shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/{ExoPlayerSettingsViewModel.kt => PlayerSettingsViewModel.kt} (97%) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 230bf09b9..61e15ceca 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ about-libraries = "15.1.1" acra = "5.13.1" activity = "1.13.0" -agp = "9.3.1" +agp = "9.4.0" appcompat = "1.8.0" assertj = "3.27.7" autoservice-google = "1.1.1" diff --git a/settings.gradle.kts b/settings.gradle.kts index 6549b684f..d2b3e1964 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,9 +12,7 @@ pluginManagement { mavenCentral() } } -plugins { - id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0" -} + dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt index f1af2acdc..1bd542744 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceCategoryTitle.kt @@ -33,4 +33,4 @@ fun PreferenceCategoryTitle(title: String, modifier: Modifier = Modifier) { @Composable private fun PreferenceCategoryTitlePreview() { PreferenceCategoryTitle(title = "Player") -} \ No newline at end of file +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt index aae14584f..a885b8f8d 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt @@ -9,7 +9,7 @@ import androidx.compose.runtime.mutableStateListOf import co.touchlab.kermit.Logger import net.newpipe.app.screen.about.AboutScreen import net.newpipe.app.screen.settings.AppearanceSettingsScreen -import net.newpipe.app.screen.settings.ExoPlayerSettingsScreen +import net.newpipe.app.screen.settings.PlayerSettingsScreen import net.newpipe.app.screen.settings.SettingsHomeScreen import net.newpipe.app.screen.settings.VideoAudioSettingsScreen import org.koin.core.annotation.KoinExperimentalAPI @@ -45,7 +45,7 @@ fun navModule() = module { } navigation { - ExoPlayerSettingsScreen() + PlayerSettingsScreen() } } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt index 26a2818f3..2b4096959 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt @@ -147,5 +147,15 @@ object VideoAudioPreferences { return if (seconds % 10 == 5) ((seconds + 5) * MILLIS_PER_SECOND).toString() else null } - private fun insertHighResolutions(base: List, showHigher: Boolean): List = if (!showHigher) base else base.toMutableList().apply { addAll(1, HIGH_RESOLUTIONS) } + private fun insertHighResolutions( + base: List, + showHigher: Boolean, + ): List { + if (!showHigher) { + return base + } + return base.toMutableList().apply { + addAll(1, HIGH_RESOLUTIONS) + } + } } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/PlayerSettingsScreen.kt similarity index 95% rename from shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreen.kt rename to shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/PlayerSettingsScreen.kt index 52d6de061..007981b08 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/PlayerSettingsScreen.kt @@ -27,7 +27,7 @@ import net.newpipe.app.composable.TopAppBar import net.newpipe.app.navigation.Navigator import net.newpipe.app.preferences.ExoPlayerPreferences import net.newpipe.app.preview.ThemePreviewProvider -import net.newpipe.app.viewmodel.settings.ExoPlayerSettingsViewModel +import net.newpipe.app.viewmodel.settings.PlayerSettingsViewModel import newpipe.shared.generated.resources.Res import newpipe.shared.generated.resources.always_use_exoplayer_set_output_surface_workaround_summary import newpipe.shared.generated.resources.always_use_exoplayer_set_output_surface_workaround_title @@ -45,9 +45,9 @@ import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel @Composable -fun ExoPlayerSettingsScreen( +fun PlayerSettingsScreen( navigator: Navigator = koinInject(), - viewModel: ExoPlayerSettingsViewModel = koinViewModel() + viewModel: PlayerSettingsViewModel = koinViewModel() ) { val progressiveLoadInterval by viewModel.progressiveLoadInterval.collectAsStateWithLifecycle() val useExoplayerDecoderFallback by viewModel.useExoplayerDecoderFallback.collectAsStateWithLifecycle() @@ -55,7 +55,7 @@ fun ExoPlayerSettingsScreen( val mediaTunnelingAutoDisabled by viewModel.mediaTunnelingAutoDisabled.collectAsStateWithLifecycle() val alwaysUseSetOutputSurfaceWorkaround by viewModel.alwaysUseSetOutputSurfaceWorkaround.collectAsStateWithLifecycle() - ExoPlayerSettingsScreenContent( + PlayerSettingsScreenContent( progressiveLoadInterval = progressiveLoadInterval, useExoplayerDecoderFallback = useExoplayerDecoderFallback, disableMediaTunneling = disableMediaTunneling, @@ -70,7 +70,7 @@ fun ExoPlayerSettingsScreen( } @Composable -fun ExoPlayerSettingsScreenContent( +fun PlayerSettingsScreenContent( progressiveLoadInterval: String = ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL, useExoplayerDecoderFallback: Boolean = ExoPlayerPreferences.DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK, disableMediaTunneling: Boolean = ExoPlayerPreferences.DEFAULT_DISABLE_MEDIA_TUNNELING, @@ -146,6 +146,6 @@ fun ExoPlayerSettingsScreenContent( @PreviewWrapper(ThemePreviewProvider::class) @PreviewLightDark @Composable -private fun ExoPlayerSettingsScreenPreview() { - ExoPlayerSettingsScreenContent() +private fun PlayerSettingsScreenPreview() { + PlayerSettingsScreenContent() } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt index c6602dd50..7587f2c75 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/AppearanceSettingsViewModel.kt @@ -13,7 +13,6 @@ import net.newpipe.app.platform.AppearanceActions import net.newpipe.app.preferences.AppearancePreferences import org.koin.core.annotation.KoinViewModel - @KoinViewModel class AppearanceSettingsViewModel( private val settings: Settings, diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/ExoPlayerSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt similarity index 97% rename from shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/ExoPlayerSettingsViewModel.kt rename to shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt index ef45f6db6..2b9186055 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/ExoPlayerSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt @@ -13,7 +13,7 @@ import net.newpipe.app.preferences.ExoPlayerPreferences import org.koin.core.annotation.KoinViewModel @KoinViewModel -class ExoPlayerSettingsViewModel(private val settings: Settings) : ViewModel() { +class PlayerSettingsViewModel(private val settings: Settings) : ViewModel() { val progressiveLoadInterval: StateFlow field = stringFlow(ExoPlayerPreferences.KEY_PROGRESSIVE_LOAD_INTERVAL, ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL) diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt index 8b82827c0..de2883917 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt @@ -33,7 +33,7 @@ class ExoPlayerSettingsScreenTest { fun rendersTitleAndLoadIntervalRow() = runComposeUiTest { withKoin( modules = listOf(emptySettings), - content = { ExoPlayerSettingsScreenContent() }, + content = { PlayerSettingsScreenContent() }, onContent = { onNodeWithText(getString(Res.string.settings_category_exoplayer_title)).assertIsDisplayed() onNodeWithText(getString(Res.string.progressive_load_interval_title)).assertIsDisplayed() @@ -45,7 +45,7 @@ class ExoPlayerSettingsScreenTest { fun loadIntervalSummaryShowsSelectedEntryLabel() = runComposeUiTest { withKoin( modules = listOf(emptySettings), - content = { ExoPlayerSettingsScreenContent() }, + content = { PlayerSettingsScreenContent() }, onContent = { onNodeWithText(getString(Res.string.progressive_load_interval_summary, "64 KiB")).assertIsDisplayed() } @@ -56,7 +56,7 @@ class ExoPlayerSettingsScreenTest { fun mediaTunnelingInfoShownOnlyWhenAutoDisabled() = runComposeUiTest { withKoin( modules = listOf(emptySettings), - content = { ExoPlayerSettingsScreenContent(mediaTunnelingAutoDisabled = true) }, + content = { PlayerSettingsScreenContent(mediaTunnelingAutoDisabled = true) }, onContent = { onNodeWithText(getString(Res.string.disable_media_tunneling_automatic_info), substring = true) .performScrollTo() From 4cad0293ca3b11807b99e93c08ba633ea2ab9d4a Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Tue, 6 Oct 2026 02:33:06 -0700 Subject: [PATCH 080/155] dynamic player settings ui per platform --- gradle/libs.versions.toml | 2 +- .../screen/ExoPlayerSettingsSectionsTest.kt | 72 +++++++++++ .../platform/AndroidPlayerSettingsSections.kt | 18 +++ .../app/preferences/ExoPlayerPreferences.kt | 0 .../app/screen/ExoPlayerSettingsSections.kt | 116 ++++++++++++++++++ .../settings/PlayerSettingsViewModel.kt | 0 .../net/newpipe/app/navigation/Destination.kt | 3 +- .../net/newpipe/app/navigation/NavModule.kt | 2 +- .../app/platform/PlayerSettingsSections.kt | 19 +++ .../screen/settings/PlayerSettingsScreen.kt | 115 ++--------------- .../settings/VideoAudioSettingsScreen.kt | 23 ++-- .../settings/ExoPlayerSettingsScreenTest.kt | 67 ---------- .../settings/VideoAudioSettingsScreenTest.kt | 2 +- .../app/platform/IOSPlayerSettingsSections.kt | 17 +++ .../app/platform/JVMPlayerSettingsSections.kt | 17 +++ 15 files changed, 285 insertions(+), 188 deletions(-) create mode 100644 shared/src/androidDeviceTest/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSectionsTest.kt create mode 100644 shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidPlayerSettingsSections.kt rename shared/src/{commonMain => androidMain}/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt (100%) create mode 100644 shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt rename shared/src/{commonMain => androidMain}/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt (100%) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/platform/PlayerSettingsSections.kt delete mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt create mode 100644 shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSPlayerSettingsSections.kt create mode 100644 shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMPlayerSettingsSections.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 61e15ceca..cca581bc0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ about-libraries = "15.1.1" acra = "5.13.1" activity = "1.13.0" -agp = "9.4.0" +agp = "9.4.1" appcompat = "1.8.0" assertj = "3.27.7" autoservice-google = "1.1.1" diff --git a/shared/src/androidDeviceTest/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSectionsTest.kt b/shared/src/androidDeviceTest/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSectionsTest.kt new file mode 100644 index 000000000..e04ac6590 --- /dev/null +++ b/shared/src/androidDeviceTest/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSectionsTest.kt @@ -0,0 +1,72 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.v2.runComposeUiTest +import kotlin.test.Test +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.disable_media_tunneling_automatic_info +import newpipe.shared.generated.resources.disable_media_tunneling_summary +import newpipe.shared.generated.resources.progressive_load_interval_summary +import newpipe.shared.generated.resources.progressive_load_interval_title +import org.jetbrains.compose.resources.getString + +@Composable +private fun Hosted(content: @Composable () -> Unit) { + Column(modifier = Modifier.verticalScroll(rememberScrollState())) { content() } +} + +@OptIn(ExperimentalTestApi::class) +class ExoPlayerSettingsSectionsTest { + + @Test + fun rendersLoadIntervalRow() = runComposeUiTest { + setContent { Hosted { ExoPlayerSettingsSectionsContent() } } + + onNodeWithText(getString(Res.string.progressive_load_interval_title)).assertIsDisplayed() + } + + @Test + fun loadIntervalSummaryShowsSelectedEntryLabel() = runComposeUiTest { + setContent { Hosted { ExoPlayerSettingsSectionsContent() } } + + onNodeWithText(getString(Res.string.progressive_load_interval_summary, "64 KiB")) + .assertIsDisplayed() + } + + @Test + fun mediaTunnelingInfoShownWhenAutoDisabled() = runComposeUiTest { + setContent { + Hosted { ExoPlayerSettingsSectionsContent(mediaTunnelingAutoDisabled = true) } + } + + onNodeWithText(getString(Res.string.disable_media_tunneling_automatic_info), substring = true) + .performScrollTo() + .assertIsDisplayed() + } + + @Test + fun mediaTunnelingInfoHiddenWhenNotAutoDisabled() = runComposeUiTest { + setContent { + Hosted { ExoPlayerSettingsSectionsContent(mediaTunnelingAutoDisabled = false) } + } + + onNodeWithText(getString(Res.string.disable_media_tunneling_summary), substring = true) + .performScrollTo() + .assertIsDisplayed() + onNodeWithText(getString(Res.string.disable_media_tunneling_automatic_info), substring = true) + .assertDoesNotExist() + } +} diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidPlayerSettingsSections.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidPlayerSettingsSections.kt new file mode 100644 index 000000000..2d971f558 --- /dev/null +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidPlayerSettingsSections.kt @@ -0,0 +1,18 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import androidx.compose.runtime.Composable +import net.newpipe.app.screen.ExoPlayerSettingsSections +import org.koin.core.annotation.Singleton + +@Singleton(binds = [PlayerSettingsSections::class]) +class AndroidPlayerSettingsSections : PlayerSettingsSections { + override val isAvailable = true + + @Composable + override fun Render() = ExoPlayerSettingsSections() +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt b/shared/src/androidMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt similarity index 100% rename from shared/src/commonMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt rename to shared/src/androidMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt b/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt new file mode 100644 index 000000000..9a1e25133 --- /dev/null +++ b/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt @@ -0,0 +1,116 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.screen + +import androidx.compose.foundation.layout.Column +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import net.newpipe.app.composable.ListPreference +import net.newpipe.app.composable.ListPreferenceEntry +import net.newpipe.app.composable.SwitchPreference +import net.newpipe.app.preferences.ExoPlayerPreferences +import net.newpipe.app.preview.ThemePreviewProvider +import net.newpipe.app.viewmodel.settings.PlayerSettingsViewModel +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.always_use_exoplayer_set_output_surface_workaround_summary +import newpipe.shared.generated.resources.always_use_exoplayer_set_output_surface_workaround_title +import newpipe.shared.generated.resources.disable_media_tunneling_automatic_info +import newpipe.shared.generated.resources.disable_media_tunneling_summary +import newpipe.shared.generated.resources.disable_media_tunneling_title +import newpipe.shared.generated.resources.progressive_load_interval_exoplayer_default +import newpipe.shared.generated.resources.progressive_load_interval_summary +import newpipe.shared.generated.resources.progressive_load_interval_title +import newpipe.shared.generated.resources.use_exoplayer_decoder_fallback_summary +import newpipe.shared.generated.resources.use_exoplayer_decoder_fallback_title +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.viewmodel.koinViewModel + +@Composable +fun ExoPlayerSettingsSections(viewModel: PlayerSettingsViewModel = koinViewModel()) { + val progressiveLoadInterval by viewModel.progressiveLoadInterval.collectAsStateWithLifecycle() + val useExoplayerDecoderFallback by viewModel.useExoplayerDecoderFallback.collectAsStateWithLifecycle() + val disableMediaTunneling by viewModel.disableMediaTunneling.collectAsStateWithLifecycle() + val mediaTunnelingAutoDisabled by viewModel.mediaTunnelingAutoDisabled.collectAsStateWithLifecycle() + val alwaysUseSetOutputSurfaceWorkaround by viewModel.alwaysUseSetOutputSurfaceWorkaround.collectAsStateWithLifecycle() + + ExoPlayerSettingsSectionsContent( + progressiveLoadInterval = progressiveLoadInterval, + useExoplayerDecoderFallback = useExoplayerDecoderFallback, + disableMediaTunneling = disableMediaTunneling, + mediaTunnelingAutoDisabled = mediaTunnelingAutoDisabled, + alwaysUseSetOutputSurfaceWorkaround = alwaysUseSetOutputSurfaceWorkaround, + onProgressiveLoadIntervalChange = viewModel::setProgressiveLoadInterval, + onUseExoplayerDecoderFallbackChange = viewModel::setUseExoplayerDecoderFallback, + onDisableMediaTunnelingChange = viewModel::setDisableMediaTunneling, + onAlwaysUseSetOutputSurfaceWorkaroundChange = viewModel::setAlwaysUseSetOutputSurfaceWorkaround + ) +} + +@Composable +fun ExoPlayerSettingsSectionsContent( + progressiveLoadInterval: String = ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL, + useExoplayerDecoderFallback: Boolean = ExoPlayerPreferences.DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK, + disableMediaTunneling: Boolean = ExoPlayerPreferences.DEFAULT_DISABLE_MEDIA_TUNNELING, + mediaTunnelingAutoDisabled: Boolean = false, + alwaysUseSetOutputSurfaceWorkaround: Boolean = ExoPlayerPreferences.DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, + onProgressiveLoadIntervalChange: (String) -> Unit = {}, + onUseExoplayerDecoderFallbackChange: (Boolean) -> Unit = {}, + onDisableMediaTunnelingChange: (Boolean) -> Unit = {}, + onAlwaysUseSetOutputSurfaceWorkaroundChange: (Boolean) -> Unit = {} +) { + val exoPlayerDefaultLabel = stringResource(Res.string.progressive_load_interval_exoplayer_default) + + val loadIntervalEntries = ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVALS.map { value -> + ListPreferenceEntry( + value = value, + title = if (value == ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT) exoPlayerDefaultLabel else "$value KiB" + ) + } + val selectedLoadIntervalTitle = loadIntervalEntries.firstOrNull { it.value == progressiveLoadInterval }?.title.orEmpty() + + val tunnelingBaseSummary = stringResource(Res.string.disable_media_tunneling_summary) + val tunnelingSummary = if (mediaTunnelingAutoDisabled) { + tunnelingBaseSummary + " " + stringResource(Res.string.disable_media_tunneling_automatic_info) + } else { + tunnelingBaseSummary + } + + ListPreference( + title = stringResource(Res.string.progressive_load_interval_title), + entries = loadIntervalEntries, + selectedValue = progressiveLoadInterval, + onValueSelected = onProgressiveLoadIntervalChange, + summary = stringResource(Res.string.progressive_load_interval_summary, selectedLoadIntervalTitle) + ) + SwitchPreference( + title = stringResource(Res.string.use_exoplayer_decoder_fallback_title), + summary = stringResource(Res.string.use_exoplayer_decoder_fallback_summary), + checked = useExoplayerDecoderFallback, + onCheckedChange = onUseExoplayerDecoderFallbackChange + ) + SwitchPreference( + title = stringResource(Res.string.disable_media_tunneling_title), + summary = tunnelingSummary, + checked = disableMediaTunneling, + onCheckedChange = onDisableMediaTunnelingChange + ) + SwitchPreference( + title = stringResource(Res.string.always_use_exoplayer_set_output_surface_workaround_title), + summary = stringResource(Res.string.always_use_exoplayer_set_output_surface_workaround_summary), + checked = alwaysUseSetOutputSurfaceWorkaround, + onCheckedChange = onAlwaysUseSetOutputSurfaceWorkaroundChange + ) +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun ExoPlayerSettingsSectionsPreview() { + Column { ExoPlayerSettingsSectionsContent() } +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt b/shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt similarity index 100% rename from shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt rename to shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt index 4290abadb..f7a33b8f8 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt @@ -7,7 +7,6 @@ package net.newpipe.app.navigation import androidx.navigation3.runtime.NavKey import kotlinx.serialization.Serializable -import net.newpipe.app.model.License /** * Destinations for navigation in compose @@ -16,7 +15,7 @@ import net.newpipe.app.model.License sealed interface Destination : NavKey { @Serializable - data object ExoPlayerSettings : Destination + data object PlayerSettings : Destination @Serializable data object VideoAudioSettings : Destination diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt index a885b8f8d..267befd74 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt @@ -44,7 +44,7 @@ fun navModule() = module { VideoAudioSettingsScreen() } - navigation { + navigation { PlayerSettingsScreen() } } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/platform/PlayerSettingsSections.kt b/shared/src/commonMain/kotlin/net/newpipe/app/platform/PlayerSettingsSections.kt new file mode 100644 index 000000000..58120fc89 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/platform/PlayerSettingsSections.kt @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import androidx.compose.runtime.Composable + +/** + * Platform-specific contents of the player settings screen: ExoPlayer settings on Android, + * and each other platform's own player settings once it has any. + */ +interface PlayerSettingsSections { + val isAvailable: Boolean + + @Composable + fun Render() +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/PlayerSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/PlayerSettingsScreen.kt index 007981b08..a75a5fe6c 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/PlayerSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/PlayerSettingsScreen.kt @@ -1,7 +1,7 @@ /* -* SPDX-FileCopyrightText: 2026 NewPipe e.V. -* SPDX-License-Identifier: GPL-3.0-or-later -*/ + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ package net.newpipe.app.screen.settings @@ -15,95 +15,25 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier -import androidx.compose.ui.tooling.preview.PreviewLightDark -import androidx.compose.ui.tooling.preview.PreviewWrapper -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import net.newpipe.app.composable.ListPreference -import net.newpipe.app.composable.ListPreferenceEntry -import net.newpipe.app.composable.SwitchPreference import net.newpipe.app.composable.TopAppBar import net.newpipe.app.navigation.Navigator -import net.newpipe.app.preferences.ExoPlayerPreferences -import net.newpipe.app.preview.ThemePreviewProvider -import net.newpipe.app.viewmodel.settings.PlayerSettingsViewModel +import net.newpipe.app.platform.PlayerSettingsSections import newpipe.shared.generated.resources.Res -import newpipe.shared.generated.resources.always_use_exoplayer_set_output_surface_workaround_summary -import newpipe.shared.generated.resources.always_use_exoplayer_set_output_surface_workaround_title -import newpipe.shared.generated.resources.disable_media_tunneling_automatic_info -import newpipe.shared.generated.resources.disable_media_tunneling_summary -import newpipe.shared.generated.resources.disable_media_tunneling_title -import newpipe.shared.generated.resources.progressive_load_interval_exoplayer_default -import newpipe.shared.generated.resources.progressive_load_interval_summary -import newpipe.shared.generated.resources.progressive_load_interval_title import newpipe.shared.generated.resources.settings_category_exoplayer_title -import newpipe.shared.generated.resources.use_exoplayer_decoder_fallback_summary -import newpipe.shared.generated.resources.use_exoplayer_decoder_fallback_title import org.jetbrains.compose.resources.stringResource import org.koin.compose.koinInject -import org.koin.compose.viewmodel.koinViewModel @Composable fun PlayerSettingsScreen( navigator: Navigator = koinInject(), - viewModel: PlayerSettingsViewModel = koinViewModel() + sections: PlayerSettingsSections = koinInject() ) { - val progressiveLoadInterval by viewModel.progressiveLoadInterval.collectAsStateWithLifecycle() - val useExoplayerDecoderFallback by viewModel.useExoplayerDecoderFallback.collectAsStateWithLifecycle() - val disableMediaTunneling by viewModel.disableMediaTunneling.collectAsStateWithLifecycle() - val mediaTunnelingAutoDisabled by viewModel.mediaTunnelingAutoDisabled.collectAsStateWithLifecycle() - val alwaysUseSetOutputSurfaceWorkaround by viewModel.alwaysUseSetOutputSurfaceWorkaround.collectAsStateWithLifecycle() - - PlayerSettingsScreenContent( - progressiveLoadInterval = progressiveLoadInterval, - useExoplayerDecoderFallback = useExoplayerDecoderFallback, - disableMediaTunneling = disableMediaTunneling, - mediaTunnelingAutoDisabled = mediaTunnelingAutoDisabled, - alwaysUseSetOutputSurfaceWorkaround = alwaysUseSetOutputSurfaceWorkaround, - onProgressiveLoadIntervalChange = viewModel::setProgressiveLoadInterval, - onUseExoplayerDecoderFallbackChange = viewModel::setUseExoplayerDecoderFallback, - onDisableMediaTunnelingChange = viewModel::setDisableMediaTunneling, - onAlwaysUseSetOutputSurfaceWorkaroundChange = viewModel::setAlwaysUseSetOutputSurfaceWorkaround, - onNavigateUp = { navigator.navigateUp() } - ) -} - -@Composable -fun PlayerSettingsScreenContent( - progressiveLoadInterval: String = ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL, - useExoplayerDecoderFallback: Boolean = ExoPlayerPreferences.DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK, - disableMediaTunneling: Boolean = ExoPlayerPreferences.DEFAULT_DISABLE_MEDIA_TUNNELING, - mediaTunnelingAutoDisabled: Boolean = false, - alwaysUseSetOutputSurfaceWorkaround: Boolean = ExoPlayerPreferences.DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, - onProgressiveLoadIntervalChange: (String) -> Unit = {}, - onUseExoplayerDecoderFallbackChange: (Boolean) -> Unit = {}, - onDisableMediaTunnelingChange: (Boolean) -> Unit = {}, - onAlwaysUseSetOutputSurfaceWorkaroundChange: (Boolean) -> Unit = {}, - onNavigateUp: () -> Unit = {} -) { - val exoPlayerDefaultLabel = stringResource(Res.string.progressive_load_interval_exoplayer_default) - - val loadIntervalEntries = ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVALS.map { value -> - ListPreferenceEntry( - value = value, - title = if (value == ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT) exoPlayerDefaultLabel else "$value KiB" - ) - } - val selectedLoadIntervalTitle = loadIntervalEntries.firstOrNull { it.value == progressiveLoadInterval }?.title.orEmpty() - - val tunnelingBaseSummary = stringResource(Res.string.disable_media_tunneling_summary) - val tunnelingSummary = if (mediaTunnelingAutoDisabled) { - tunnelingBaseSummary + " " + stringResource(Res.string.disable_media_tunneling_automatic_info) - } else { - tunnelingBaseSummary - } - Scaffold( topBar = { TopAppBar( title = stringResource(Res.string.settings_category_exoplayer_title), - onNavigateUp = onNavigateUp + onNavigateUp = { navigator.navigateUp() } ) } ) { paddingValues -> @@ -114,38 +44,7 @@ fun PlayerSettingsScreenContent( .verticalScroll(rememberScrollState()) .padding(WindowInsets.navigationBars.asPaddingValues()) ) { - ListPreference( - title = stringResource(Res.string.progressive_load_interval_title), - entries = loadIntervalEntries, - selectedValue = progressiveLoadInterval, - onValueSelected = onProgressiveLoadIntervalChange, - summary = stringResource(Res.string.progressive_load_interval_summary, selectedLoadIntervalTitle) - ) - SwitchPreference( - title = stringResource(Res.string.use_exoplayer_decoder_fallback_title), - summary = stringResource(Res.string.use_exoplayer_decoder_fallback_summary), - checked = useExoplayerDecoderFallback, - onCheckedChange = onUseExoplayerDecoderFallbackChange - ) - SwitchPreference( - title = stringResource(Res.string.disable_media_tunneling_title), - summary = tunnelingSummary, - checked = disableMediaTunneling, - onCheckedChange = onDisableMediaTunnelingChange - ) - SwitchPreference( - title = stringResource(Res.string.always_use_exoplayer_set_output_surface_workaround_title), - summary = stringResource(Res.string.always_use_exoplayer_set_output_surface_workaround_summary), - checked = alwaysUseSetOutputSurfaceWorkaround, - onCheckedChange = onAlwaysUseSetOutputSurfaceWorkaroundChange - ) + sections.Render() } } } - -@PreviewWrapper(ThemePreviewProvider::class) -@PreviewLightDark -@Composable -private fun PlayerSettingsScreenPreview() { - PlayerSettingsScreenContent() -} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt index dbfdd2e63..c910b6966 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt @@ -33,6 +33,7 @@ import net.newpipe.app.composable.SwitchPreference import net.newpipe.app.composable.TopAppBar import net.newpipe.app.navigation.Destination import net.newpipe.app.navigation.Navigator +import net.newpipe.app.platform.PlayerSettingsSections import net.newpipe.app.preferences.VideoAudioPreferences import net.newpipe.app.preview.ThemePreviewProvider import net.newpipe.app.viewmodel.settings.VideoAudioSettingsViewModel @@ -117,7 +118,8 @@ import org.koin.compose.viewmodel.koinViewModel @Composable fun VideoAudioSettingsScreen( navigator: Navigator = koinInject(), - viewModel: VideoAudioSettingsViewModel = koinViewModel() + viewModel: VideoAudioSettingsViewModel = koinViewModel(), + playerSettings: PlayerSettingsSections = koinInject() ) { val defaultResolution by viewModel.defaultResolution.collectAsStateWithLifecycle() val defaultPopupResolution by viewModel.defaultPopupResolution.collectAsStateWithLifecycle() @@ -144,6 +146,7 @@ fun VideoAudioSettingsScreen( val seekDuration by viewModel.seekDuration.collectAsStateWithLifecycle() val clearQueueConfirmation by viewModel.clearQueueConfirmation.collectAsStateWithLifecycle() val ignoreHardwareMediaButtons by viewModel.ignoreHardwareMediaButtons.collectAsStateWithLifecycle() + val playerSettingsAvailable = remember { playerSettings.isAvailable } // Option lists are pure functions of their toggles, so derive them instead of storing them. val resolutionValues = remember(showHigherResolutions) { @@ -210,7 +213,8 @@ fun VideoAudioSettingsScreen( onSeekDurationChange = viewModel::setSeekDuration, onClearQueueConfirmationChange = viewModel::setClearQueueConfirmation, onIgnoreHardwareMediaButtonsChange = viewModel::setIgnoreHardwareMediaButtons, - onOpenExoPlayerSettings = { navigator.navigateTo(Destination.ExoPlayerSettings) }, + playerSettingsAvailable = playerSettingsAvailable, + onOpenPlayerSettings = { navigator.navigateTo(Destination.PlayerSettings) }, onNavigateUp = { navigator.navigateUp() } ) } @@ -270,7 +274,8 @@ fun VideoAudioSettingsScreenContent( onSeekDurationChange: (String) -> Unit = {}, onClearQueueConfirmationChange: (Boolean) -> Unit = {}, onIgnoreHardwareMediaButtonsChange: (Boolean) -> Unit = {}, - onOpenExoPlayerSettings: () -> Unit = {}, + playerSettingsAvailable: Boolean = true, + onOpenPlayerSettings: () -> Unit = {}, onNavigateUp: () -> Unit = {} ) { val scope = rememberCoroutineScope() @@ -399,11 +404,13 @@ fun VideoAudioSettingsScreenContent( onCheckedChange = onPreferDescriptiveAudioChange ) - PreferenceRow( - title = stringResource(Res.string.settings_category_exoplayer_title), - summary = stringResource(Res.string.settings_category_exoplayer_summary), - onClick = onOpenExoPlayerSettings - ) + if (playerSettingsAvailable) { + PreferenceRow( + title = stringResource(Res.string.settings_category_exoplayer_title), + summary = stringResource(Res.string.settings_category_exoplayer_summary), + onClick = onOpenPlayerSettings + ) + } PreferenceCategoryTitle(title = stringResource(Res.string.settings_category_player_title)) SwitchPreference( diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt deleted file mode 100644 index de2883917..000000000 --- a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/ExoPlayerSettingsScreenTest.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2026 NewPipe e.V. - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -package net.newpipe.app.screen.settings - -import androidx.compose.ui.test.ExperimentalTestApi -import androidx.compose.ui.test.assertIsDisplayed -import androidx.compose.ui.test.onNodeWithText -import androidx.compose.ui.test.performScrollTo -import androidx.compose.ui.test.v2.runComposeUiTest -import com.russhwolf.settings.MapSettings -import com.russhwolf.settings.Settings -import kotlin.test.Test -import net.newpipe.app.extensions.withKoin -import newpipe.shared.generated.resources.Res -import newpipe.shared.generated.resources.disable_media_tunneling_automatic_info -import newpipe.shared.generated.resources.progressive_load_interval_summary -import newpipe.shared.generated.resources.progressive_load_interval_title -import newpipe.shared.generated.resources.settings_category_exoplayer_title -import org.jetbrains.compose.resources.getString -import org.koin.dsl.module - -@OptIn(ExperimentalTestApi::class) -class ExoPlayerSettingsScreenTest { - - private val emptySettings = module { - single { MapSettings() } - } - - @Test - fun rendersTitleAndLoadIntervalRow() = runComposeUiTest { - withKoin( - modules = listOf(emptySettings), - content = { PlayerSettingsScreenContent() }, - onContent = { - onNodeWithText(getString(Res.string.settings_category_exoplayer_title)).assertIsDisplayed() - onNodeWithText(getString(Res.string.progressive_load_interval_title)).assertIsDisplayed() - } - ) - } - - @Test - fun loadIntervalSummaryShowsSelectedEntryLabel() = runComposeUiTest { - withKoin( - modules = listOf(emptySettings), - content = { PlayerSettingsScreenContent() }, - onContent = { - onNodeWithText(getString(Res.string.progressive_load_interval_summary, "64 KiB")).assertIsDisplayed() - } - ) - } - - @Test - fun mediaTunnelingInfoShownOnlyWhenAutoDisabled() = runComposeUiTest { - withKoin( - modules = listOf(emptySettings), - content = { PlayerSettingsScreenContent(mediaTunnelingAutoDisabled = true) }, - onContent = { - onNodeWithText(getString(Res.string.disable_media_tunneling_automatic_info), substring = true) - .performScrollTo() - .assertIsDisplayed() - } - ) - } -} diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt index 755f10aa4..55949336a 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt @@ -70,7 +70,7 @@ class VideoAudioSettingsScreenTest { } @Test - fun rendersExoPlayerSettingsLink() = runComposeUiTest { + fun rendersPlayerSettingsLink() = runComposeUiTest { withKoin( modules = listOf(emptySettings), content = { VideoAudioSettingsScreenContent() }, diff --git a/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSPlayerSettingsSections.kt b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSPlayerSettingsSections.kt new file mode 100644 index 000000000..383b5f38e --- /dev/null +++ b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSPlayerSettingsSections.kt @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import androidx.compose.runtime.Composable +import org.koin.core.annotation.Singleton + +@Singleton(binds = [PlayerSettingsSections::class]) +class IOSPlayerSettingsSections : PlayerSettingsSections { + override val isAvailable = false + + @Composable + override fun Render() = Unit +} diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMPlayerSettingsSections.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMPlayerSettingsSections.kt new file mode 100644 index 000000000..351df70a4 --- /dev/null +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMPlayerSettingsSections.kt @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import androidx.compose.runtime.Composable +import org.koin.core.annotation.Singleton + +@Singleton(binds = [PlayerSettingsSections::class]) +class JVMPlayerSettingsSections : PlayerSettingsSections { + override val isAvailable = false + + @Composable + override fun Render() = Unit +} From fb3580e3f7ef914985c8be442f74e21adc6f85f5 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Tue, 6 Oct 2026 09:14:24 -0700 Subject: [PATCH 081/155] refactor: pr review feedback --- .../app/screen/ExoPlayerSettingsSections.kt | 30 +++++++--- .../settings/PlayerSettingsViewModel.kt | 59 +++++++++++++------ .../app/preferences/VideoAudioPreferences.kt | 6 +- 3 files changed, 65 insertions(+), 30 deletions(-) diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt b/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt index 9a1e25133..8ed1858d0 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt @@ -14,7 +14,12 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import net.newpipe.app.composable.ListPreference import net.newpipe.app.composable.ListPreferenceEntry import net.newpipe.app.composable.SwitchPreference -import net.newpipe.app.preferences.ExoPlayerPreferences +import net.newpipe.app.preferences.ExoPlayerPreferences.DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND +import net.newpipe.app.preferences.ExoPlayerPreferences.DEFAULT_DISABLE_MEDIA_TUNNELING +import net.newpipe.app.preferences.ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL +import net.newpipe.app.preferences.ExoPlayerPreferences.DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK +import net.newpipe.app.preferences.ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVALS +import net.newpipe.app.preferences.ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT import net.newpipe.app.preview.ThemePreviewProvider import net.newpipe.app.viewmodel.settings.PlayerSettingsViewModel import newpipe.shared.generated.resources.Res @@ -37,7 +42,8 @@ fun ExoPlayerSettingsSections(viewModel: PlayerSettingsViewModel = koinViewModel val useExoplayerDecoderFallback by viewModel.useExoplayerDecoderFallback.collectAsStateWithLifecycle() val disableMediaTunneling by viewModel.disableMediaTunneling.collectAsStateWithLifecycle() val mediaTunnelingAutoDisabled by viewModel.mediaTunnelingAutoDisabled.collectAsStateWithLifecycle() - val alwaysUseSetOutputSurfaceWorkaround by viewModel.alwaysUseSetOutputSurfaceWorkaround.collectAsStateWithLifecycle() + val alwaysUseSetOutputSurfaceWorkaround by viewModel.alwaysUseSetOutputSurfaceWorkaround + .collectAsStateWithLifecycle() ExoPlayerSettingsSectionsContent( progressiveLoadInterval = progressiveLoadInterval, @@ -54,11 +60,11 @@ fun ExoPlayerSettingsSections(viewModel: PlayerSettingsViewModel = koinViewModel @Composable fun ExoPlayerSettingsSectionsContent( - progressiveLoadInterval: String = ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL, - useExoplayerDecoderFallback: Boolean = ExoPlayerPreferences.DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK, - disableMediaTunneling: Boolean = ExoPlayerPreferences.DEFAULT_DISABLE_MEDIA_TUNNELING, + progressiveLoadInterval: String = DEFAULT_PROGRESSIVE_LOAD_INTERVAL, + useExoplayerDecoderFallback: Boolean = DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK, + disableMediaTunneling: Boolean = DEFAULT_DISABLE_MEDIA_TUNNELING, mediaTunnelingAutoDisabled: Boolean = false, - alwaysUseSetOutputSurfaceWorkaround: Boolean = ExoPlayerPreferences.DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, + alwaysUseSetOutputSurfaceWorkaround: Boolean = DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, onProgressiveLoadIntervalChange: (String) -> Unit = {}, onUseExoplayerDecoderFallbackChange: (Boolean) -> Unit = {}, onDisableMediaTunnelingChange: (Boolean) -> Unit = {}, @@ -66,13 +72,19 @@ fun ExoPlayerSettingsSectionsContent( ) { val exoPlayerDefaultLabel = stringResource(Res.string.progressive_load_interval_exoplayer_default) - val loadIntervalEntries = ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVALS.map { value -> + val loadIntervalEntries = PROGRESSIVE_LOAD_INTERVALS.map { value -> ListPreferenceEntry( value = value, - title = if (value == ExoPlayerPreferences.PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT) exoPlayerDefaultLabel else "$value KiB" + title = when (value) { + PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT -> exoPlayerDefaultLabel + else -> "$value KiB" + } ) } - val selectedLoadIntervalTitle = loadIntervalEntries.firstOrNull { it.value == progressiveLoadInterval }?.title.orEmpty() + val selectedLoadIntervalTitle = loadIntervalEntries + .firstOrNull { it.value == progressiveLoadInterval } + ?.title + .orEmpty() val tunnelingBaseSummary = stringResource(Res.string.disable_media_tunneling_summary) val tunnelingSummary = if (mediaTunnelingAutoDisabled) { diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt b/shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt index 2b9186055..ec48d7605 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt @@ -9,52 +9,73 @@ import androidx.lifecycle.ViewModel import com.russhwolf.settings.Settings import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -import net.newpipe.app.preferences.ExoPlayerPreferences +import net.newpipe.app.preferences.ExoPlayerPreferences.DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND +import net.newpipe.app.preferences.ExoPlayerPreferences.DEFAULT_DISABLE_MEDIA_TUNNELING +import net.newpipe.app.preferences.ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL +import net.newpipe.app.preferences.ExoPlayerPreferences.DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK +import net.newpipe.app.preferences.ExoPlayerPreferences.KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND +import net.newpipe.app.preferences.ExoPlayerPreferences.KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY +import net.newpipe.app.preferences.ExoPlayerPreferences.KEY_DISABLE_MEDIA_TUNNELING +import net.newpipe.app.preferences.ExoPlayerPreferences.KEY_PROGRESSIVE_LOAD_INTERVAL +import net.newpipe.app.preferences.ExoPlayerPreferences.KEY_USE_EXOPLAYER_DECODER_FALLBACK +import net.newpipe.app.preferences.ExoPlayerPreferences.MEDIA_TUNNELING_AUTO_DISABLED +import net.newpipe.app.preferences.ExoPlayerPreferences.MEDIA_TUNNELING_FLAG_UNSET +import net.newpipe.app.preferences.ExoPlayerPreferences.MEDIA_TUNNELING_USER_MANAGED import org.koin.core.annotation.KoinViewModel @KoinViewModel class PlayerSettingsViewModel(private val settings: Settings) : ViewModel() { val progressiveLoadInterval: StateFlow - field = stringFlow(ExoPlayerPreferences.KEY_PROGRESSIVE_LOAD_INTERVAL, ExoPlayerPreferences.DEFAULT_PROGRESSIVE_LOAD_INTERVAL) + field = stringFlow(KEY_PROGRESSIVE_LOAD_INTERVAL, DEFAULT_PROGRESSIVE_LOAD_INTERVAL) val useExoplayerDecoderFallback: StateFlow - field = booleanFlow(ExoPlayerPreferences.KEY_USE_EXOPLAYER_DECODER_FALLBACK, ExoPlayerPreferences.DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK) + field = booleanFlow( + KEY_USE_EXOPLAYER_DECODER_FALLBACK, + DEFAULT_USE_EXOPLAYER_DECODER_FALLBACK + ) val disableMediaTunneling: StateFlow - field = booleanFlow(ExoPlayerPreferences.KEY_DISABLE_MEDIA_TUNNELING, ExoPlayerPreferences.DEFAULT_DISABLE_MEDIA_TUNNELING) + field = booleanFlow(KEY_DISABLE_MEDIA_TUNNELING, DEFAULT_DISABLE_MEDIA_TUNNELING) val alwaysUseSetOutputSurfaceWorkaround: StateFlow - field = booleanFlow(ExoPlayerPreferences.KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, ExoPlayerPreferences.DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND) + field = booleanFlow( + KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, + DEFAULT_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND + ) val mediaTunnelingAutoDisabled: StateFlow field = MutableStateFlow( settings.getInt( - ExoPlayerPreferences.KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY, - ExoPlayerPreferences.MEDIA_TUNNELING_FLAG_UNSET - ) == ExoPlayerPreferences.MEDIA_TUNNELING_AUTO_DISABLED + KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY, + MEDIA_TUNNELING_FLAG_UNSET + ) == MEDIA_TUNNELING_AUTO_DISABLED ) - fun setProgressiveLoadInterval(value: String) = progressiveLoadInterval.persist(ExoPlayerPreferences.KEY_PROGRESSIVE_LOAD_INTERVAL, value) + fun setProgressiveLoadInterval(value: String) = + progressiveLoadInterval.persist(KEY_PROGRESSIVE_LOAD_INTERVAL, value) - fun setUseExoplayerDecoderFallback(value: Boolean) = useExoplayerDecoderFallback.persist(ExoPlayerPreferences.KEY_USE_EXOPLAYER_DECODER_FALLBACK, value) + fun setUseExoplayerDecoderFallback(value: Boolean) = + useExoplayerDecoderFallback.persist(KEY_USE_EXOPLAYER_DECODER_FALLBACK, value) fun setDisableMediaTunneling(value: Boolean) { - disableMediaTunneling.persist(ExoPlayerPreferences.KEY_DISABLE_MEDIA_TUNNELING, value) + disableMediaTunneling.persist(KEY_DISABLE_MEDIA_TUNNELING, value) if (!value) { - settings.putInt( - ExoPlayerPreferences.KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY, - ExoPlayerPreferences.MEDIA_TUNNELING_USER_MANAGED - ) + settings.putInt(KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY, MEDIA_TUNNELING_USER_MANAGED) mediaTunnelingAutoDisabled.value = false } } - fun setAlwaysUseSetOutputSurfaceWorkaround(value: Boolean) = alwaysUseSetOutputSurfaceWorkaround.persist(ExoPlayerPreferences.KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, value) + fun setAlwaysUseSetOutputSurfaceWorkaround(value: Boolean) = + alwaysUseSetOutputSurfaceWorkaround.persist( + KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND, + value + ) + private fun stringFlow(key: String, defaultValue: String) = + MutableStateFlow(settings.getString(key, defaultValue)) - private fun stringFlow(key: String, defaultValue: String) = MutableStateFlow(settings.getString(key, defaultValue)) - - private fun booleanFlow(key: String, defaultValue: Boolean) = MutableStateFlow(settings.getBoolean(key, defaultValue)) + private fun booleanFlow(key: String, defaultValue: Boolean) = + MutableStateFlow(settings.getBoolean(key, defaultValue)) private fun MutableStateFlow.persist(key: String, newValue: String) { settings.putString(key, newValue) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt index 2b4096959..0b2497c7d 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt @@ -136,8 +136,10 @@ object VideoAudioPreferences { fun seekDurationSeconds(durationMs: String): Int = durationMs.toInt() / MILLIS_PER_SECOND /** ExoPlayer can't inexact-seek in 5-second steps in audio, so those durations are hidden. */ - fun seekDurationsMs(inexactSeek: Boolean): List = if (!inexactSeek) SEEK_DURATIONS_MS else SEEK_DURATIONS_MS.filter { seekDurationSeconds(it) % 10 != 5 } - + fun seekDurationsMs(inexactSeek: Boolean): List = when { + inexactSeek -> SEEK_DURATIONS_MS.filter { seekDurationSeconds(it) % 10 != 5 } + else -> SEEK_DURATIONS_MS + } /** * The seek duration to switch to when [inexactSeek] hides the currently selected one or null when no adjustment is needed. */ From 0c20ddf8c7f9bbd8a16c92fe7c4ea15b541b26d5 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Wed, 7 Oct 2026 00:42:25 -0700 Subject: [PATCH 082/155] keep lines under 100 chars --- gradle/libs.versions.toml | 2 +- .../screen/ExoPlayerSettingsSectionsTest.kt | 10 +- .../app/preferences/ExoPlayerPreferences.kt | 9 +- .../app/screen/ExoPlayerSettingsSections.kt | 25 ++- .../settings/PlayerSettingsViewModel.kt | 5 +- .../app/preferences/VideoAudioPreferences.kt | 9 +- .../app/screen/settings/SettingsHomeScreen.kt | 8 +- .../settings/VideoAudioSettingsScreen.kt | 204 +++++++++++++----- .../settings/VideoAudioSettingsViewModel.kt | 200 +++++++++++------ .../settings/VideoAudioSettingsScreenTest.kt | 7 +- 10 files changed, 337 insertions(+), 142 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cca581bc0..230bf09b9 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ about-libraries = "15.1.1" acra = "5.13.1" activity = "1.13.0" -agp = "9.4.1" +agp = "9.3.1" appcompat = "1.8.0" assertj = "3.27.7" autoservice-google = "1.1.1" diff --git a/shared/src/androidDeviceTest/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSectionsTest.kt b/shared/src/androidDeviceTest/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSectionsTest.kt index e04ac6590..9c6fa88be 100644 --- a/shared/src/androidDeviceTest/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSectionsTest.kt +++ b/shared/src/androidDeviceTest/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSectionsTest.kt @@ -52,7 +52,10 @@ class ExoPlayerSettingsSectionsTest { Hosted { ExoPlayerSettingsSectionsContent(mediaTunnelingAutoDisabled = true) } } - onNodeWithText(getString(Res.string.disable_media_tunneling_automatic_info), substring = true) + onNodeWithText( + getString(Res.string.disable_media_tunneling_automatic_info), + substring = true + ) .performScrollTo() .assertIsDisplayed() } @@ -66,7 +69,10 @@ class ExoPlayerSettingsSectionsTest { onNodeWithText(getString(Res.string.disable_media_tunneling_summary), substring = true) .performScrollTo() .assertIsDisplayed() - onNodeWithText(getString(Res.string.disable_media_tunneling_automatic_info), substring = true) + onNodeWithText( + getString(Res.string.disable_media_tunneling_automatic_info), + substring = true + ) .assertDoesNotExist() } } diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt b/shared/src/androidMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt index 2e0691bc7..3e5758cd6 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/preferences/ExoPlayerPreferences.kt @@ -9,8 +9,10 @@ object ExoPlayerPreferences { const val KEY_PROGRESSIVE_LOAD_INTERVAL = "progressive_load_interval" const val KEY_USE_EXOPLAYER_DECODER_FALLBACK = "use_exoplayer_decoder_fallback_key" const val KEY_DISABLE_MEDIA_TUNNELING = "disable_media_tunneling_key" - const val KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY = "disabled_media_tunneling_automatically_key" - const val KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND = "always_use_exoplayer_set_output_surface_workaround_key" + const val KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY = + "disabled_media_tunneling_automatically_key" + const val KEY_ALWAYS_USE_SET_OUTPUT_SURFACE_WORKAROUND = + "always_use_exoplayer_set_output_surface_workaround_key" const val PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT = "exoplayer_default" @@ -23,5 +25,6 @@ object ExoPlayerPreferences { const val MEDIA_TUNNELING_USER_MANAGED = 0 const val MEDIA_TUNNELING_FLAG_UNSET = -1 - val PROGRESSIVE_LOAD_INTERVALS = listOf("1", "16", "64", "256", PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT) + val PROGRESSIVE_LOAD_INTERVALS = + listOf("1", "16", "64", "256", PROGRESSIVE_LOAD_INTERVAL_EXOPLAYER_DEFAULT) } diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt b/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt index 8ed1858d0..1f4750d0b 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/screen/ExoPlayerSettingsSections.kt @@ -39,9 +39,11 @@ import org.koin.compose.viewmodel.koinViewModel @Composable fun ExoPlayerSettingsSections(viewModel: PlayerSettingsViewModel = koinViewModel()) { val progressiveLoadInterval by viewModel.progressiveLoadInterval.collectAsStateWithLifecycle() - val useExoplayerDecoderFallback by viewModel.useExoplayerDecoderFallback.collectAsStateWithLifecycle() + val useExoplayerDecoderFallback by viewModel.useExoplayerDecoderFallback + .collectAsStateWithLifecycle() val disableMediaTunneling by viewModel.disableMediaTunneling.collectAsStateWithLifecycle() - val mediaTunnelingAutoDisabled by viewModel.mediaTunnelingAutoDisabled.collectAsStateWithLifecycle() + val mediaTunnelingAutoDisabled by viewModel.mediaTunnelingAutoDisabled + .collectAsStateWithLifecycle() val alwaysUseSetOutputSurfaceWorkaround by viewModel.alwaysUseSetOutputSurfaceWorkaround .collectAsStateWithLifecycle() @@ -54,7 +56,8 @@ fun ExoPlayerSettingsSections(viewModel: PlayerSettingsViewModel = koinViewModel onProgressiveLoadIntervalChange = viewModel::setProgressiveLoadInterval, onUseExoplayerDecoderFallbackChange = viewModel::setUseExoplayerDecoderFallback, onDisableMediaTunnelingChange = viewModel::setDisableMediaTunneling, - onAlwaysUseSetOutputSurfaceWorkaroundChange = viewModel::setAlwaysUseSetOutputSurfaceWorkaround + onAlwaysUseSetOutputSurfaceWorkaroundChange = + viewModel::setAlwaysUseSetOutputSurfaceWorkaround ) } @@ -70,7 +73,8 @@ fun ExoPlayerSettingsSectionsContent( onDisableMediaTunnelingChange: (Boolean) -> Unit = {}, onAlwaysUseSetOutputSurfaceWorkaroundChange: (Boolean) -> Unit = {} ) { - val exoPlayerDefaultLabel = stringResource(Res.string.progressive_load_interval_exoplayer_default) + val exoPlayerDefaultLabel = + stringResource(Res.string.progressive_load_interval_exoplayer_default) val loadIntervalEntries = PROGRESSIVE_LOAD_INTERVALS.map { value -> ListPreferenceEntry( @@ -88,7 +92,9 @@ fun ExoPlayerSettingsSectionsContent( val tunnelingBaseSummary = stringResource(Res.string.disable_media_tunneling_summary) val tunnelingSummary = if (mediaTunnelingAutoDisabled) { - tunnelingBaseSummary + " " + stringResource(Res.string.disable_media_tunneling_automatic_info) + tunnelingBaseSummary + " " + stringResource( + Res.string.disable_media_tunneling_automatic_info + ) } else { tunnelingBaseSummary } @@ -98,7 +104,10 @@ fun ExoPlayerSettingsSectionsContent( entries = loadIntervalEntries, selectedValue = progressiveLoadInterval, onValueSelected = onProgressiveLoadIntervalChange, - summary = stringResource(Res.string.progressive_load_interval_summary, selectedLoadIntervalTitle) + summary = stringResource( + Res.string.progressive_load_interval_summary, + selectedLoadIntervalTitle + ) ) SwitchPreference( title = stringResource(Res.string.use_exoplayer_decoder_fallback_title), @@ -114,7 +123,9 @@ fun ExoPlayerSettingsSectionsContent( ) SwitchPreference( title = stringResource(Res.string.always_use_exoplayer_set_output_surface_workaround_title), - summary = stringResource(Res.string.always_use_exoplayer_set_output_surface_workaround_summary), + summary = stringResource( + Res.string.always_use_exoplayer_set_output_surface_workaround_summary + ), checked = alwaysUseSetOutputSurfaceWorkaround, onCheckedChange = onAlwaysUseSetOutputSurfaceWorkaroundChange ) diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt b/shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt index ec48d7605..4a927b4e8 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/viewmodel/settings/PlayerSettingsViewModel.kt @@ -61,7 +61,10 @@ class PlayerSettingsViewModel(private val settings: Settings) : ViewModel() { fun setDisableMediaTunneling(value: Boolean) { disableMediaTunneling.persist(KEY_DISABLE_MEDIA_TUNNELING, value) if (!value) { - settings.putInt(KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY, MEDIA_TUNNELING_USER_MANAGED) + settings.putInt( + KEY_DISABLED_MEDIA_TUNNELING_AUTOMATICALLY, + MEDIA_TUNNELING_USER_MANAGED + ) mediaTunnelingAutoDisabled.value = false } } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt index 0b2497c7d..8e20ebbda 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/VideoAudioPreferences.kt @@ -129,9 +129,11 @@ object VideoAudioPreferences { /** Seek durations in milliseconds, stored as strings like the legacy app. */ val SEEK_DURATIONS_MS = listOf("5000", "10000", "15000", "20000", "25000", "30000") - fun resolutions(showHigher: Boolean): List = insertHighResolutions(BASE_RESOLUTIONS, showHigher) + fun resolutions(showHigher: Boolean): List = + insertHighResolutions(BASE_RESOLUTIONS, showHigher) - fun mobileDataResolutions(showHigher: Boolean): List = insertHighResolutions(BASE_MOBILE_DATA_RESOLUTIONS, showHigher) + fun mobileDataResolutions(showHigher: Boolean): List = + insertHighResolutions(BASE_MOBILE_DATA_RESOLUTIONS, showHigher) fun seekDurationSeconds(durationMs: String): Int = durationMs.toInt() / MILLIS_PER_SECOND @@ -141,7 +143,8 @@ object VideoAudioPreferences { else -> SEEK_DURATIONS_MS } /** - * The seek duration to switch to when [inexactSeek] hides the currently selected one or null when no adjustment is needed. + * The seek duration to switch to when [inexactSeek] hides the currently selected + * one, or null when no adjustment is needed. */ fun adjustedSeekDurationMs(currentMs: String, inexactSeek: Boolean): String? { if (!inexactSeek) return null diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt index e3cadd514..8385bce60 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt @@ -52,9 +52,13 @@ fun SettingsHomeScreen( icon = type.icon, onClick = { when (type) { - SettingsCategoryType.APPEARANCE -> navigator.navigateTo(Destination.AppearanceSettings) + SettingsCategoryType.APPEARANCE -> navigator.navigateTo( + Destination.AppearanceSettings + ) - SettingsCategoryType.VIDEO_AUDIO -> navigator.navigateTo(Destination.VideoAudioSettings) + SettingsCategoryType.VIDEO_AUDIO -> navigator.navigateTo( + Destination.VideoAudioSettings + ) // TODO: wire remaining sub-screens as they are migrated else -> Unit diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt index c910b6966..444afaa7b 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreen.kt @@ -35,6 +35,58 @@ import net.newpipe.app.navigation.Destination import net.newpipe.app.navigation.Navigator import net.newpipe.app.platform.PlayerSettingsSections import net.newpipe.app.preferences.VideoAudioPreferences +import net.newpipe.app.preferences.VideoAudioPreferences.AUDIO_FORMATS +import net.newpipe.app.preferences.VideoAudioPreferences.AUTOPLAY_ALWAYS +import net.newpipe.app.preferences.VideoAudioPreferences.AUTOPLAY_NEVER +import net.newpipe.app.preferences.VideoAudioPreferences.AUTOPLAY_WIFI +import net.newpipe.app.preferences.VideoAudioPreferences.BASE_MOBILE_DATA_RESOLUTIONS +import net.newpipe.app.preferences.VideoAudioPreferences.BASE_RESOLUTIONS +import net.newpipe.app.preferences.VideoAudioPreferences.BEST_RESOLUTION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_AUDIO_FORMAT +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_AUTOPLAY +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_AUTO_QUEUE +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_CLEAR_QUEUE_CONFIRMATION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_IGNORE_HARDWARE_MEDIA_BUTTONS +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_LEFT_GESTURE_CONTROL +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_LIMIT_MOBILE_DATA_USAGE +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_MINIMIZE_ON_EXIT +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_POPUP_REMEMBER_SIZE_POS +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_POPUP_RESOLUTION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_PREFERRED_OPEN_ACTION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_PREFER_DESCRIPTIVE_AUDIO +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_PREFER_ORIGINAL_AUDIO +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_RESOLUTION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_RESUME_ON_AUDIO_FOCUS_GAIN +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_RIGHT_GESTURE_CONTROL +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_SEEKBAR_PREVIEW_THUMBNAIL +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_SEEK_DURATION_MS +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_SHOW_HIGHER_RESOLUTIONS +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_SHOW_PLAY_WITH_KODI +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_START_MAIN_PLAYER_FULLSCREEN +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_USE_EXTERNAL_AUDIO_PLAYER +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_USE_EXTERNAL_VIDEO_PLAYER +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_USE_INEXACT_SEEK +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_VIDEO_FORMAT +import net.newpipe.app.preferences.VideoAudioPreferences.GESTURE_BRIGHTNESS +import net.newpipe.app.preferences.VideoAudioPreferences.GESTURE_NONE +import net.newpipe.app.preferences.VideoAudioPreferences.GESTURE_VOLUME +import net.newpipe.app.preferences.VideoAudioPreferences.LIMIT_DATA_USAGE_NONE +import net.newpipe.app.preferences.VideoAudioPreferences.MINIMIZE_ON_EXIT_BACKGROUND +import net.newpipe.app.preferences.VideoAudioPreferences.MINIMIZE_ON_EXIT_NONE +import net.newpipe.app.preferences.VideoAudioPreferences.MINIMIZE_ON_EXIT_POPUP +import net.newpipe.app.preferences.VideoAudioPreferences.OPEN_ACTION_ADD_TO_PLAYLIST +import net.newpipe.app.preferences.VideoAudioPreferences.OPEN_ACTION_ALWAYS_ASK +import net.newpipe.app.preferences.VideoAudioPreferences.OPEN_ACTION_BACKGROUND_PLAYER +import net.newpipe.app.preferences.VideoAudioPreferences.OPEN_ACTION_DOWNLOAD +import net.newpipe.app.preferences.VideoAudioPreferences.OPEN_ACTION_ENQUEUE +import net.newpipe.app.preferences.VideoAudioPreferences.OPEN_ACTION_POPUP_PLAYER +import net.newpipe.app.preferences.VideoAudioPreferences.OPEN_ACTION_SHOW_INFO +import net.newpipe.app.preferences.VideoAudioPreferences.OPEN_ACTION_VIDEO_PLAYER +import net.newpipe.app.preferences.VideoAudioPreferences.SEEKBAR_THUMBNAIL_HIGH_QUALITY +import net.newpipe.app.preferences.VideoAudioPreferences.SEEKBAR_THUMBNAIL_LOW_QUALITY +import net.newpipe.app.preferences.VideoAudioPreferences.SEEKBAR_THUMBNAIL_NONE +import net.newpipe.app.preferences.VideoAudioPreferences.SEEK_DURATIONS_MS +import net.newpipe.app.preferences.VideoAudioPreferences.VIDEO_FORMATS import net.newpipe.app.preview.ThemePreviewProvider import net.newpipe.app.viewmodel.settings.VideoAudioSettingsViewModel import newpipe.shared.generated.resources.Res @@ -135,7 +187,8 @@ fun VideoAudioSettingsScreen( val seekbarPreviewThumbnail by viewModel.seekbarPreviewThumbnail.collectAsStateWithLifecycle() val preferredOpenAction by viewModel.preferredOpenAction.collectAsStateWithLifecycle() val minimizeOnExit by viewModel.minimizeOnExit.collectAsStateWithLifecycle() - val startMainPlayerFullscreen by viewModel.startMainPlayerFullscreen.collectAsStateWithLifecycle() + val startMainPlayerFullscreen by viewModel.startMainPlayerFullscreen + .collectAsStateWithLifecycle() val autoplay by viewModel.autoplay.collectAsStateWithLifecycle() val autoQueue by viewModel.autoQueue.collectAsStateWithLifecycle() val resumeOnAudioFocusGain by viewModel.resumeOnAudioFocusGain.collectAsStateWithLifecycle() @@ -145,7 +198,8 @@ fun VideoAudioSettingsScreen( val useInexactSeek by viewModel.useInexactSeek.collectAsStateWithLifecycle() val seekDuration by viewModel.seekDuration.collectAsStateWithLifecycle() val clearQueueConfirmation by viewModel.clearQueueConfirmation.collectAsStateWithLifecycle() - val ignoreHardwareMediaButtons by viewModel.ignoreHardwareMediaButtons.collectAsStateWithLifecycle() + val ignoreHardwareMediaButtons by viewModel.ignoreHardwareMediaButtons + .collectAsStateWithLifecycle() val playerSettingsAvailable = remember { playerSettings.isAvailable } // Option lists are pure functions of their toggles, so derive them instead of storing them. @@ -221,34 +275,34 @@ fun VideoAudioSettingsScreen( @Composable fun VideoAudioSettingsScreenContent( - defaultResolution: String = VideoAudioPreferences.DEFAULT_RESOLUTION, - defaultPopupResolution: String = VideoAudioPreferences.DEFAULT_POPUP_RESOLUTION, - mobileDataResolution: String = VideoAudioPreferences.DEFAULT_LIMIT_MOBILE_DATA_USAGE, - showHigherResolutions: Boolean = VideoAudioPreferences.DEFAULT_SHOW_HIGHER_RESOLUTIONS, - resolutionValues: List = VideoAudioPreferences.BASE_RESOLUTIONS, - mobileDataResolutionValues: List = VideoAudioPreferences.BASE_MOBILE_DATA_RESOLUTIONS, - videoFormat: String = VideoAudioPreferences.DEFAULT_VIDEO_FORMAT, - audioFormat: String = VideoAudioPreferences.DEFAULT_AUDIO_FORMAT, - preferOriginalAudio: Boolean = VideoAudioPreferences.DEFAULT_PREFER_ORIGINAL_AUDIO, - preferDescriptiveAudio: Boolean = VideoAudioPreferences.DEFAULT_PREFER_DESCRIPTIVE_AUDIO, - useExternalVideoPlayer: Boolean = VideoAudioPreferences.DEFAULT_USE_EXTERNAL_VIDEO_PLAYER, - useExternalAudioPlayer: Boolean = VideoAudioPreferences.DEFAULT_USE_EXTERNAL_AUDIO_PLAYER, - showPlayWithKodi: Boolean = VideoAudioPreferences.DEFAULT_SHOW_PLAY_WITH_KODI, - seekbarPreviewThumbnail: String = VideoAudioPreferences.DEFAULT_SEEKBAR_PREVIEW_THUMBNAIL, - preferredOpenAction: String = VideoAudioPreferences.DEFAULT_PREFERRED_OPEN_ACTION, - minimizeOnExit: String = VideoAudioPreferences.DEFAULT_MINIMIZE_ON_EXIT, - startMainPlayerFullscreen: Boolean = VideoAudioPreferences.DEFAULT_START_MAIN_PLAYER_FULLSCREEN, - autoplay: String = VideoAudioPreferences.DEFAULT_AUTOPLAY, - autoQueue: Boolean = VideoAudioPreferences.DEFAULT_AUTO_QUEUE, - resumeOnAudioFocusGain: Boolean = VideoAudioPreferences.DEFAULT_RESUME_ON_AUDIO_FOCUS_GAIN, - leftGestureControl: String = VideoAudioPreferences.DEFAULT_LEFT_GESTURE_CONTROL, - rightGestureControl: String = VideoAudioPreferences.DEFAULT_RIGHT_GESTURE_CONTROL, - popupRememberSizePos: Boolean = VideoAudioPreferences.DEFAULT_POPUP_REMEMBER_SIZE_POS, - useInexactSeek: Boolean = VideoAudioPreferences.DEFAULT_USE_INEXACT_SEEK, - seekDuration: String = VideoAudioPreferences.DEFAULT_SEEK_DURATION_MS, - seekDurationValues: List = VideoAudioPreferences.SEEK_DURATIONS_MS, - clearQueueConfirmation: Boolean = VideoAudioPreferences.DEFAULT_CLEAR_QUEUE_CONFIRMATION, - ignoreHardwareMediaButtons: Boolean = VideoAudioPreferences.DEFAULT_IGNORE_HARDWARE_MEDIA_BUTTONS, + defaultResolution: String = DEFAULT_RESOLUTION, + defaultPopupResolution: String = DEFAULT_POPUP_RESOLUTION, + mobileDataResolution: String = DEFAULT_LIMIT_MOBILE_DATA_USAGE, + showHigherResolutions: Boolean = DEFAULT_SHOW_HIGHER_RESOLUTIONS, + resolutionValues: List = BASE_RESOLUTIONS, + mobileDataResolutionValues: List = BASE_MOBILE_DATA_RESOLUTIONS, + videoFormat: String = DEFAULT_VIDEO_FORMAT, + audioFormat: String = DEFAULT_AUDIO_FORMAT, + preferOriginalAudio: Boolean = DEFAULT_PREFER_ORIGINAL_AUDIO, + preferDescriptiveAudio: Boolean = DEFAULT_PREFER_DESCRIPTIVE_AUDIO, + useExternalVideoPlayer: Boolean = DEFAULT_USE_EXTERNAL_VIDEO_PLAYER, + useExternalAudioPlayer: Boolean = DEFAULT_USE_EXTERNAL_AUDIO_PLAYER, + showPlayWithKodi: Boolean = DEFAULT_SHOW_PLAY_WITH_KODI, + seekbarPreviewThumbnail: String = DEFAULT_SEEKBAR_PREVIEW_THUMBNAIL, + preferredOpenAction: String = DEFAULT_PREFERRED_OPEN_ACTION, + minimizeOnExit: String = DEFAULT_MINIMIZE_ON_EXIT, + startMainPlayerFullscreen: Boolean = DEFAULT_START_MAIN_PLAYER_FULLSCREEN, + autoplay: String = DEFAULT_AUTOPLAY, + autoQueue: Boolean = DEFAULT_AUTO_QUEUE, + resumeOnAudioFocusGain: Boolean = DEFAULT_RESUME_ON_AUDIO_FOCUS_GAIN, + leftGestureControl: String = DEFAULT_LEFT_GESTURE_CONTROL, + rightGestureControl: String = DEFAULT_RIGHT_GESTURE_CONTROL, + popupRememberSizePos: Boolean = DEFAULT_POPUP_REMEMBER_SIZE_POS, + useInexactSeek: Boolean = DEFAULT_USE_INEXACT_SEEK, + seekDuration: String = DEFAULT_SEEK_DURATION_MS, + seekDurationValues: List = SEEK_DURATIONS_MS, + clearQueueConfirmation: Boolean = DEFAULT_CLEAR_QUEUE_CONFIRMATION, + ignoreHardwareMediaButtons: Boolean = DEFAULT_IGNORE_HARDWARE_MEDIA_BUTTONS, onDefaultResolutionChange: (String) -> Unit = {}, onDefaultPopupResolutionChange: (String) -> Unit = {}, onMobileDataResolutionChange: (String) -> Unit = {}, @@ -286,53 +340,78 @@ fun VideoAudioSettingsScreenContent( fun resolutionEntry(value: String) = ListPreferenceEntry( value = value, - title = if (value == VideoAudioPreferences.BEST_RESOLUTION) bestResolutionLabel else value + title = if (value == BEST_RESOLUTION) bestResolutionLabel else value ) fun mobileDataEntry(value: String) = ListPreferenceEntry( value = value, - title = if (value == VideoAudioPreferences.LIMIT_DATA_USAGE_NONE) noLimitLabel else value + title = if (value == LIMIT_DATA_USAGE_NONE) noLimitLabel else value ) - fun selectedTitle(entries: List, value: String) = entries.firstOrNull { it.value == value }?.title.orEmpty() + fun selectedTitle(entries: List, value: String) = + entries.firstOrNull { it.value == value }?.title.orEmpty() val resolutionEntries = resolutionValues.map(::resolutionEntry) val mobileDataEntries = mobileDataResolutionValues.map(::mobileDataEntry) - val videoFormatEntries = VideoAudioPreferences.VIDEO_FORMATS.map { (value, label) -> + val videoFormatEntries = VIDEO_FORMATS.map { (value, label) -> ListPreferenceEntry(value, label) } - val audioFormatEntries = VideoAudioPreferences.AUDIO_FORMATS.map { (value, label) -> + val audioFormatEntries = AUDIO_FORMATS.map { (value, label) -> ListPreferenceEntry(value, label) } val seekbarThumbnailEntries = listOf( - ListPreferenceEntry(VideoAudioPreferences.SEEKBAR_THUMBNAIL_HIGH_QUALITY, stringResource(Res.string.high_quality_larger)), - ListPreferenceEntry(VideoAudioPreferences.SEEKBAR_THUMBNAIL_LOW_QUALITY, stringResource(Res.string.low_quality_smaller)), - ListPreferenceEntry(VideoAudioPreferences.SEEKBAR_THUMBNAIL_NONE, stringResource(Res.string.dont_show)) + ListPreferenceEntry( + SEEKBAR_THUMBNAIL_HIGH_QUALITY, + stringResource(Res.string.high_quality_larger) + ), + ListPreferenceEntry( + SEEKBAR_THUMBNAIL_LOW_QUALITY, + stringResource(Res.string.low_quality_smaller) + ), + ListPreferenceEntry(SEEKBAR_THUMBNAIL_NONE, stringResource(Res.string.dont_show)) ) val openActionEntries = listOf( - ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_SHOW_INFO, stringResource(Res.string.show_info)), - ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_VIDEO_PLAYER, stringResource(Res.string.video_player)), - ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_BACKGROUND_PLAYER, stringResource(Res.string.background_player)), - ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_POPUP_PLAYER, stringResource(Res.string.popup_player)), - ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_DOWNLOAD, stringResource(Res.string.download)), - ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_ADD_TO_PLAYLIST, stringResource(Res.string.add_to_playlist)), - ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_ENQUEUE, stringResource(Res.string.enqueue_stream)), - ListPreferenceEntry(VideoAudioPreferences.OPEN_ACTION_ALWAYS_ASK, stringResource(Res.string.always_ask_open_action)) + ListPreferenceEntry(OPEN_ACTION_SHOW_INFO, stringResource(Res.string.show_info)), + ListPreferenceEntry(OPEN_ACTION_VIDEO_PLAYER, stringResource(Res.string.video_player)), + ListPreferenceEntry( + OPEN_ACTION_BACKGROUND_PLAYER, + stringResource(Res.string.background_player) + ), + ListPreferenceEntry(OPEN_ACTION_POPUP_PLAYER, stringResource(Res.string.popup_player)), + ListPreferenceEntry(OPEN_ACTION_DOWNLOAD, stringResource(Res.string.download)), + ListPreferenceEntry( + OPEN_ACTION_ADD_TO_PLAYLIST, + stringResource(Res.string.add_to_playlist) + ), + ListPreferenceEntry(OPEN_ACTION_ENQUEUE, stringResource(Res.string.enqueue_stream)), + ListPreferenceEntry( + OPEN_ACTION_ALWAYS_ASK, + stringResource(Res.string.always_ask_open_action) + ) ) val minimizeOnExitEntries = listOf( - ListPreferenceEntry(VideoAudioPreferences.MINIMIZE_ON_EXIT_NONE, stringResource(Res.string.minimize_on_exit_none_description)), - ListPreferenceEntry(VideoAudioPreferences.MINIMIZE_ON_EXIT_BACKGROUND, stringResource(Res.string.minimize_on_exit_background_description)), - ListPreferenceEntry(VideoAudioPreferences.MINIMIZE_ON_EXIT_POPUP, stringResource(Res.string.minimize_on_exit_popup_description)) + ListPreferenceEntry( + MINIMIZE_ON_EXIT_NONE, + stringResource(Res.string.minimize_on_exit_none_description) + ), + ListPreferenceEntry( + MINIMIZE_ON_EXIT_BACKGROUND, + stringResource(Res.string.minimize_on_exit_background_description) + ), + ListPreferenceEntry( + MINIMIZE_ON_EXIT_POPUP, + stringResource(Res.string.minimize_on_exit_popup_description) + ) ) val autoplayEntries = listOf( - ListPreferenceEntry(VideoAudioPreferences.AUTOPLAY_ALWAYS, stringResource(Res.string.always)), - ListPreferenceEntry(VideoAudioPreferences.AUTOPLAY_WIFI, stringResource(Res.string.wifi_only)), - ListPreferenceEntry(VideoAudioPreferences.AUTOPLAY_NEVER, stringResource(Res.string.never)) + ListPreferenceEntry(AUTOPLAY_ALWAYS, stringResource(Res.string.always)), + ListPreferenceEntry(AUTOPLAY_WIFI, stringResource(Res.string.wifi_only)), + ListPreferenceEntry(AUTOPLAY_NEVER, stringResource(Res.string.never)) ) val gestureEntries = listOf( - ListPreferenceEntry(VideoAudioPreferences.GESTURE_BRIGHTNESS, stringResource(Res.string.brightness)), - ListPreferenceEntry(VideoAudioPreferences.GESTURE_VOLUME, stringResource(Res.string.volume)), - ListPreferenceEntry(VideoAudioPreferences.GESTURE_NONE, stringResource(Res.string.none)) + ListPreferenceEntry(GESTURE_BRIGHTNESS, stringResource(Res.string.brightness)), + ListPreferenceEntry(GESTURE_VOLUME, stringResource(Res.string.volume)), + ListPreferenceEntry(GESTURE_NONE, stringResource(Res.string.none)) ) val seekDurationEntries = seekDurationValues.map { value -> val seconds = VideoAudioPreferences.seekDurationSeconds(value) @@ -412,7 +491,9 @@ fun VideoAudioSettingsScreenContent( ) } - PreferenceCategoryTitle(title = stringResource(Res.string.settings_category_player_title)) + PreferenceCategoryTitle( + title = stringResource(Res.string.settings_category_player_title) + ) SwitchPreference( title = stringResource(Res.string.use_external_video_player_title), summary = stringResource(Res.string.use_external_video_player_summary), @@ -437,7 +518,9 @@ fun VideoAudioSettingsScreenContent( onValueSelected = onSeekbarPreviewThumbnailChange ) - PreferenceCategoryTitle(title = stringResource(Res.string.settings_category_player_behavior_title)) + PreferenceCategoryTitle( + title = stringResource(Res.string.settings_category_player_behavior_title) + ) ListPreference( title = stringResource(Res.string.preferred_open_action_settings_title), entries = openActionEntries, @@ -514,10 +597,13 @@ fun VideoAudioSettingsScreenContent( summary = stringResource(Res.string.use_inexact_seek_summary), checked = useInexactSeek, onCheckedChange = { checked -> - VideoAudioPreferences.adjustedSeekDurationMs(seekDuration, checked)?.let { adjustedMs -> + VideoAudioPreferences.adjustedSeekDurationMs(seekDuration, checked) + ?.let { adjustedMs -> val newSeconds = VideoAudioPreferences.seekDurationSeconds(adjustedMs) scope.launch { - snackbarHostState.showSnackbar(getString(Res.string.new_seek_duration_toast, newSeconds)) + snackbarHostState.showSnackbar( + getString(Res.string.new_seek_duration_toast, newSeconds) + ) } } onUseInexactSeekChange(checked) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt index 49b67ad80..bba84d596 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/VideoAudioSettingsViewModel.kt @@ -10,161 +10,239 @@ import com.russhwolf.settings.Settings import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import net.newpipe.app.preferences.VideoAudioPreferences +import net.newpipe.app.preferences.VideoAudioPreferences.BEST_RESOLUTION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_AUDIO_FORMAT +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_AUTOPLAY +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_AUTO_QUEUE +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_CLEAR_QUEUE_CONFIRMATION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_IGNORE_HARDWARE_MEDIA_BUTTONS +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_LEFT_GESTURE_CONTROL +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_LIMIT_MOBILE_DATA_USAGE +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_MINIMIZE_ON_EXIT +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_POPUP_REMEMBER_SIZE_POS +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_POPUP_RESOLUTION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_PREFERRED_OPEN_ACTION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_PREFER_DESCRIPTIVE_AUDIO +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_PREFER_ORIGINAL_AUDIO +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_RESOLUTION +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_RESUME_ON_AUDIO_FOCUS_GAIN +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_RIGHT_GESTURE_CONTROL +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_SEEKBAR_PREVIEW_THUMBNAIL +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_SEEK_DURATION_MS +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_SHOW_HIGHER_RESOLUTIONS +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_SHOW_PLAY_WITH_KODI +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_START_MAIN_PLAYER_FULLSCREEN +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_USE_EXTERNAL_AUDIO_PLAYER +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_USE_EXTERNAL_VIDEO_PLAYER +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_USE_INEXACT_SEEK +import net.newpipe.app.preferences.VideoAudioPreferences.DEFAULT_VIDEO_FORMAT +import net.newpipe.app.preferences.VideoAudioPreferences.HIGH_RESOLUTIONS +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_AUTOPLAY +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_AUTO_QUEUE +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_CLEAR_QUEUE_CONFIRMATION +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_DEFAULT_AUDIO_FORMAT +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_DEFAULT_POPUP_RESOLUTION +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_DEFAULT_RESOLUTION +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_DEFAULT_VIDEO_FORMAT +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_IGNORE_HARDWARE_MEDIA_BUTTONS +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_LEFT_GESTURE_CONTROL +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_LIMIT_MOBILE_DATA_USAGE +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_MINIMIZE_ON_EXIT +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_POPUP_REMEMBER_SIZE_POS +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_PREFERRED_OPEN_ACTION +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_PREFER_DESCRIPTIVE_AUDIO +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_PREFER_ORIGINAL_AUDIO +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_RESUME_ON_AUDIO_FOCUS_GAIN +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_RIGHT_GESTURE_CONTROL +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_SEEKBAR_PREVIEW_THUMBNAIL +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_SEEK_DURATION +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_SHOW_PLAY_WITH_KODI +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_START_MAIN_PLAYER_FULLSCREEN +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_USE_EXTERNAL_AUDIO_PLAYER +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_USE_EXTERNAL_VIDEO_PLAYER +import net.newpipe.app.preferences.VideoAudioPreferences.KEY_USE_INEXACT_SEEK +import net.newpipe.app.preferences.VideoAudioPreferences.LIMIT_DATA_USAGE_NONE import org.koin.core.annotation.KoinViewModel @KoinViewModel class VideoAudioSettingsViewModel(private val settings: Settings) : ViewModel() { val defaultResolution: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_DEFAULT_RESOLUTION, VideoAudioPreferences.DEFAULT_RESOLUTION) + field = stringFlow(KEY_DEFAULT_RESOLUTION, DEFAULT_RESOLUTION) val defaultPopupResolution: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_DEFAULT_POPUP_RESOLUTION, VideoAudioPreferences.DEFAULT_POPUP_RESOLUTION) + field = stringFlow(KEY_DEFAULT_POPUP_RESOLUTION, DEFAULT_POPUP_RESOLUTION) val mobileDataResolution: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_LIMIT_MOBILE_DATA_USAGE, VideoAudioPreferences.DEFAULT_LIMIT_MOBILE_DATA_USAGE) + field = stringFlow(KEY_LIMIT_MOBILE_DATA_USAGE, DEFAULT_LIMIT_MOBILE_DATA_USAGE) val showHigherResolutions: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS, VideoAudioPreferences.DEFAULT_SHOW_HIGHER_RESOLUTIONS) + field = booleanFlow(KEY_SHOW_HIGHER_RESOLUTIONS, DEFAULT_SHOW_HIGHER_RESOLUTIONS) val videoFormat: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_DEFAULT_VIDEO_FORMAT, VideoAudioPreferences.DEFAULT_VIDEO_FORMAT) + field = stringFlow(KEY_DEFAULT_VIDEO_FORMAT, DEFAULT_VIDEO_FORMAT) val audioFormat: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_DEFAULT_AUDIO_FORMAT, VideoAudioPreferences.DEFAULT_AUDIO_FORMAT) + field = stringFlow(KEY_DEFAULT_AUDIO_FORMAT, DEFAULT_AUDIO_FORMAT) val preferOriginalAudio: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_PREFER_ORIGINAL_AUDIO, VideoAudioPreferences.DEFAULT_PREFER_ORIGINAL_AUDIO) + field = booleanFlow(KEY_PREFER_ORIGINAL_AUDIO, DEFAULT_PREFER_ORIGINAL_AUDIO) val preferDescriptiveAudio: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_PREFER_DESCRIPTIVE_AUDIO, VideoAudioPreferences.DEFAULT_PREFER_DESCRIPTIVE_AUDIO) + field = booleanFlow(KEY_PREFER_DESCRIPTIVE_AUDIO, DEFAULT_PREFER_DESCRIPTIVE_AUDIO) val useExternalVideoPlayer: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_USE_EXTERNAL_VIDEO_PLAYER, VideoAudioPreferences.DEFAULT_USE_EXTERNAL_VIDEO_PLAYER) + field = booleanFlow(KEY_USE_EXTERNAL_VIDEO_PLAYER, DEFAULT_USE_EXTERNAL_VIDEO_PLAYER) val useExternalAudioPlayer: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_USE_EXTERNAL_AUDIO_PLAYER, VideoAudioPreferences.DEFAULT_USE_EXTERNAL_AUDIO_PLAYER) + field = booleanFlow(KEY_USE_EXTERNAL_AUDIO_PLAYER, DEFAULT_USE_EXTERNAL_AUDIO_PLAYER) val showPlayWithKodi: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_SHOW_PLAY_WITH_KODI, VideoAudioPreferences.DEFAULT_SHOW_PLAY_WITH_KODI) + field = booleanFlow(KEY_SHOW_PLAY_WITH_KODI, DEFAULT_SHOW_PLAY_WITH_KODI) val seekbarPreviewThumbnail: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_SEEKBAR_PREVIEW_THUMBNAIL, VideoAudioPreferences.DEFAULT_SEEKBAR_PREVIEW_THUMBNAIL) + field = stringFlow(KEY_SEEKBAR_PREVIEW_THUMBNAIL, DEFAULT_SEEKBAR_PREVIEW_THUMBNAIL) val preferredOpenAction: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_PREFERRED_OPEN_ACTION, VideoAudioPreferences.DEFAULT_PREFERRED_OPEN_ACTION) + field = stringFlow(KEY_PREFERRED_OPEN_ACTION, DEFAULT_PREFERRED_OPEN_ACTION) val minimizeOnExit: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_MINIMIZE_ON_EXIT, VideoAudioPreferences.DEFAULT_MINIMIZE_ON_EXIT) + field = stringFlow(KEY_MINIMIZE_ON_EXIT, DEFAULT_MINIMIZE_ON_EXIT) val startMainPlayerFullscreen: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_START_MAIN_PLAYER_FULLSCREEN, VideoAudioPreferences.DEFAULT_START_MAIN_PLAYER_FULLSCREEN) + field = booleanFlow(KEY_START_MAIN_PLAYER_FULLSCREEN, DEFAULT_START_MAIN_PLAYER_FULLSCREEN) val autoplay: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_AUTOPLAY, VideoAudioPreferences.DEFAULT_AUTOPLAY) + field = stringFlow(KEY_AUTOPLAY, DEFAULT_AUTOPLAY) val autoQueue: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_AUTO_QUEUE, VideoAudioPreferences.DEFAULT_AUTO_QUEUE) + field = booleanFlow(KEY_AUTO_QUEUE, DEFAULT_AUTO_QUEUE) val resumeOnAudioFocusGain: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_RESUME_ON_AUDIO_FOCUS_GAIN, VideoAudioPreferences.DEFAULT_RESUME_ON_AUDIO_FOCUS_GAIN) + field = booleanFlow(KEY_RESUME_ON_AUDIO_FOCUS_GAIN, DEFAULT_RESUME_ON_AUDIO_FOCUS_GAIN) val leftGestureControl: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_LEFT_GESTURE_CONTROL, VideoAudioPreferences.DEFAULT_LEFT_GESTURE_CONTROL) + field = stringFlow(KEY_LEFT_GESTURE_CONTROL, DEFAULT_LEFT_GESTURE_CONTROL) val rightGestureControl: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_RIGHT_GESTURE_CONTROL, VideoAudioPreferences.DEFAULT_RIGHT_GESTURE_CONTROL) + field = stringFlow(KEY_RIGHT_GESTURE_CONTROL, DEFAULT_RIGHT_GESTURE_CONTROL) val popupRememberSizePos: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_POPUP_REMEMBER_SIZE_POS, VideoAudioPreferences.DEFAULT_POPUP_REMEMBER_SIZE_POS) + field = booleanFlow(KEY_POPUP_REMEMBER_SIZE_POS, DEFAULT_POPUP_REMEMBER_SIZE_POS) val useInexactSeek: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_USE_INEXACT_SEEK, VideoAudioPreferences.DEFAULT_USE_INEXACT_SEEK) + field = booleanFlow(KEY_USE_INEXACT_SEEK, DEFAULT_USE_INEXACT_SEEK) val seekDuration: StateFlow - field = stringFlow(VideoAudioPreferences.KEY_SEEK_DURATION, VideoAudioPreferences.DEFAULT_SEEK_DURATION_MS) + field = stringFlow(KEY_SEEK_DURATION, DEFAULT_SEEK_DURATION_MS) val clearQueueConfirmation: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_CLEAR_QUEUE_CONFIRMATION, VideoAudioPreferences.DEFAULT_CLEAR_QUEUE_CONFIRMATION) + field = booleanFlow(KEY_CLEAR_QUEUE_CONFIRMATION, DEFAULT_CLEAR_QUEUE_CONFIRMATION) val ignoreHardwareMediaButtons: StateFlow - field = booleanFlow(VideoAudioPreferences.KEY_IGNORE_HARDWARE_MEDIA_BUTTONS, VideoAudioPreferences.DEFAULT_IGNORE_HARDWARE_MEDIA_BUTTONS) + field = booleanFlow( + KEY_IGNORE_HARDWARE_MEDIA_BUTTONS, + DEFAULT_IGNORE_HARDWARE_MEDIA_BUTTONS + ) - fun setDefaultResolution(value: String) = defaultResolution.persist(VideoAudioPreferences.KEY_DEFAULT_RESOLUTION, value) + fun setDefaultResolution(value: String) = + defaultResolution.persist(KEY_DEFAULT_RESOLUTION, value) - fun setDefaultPopupResolution(value: String) = defaultPopupResolution.persist(VideoAudioPreferences.KEY_DEFAULT_POPUP_RESOLUTION, value) + fun setDefaultPopupResolution(value: String) = + defaultPopupResolution.persist(KEY_DEFAULT_POPUP_RESOLUTION, value) - fun setMobileDataResolution(value: String) = mobileDataResolution.persist(VideoAudioPreferences.KEY_LIMIT_MOBILE_DATA_USAGE, value) + fun setMobileDataResolution(value: String) = + mobileDataResolution.persist(KEY_LIMIT_MOBILE_DATA_USAGE, value) fun setShowHigherResolutions(value: Boolean) { - showHigherResolutions.persist(VideoAudioPreferences.KEY_SHOW_HIGHER_RESOLUTIONS, value) + showHigherResolutions.persist(KEY_SHOW_HIGHER_RESOLUTIONS, value) if (!value) { - if (defaultResolution.value in VideoAudioPreferences.HIGH_RESOLUTIONS) { - setDefaultResolution(VideoAudioPreferences.BEST_RESOLUTION) + if (defaultResolution.value in HIGH_RESOLUTIONS) { + setDefaultResolution(BEST_RESOLUTION) } - if (defaultPopupResolution.value in VideoAudioPreferences.HIGH_RESOLUTIONS) { - setDefaultPopupResolution(VideoAudioPreferences.BEST_RESOLUTION) + if (defaultPopupResolution.value in HIGH_RESOLUTIONS) { + setDefaultPopupResolution(BEST_RESOLUTION) } - if (mobileDataResolution.value in VideoAudioPreferences.HIGH_RESOLUTIONS) { - setMobileDataResolution(VideoAudioPreferences.LIMIT_DATA_USAGE_NONE) + if (mobileDataResolution.value in HIGH_RESOLUTIONS) { + setMobileDataResolution(LIMIT_DATA_USAGE_NONE) } } } - fun setVideoFormat(value: String) = videoFormat.persist(VideoAudioPreferences.KEY_DEFAULT_VIDEO_FORMAT, value) + fun setVideoFormat(value: String) = videoFormat.persist(KEY_DEFAULT_VIDEO_FORMAT, value) - fun setAudioFormat(value: String) = audioFormat.persist(VideoAudioPreferences.KEY_DEFAULT_AUDIO_FORMAT, value) + fun setAudioFormat(value: String) = audioFormat.persist(KEY_DEFAULT_AUDIO_FORMAT, value) - fun setPreferOriginalAudio(value: Boolean) = preferOriginalAudio.persist(VideoAudioPreferences.KEY_PREFER_ORIGINAL_AUDIO, value) + fun setPreferOriginalAudio(value: Boolean) = preferOriginalAudio + .persist(KEY_PREFER_ORIGINAL_AUDIO, value) - fun setPreferDescriptiveAudio(value: Boolean) = preferDescriptiveAudio.persist(VideoAudioPreferences.KEY_PREFER_DESCRIPTIVE_AUDIO, value) + fun setPreferDescriptiveAudio(value: Boolean) = preferDescriptiveAudio + .persist(KEY_PREFER_DESCRIPTIVE_AUDIO, value) - fun setUseExternalVideoPlayer(value: Boolean) = useExternalVideoPlayer.persist(VideoAudioPreferences.KEY_USE_EXTERNAL_VIDEO_PLAYER, value) + fun setUseExternalVideoPlayer(value: Boolean) = useExternalVideoPlayer + .persist(KEY_USE_EXTERNAL_VIDEO_PLAYER, value) - fun setUseExternalAudioPlayer(value: Boolean) = useExternalAudioPlayer.persist(VideoAudioPreferences.KEY_USE_EXTERNAL_AUDIO_PLAYER, value) + fun setUseExternalAudioPlayer(value: Boolean) = useExternalAudioPlayer + .persist(KEY_USE_EXTERNAL_AUDIO_PLAYER, value) - fun setShowPlayWithKodi(value: Boolean) = showPlayWithKodi.persist(VideoAudioPreferences.KEY_SHOW_PLAY_WITH_KODI, value) + fun setShowPlayWithKodi(value: Boolean) = showPlayWithKodi + .persist(KEY_SHOW_PLAY_WITH_KODI, value) - fun setSeekbarPreviewThumbnail(value: String) = seekbarPreviewThumbnail.persist(VideoAudioPreferences.KEY_SEEKBAR_PREVIEW_THUMBNAIL, value) + fun setSeekbarPreviewThumbnail(value: String) = seekbarPreviewThumbnail + .persist(KEY_SEEKBAR_PREVIEW_THUMBNAIL, value) - fun setPreferredOpenAction(value: String) = preferredOpenAction.persist(VideoAudioPreferences.KEY_PREFERRED_OPEN_ACTION, value) + fun setPreferredOpenAction(value: String) = preferredOpenAction + .persist(KEY_PREFERRED_OPEN_ACTION, value) - fun setMinimizeOnExit(value: String) = minimizeOnExit.persist(VideoAudioPreferences.KEY_MINIMIZE_ON_EXIT, value) + fun setMinimizeOnExit(value: String) = minimizeOnExit + .persist(KEY_MINIMIZE_ON_EXIT, value) - fun setStartMainPlayerFullscreen(value: Boolean) = startMainPlayerFullscreen.persist(VideoAudioPreferences.KEY_START_MAIN_PLAYER_FULLSCREEN, value) + fun setStartMainPlayerFullscreen(value: Boolean) = startMainPlayerFullscreen + .persist(KEY_START_MAIN_PLAYER_FULLSCREEN, value) - fun setAutoplay(value: String) = autoplay.persist(VideoAudioPreferences.KEY_AUTOPLAY, value) + fun setAutoplay(value: String) = autoplay.persist(KEY_AUTOPLAY, value) - fun setAutoQueue(value: Boolean) = autoQueue.persist(VideoAudioPreferences.KEY_AUTO_QUEUE, value) + fun setAutoQueue(value: Boolean) = autoQueue.persist(KEY_AUTO_QUEUE, value) - fun setResumeOnAudioFocusGain(value: Boolean) = resumeOnAudioFocusGain.persist(VideoAudioPreferences.KEY_RESUME_ON_AUDIO_FOCUS_GAIN, value) + fun setResumeOnAudioFocusGain(value: Boolean) = resumeOnAudioFocusGain + .persist(KEY_RESUME_ON_AUDIO_FOCUS_GAIN, value) - fun setLeftGestureControl(value: String) = leftGestureControl.persist(VideoAudioPreferences.KEY_LEFT_GESTURE_CONTROL, value) + fun setLeftGestureControl(value: String) = leftGestureControl + .persist(KEY_LEFT_GESTURE_CONTROL, value) - fun setRightGestureControl(value: String) = rightGestureControl.persist(VideoAudioPreferences.KEY_RIGHT_GESTURE_CONTROL, value) + fun setRightGestureControl(value: String) = rightGestureControl + .persist(KEY_RIGHT_GESTURE_CONTROL, value) - fun setPopupRememberSizePos(value: Boolean) = popupRememberSizePos.persist(VideoAudioPreferences.KEY_POPUP_REMEMBER_SIZE_POS, value) + fun setPopupRememberSizePos(value: Boolean) = popupRememberSizePos + .persist(KEY_POPUP_REMEMBER_SIZE_POS, value) /** * Enabling inexact seek hides 5-second-step durations. If the current selection becomes - * hidden it is bumped by 5 seconds, matching the legacy screen (which also showed a toast; - * the screen shows a snackbar based on the same [VideoAudioPreferences.adjustedSeekDurationMs]). + * hidden it is bumped by 5 seconds, matching the legacy screen (which also showed a + * toast; the screen shows a snackbar based on the same + * [VideoAudioPreferences.adjustedSeekDurationMs]). */ fun setUseInexactSeek(value: Boolean) { - useInexactSeek.persist(VideoAudioPreferences.KEY_USE_INEXACT_SEEK, value) - VideoAudioPreferences.adjustedSeekDurationMs(seekDuration.value, value)?.let(::setSeekDuration) + useInexactSeek.persist(KEY_USE_INEXACT_SEEK, value) + VideoAudioPreferences.adjustedSeekDurationMs(seekDuration.value, value) + ?.let(::setSeekDuration) } - fun setSeekDuration(value: String) = seekDuration.persist(VideoAudioPreferences.KEY_SEEK_DURATION, value) + fun setSeekDuration(value: String) = seekDuration.persist(KEY_SEEK_DURATION, value) - fun setClearQueueConfirmation(value: Boolean) = clearQueueConfirmation.persist(VideoAudioPreferences.KEY_CLEAR_QUEUE_CONFIRMATION, value) + fun setClearQueueConfirmation(value: Boolean) = clearQueueConfirmation + .persist(KEY_CLEAR_QUEUE_CONFIRMATION, value) - fun setIgnoreHardwareMediaButtons(value: Boolean) = ignoreHardwareMediaButtons.persist(VideoAudioPreferences.KEY_IGNORE_HARDWARE_MEDIA_BUTTONS, value) + fun setIgnoreHardwareMediaButtons(value: Boolean) = ignoreHardwareMediaButtons + .persist(KEY_IGNORE_HARDWARE_MEDIA_BUTTONS, value) - private fun stringFlow(key: String, defaultValue: String) = MutableStateFlow(settings.getString(key, defaultValue)) + private fun stringFlow(key: String, defaultValue: String) = + MutableStateFlow(settings.getString(key, defaultValue)) - private fun booleanFlow(key: String, defaultValue: Boolean) = MutableStateFlow(settings.getBoolean(key, defaultValue)) + private fun booleanFlow(key: String, defaultValue: Boolean) = + MutableStateFlow(settings.getBoolean(key, defaultValue)) private fun MutableStateFlow.persist(key: String, newValue: String) { settings.putString(key, newValue) diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt index 55949336a..6b25596ca 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/VideoAudioSettingsScreenTest.kt @@ -14,7 +14,7 @@ import com.russhwolf.settings.MapSettings import com.russhwolf.settings.Settings import kotlin.test.Test import net.newpipe.app.extensions.withKoin -import net.newpipe.app.preferences.VideoAudioPreferences +import net.newpipe.app.preferences.VideoAudioPreferences.BEST_RESOLUTION import newpipe.shared.generated.resources.Res import newpipe.shared.generated.resources.best_resolution import newpipe.shared.generated.resources.default_resolution_title @@ -37,7 +37,8 @@ class VideoAudioSettingsScreenTest { modules = listOf(emptySettings), content = { VideoAudioSettingsScreenContent() }, onContent = { - onNodeWithText(getString(Res.string.settings_category_video_audio_title)).assertIsDisplayed() + onNodeWithText(getString(Res.string.settings_category_video_audio_title)) + .assertIsDisplayed() onNodeWithText(getString(Res.string.default_resolution_title)).assertIsDisplayed() } ) @@ -61,7 +62,7 @@ class VideoAudioSettingsScreenTest { withKoin( modules = listOf(emptySettings), content = { - VideoAudioSettingsScreenContent(defaultResolution = VideoAudioPreferences.BEST_RESOLUTION) + VideoAudioSettingsScreenContent(defaultResolution = BEST_RESOLUTION) }, onContent = { onNodeWithText(getString(Res.string.best_resolution)).assertIsDisplayed() From 16c5de7ac95e12cb8010386cee7908fcf54e874b Mon Sep 17 00:00:00 2001 From: h Date: Sat, 11 Apr 2026 20:06:33 +0200 Subject: [PATCH 083/155] Add chapter markers support to seekbar and update UI elements --- .../newpipe/player/ui/VideoPlayerUi.java | 54 +++++++++++++++++++ .../newpipe/views/FocusAwareSeekBar.java | 2 +- app/src/main/res/layout/player.xml | 19 ++++++- 3 files changed, 73 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 0bb01b10d..5ef52cefd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -65,7 +65,9 @@ import org.schabi.newpipe.databinding.PlayerBinding; import org.schabi.newpipe.extractor.MediaFormat; import org.schabi.newpipe.extractor.stream.AudioStream; import org.schabi.newpipe.extractor.stream.StreamInfo; +import org.schabi.newpipe.extractor.stream.StreamSegment; import org.schabi.newpipe.extractor.stream.VideoStream; +import org.schabi.newpipe.views.ChaptersSeekBar; import org.schabi.newpipe.fragments.detail.VideoDetailFragment; import org.schabi.newpipe.ktx.AnimationType; import org.schabi.newpipe.player.Player; @@ -85,6 +87,7 @@ import org.schabi.newpipe.util.external_communication.KoreUtils; import org.schabi.newpipe.util.external_communication.ShareUtils; import org.schabi.newpipe.views.player.PlayerFastSeekOverlay; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -147,6 +150,9 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa private final SeekbarPreviewThumbnailHolder seekbarPreviewThumbnailHolder = new SeekbarPreviewThumbnailHolder(); + @NonNull + private List currentChapters = Collections.emptyList(); + /*////////////////////////////////////////////////////////////////////////// // Constructor, setup, destroy @@ -589,6 +595,14 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa binding.currentSeekbarPreviewThumbnail, binding.subtitleView::getWidth); + // Chapter title tooltip + if (!currentChapters.isEmpty()) { + final StreamSegment chapter = getChapterAtMs(progress); + if (chapter != null && chapter.getTitle() != null) { + binding.currentChapterTitle.setText(chapter.getTitle()); + } + } + adjustSeekbarPreviewContainer(); } @@ -642,6 +656,10 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa AnimationType.SCALE_AND_ALPHA); animate(binding.currentSeekbarPreviewThumbnail, true, DEFAULT_CONTROLS_DURATION, AnimationType.SCALE_AND_ALPHA); + if (!currentChapters.isEmpty()) { + animate(binding.currentChapterTitle, true, DEFAULT_CONTROLS_DURATION, + AnimationType.SCALE_AND_ALPHA); + } } @Override // seekbar listener @@ -658,6 +676,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa binding.playbackCurrentTime.setText(getTimeString(seekBar.getProgress())); animate(binding.currentDisplaySeek, false, 200, AnimationType.SCALE_AND_ALPHA); animate(binding.currentSeekbarPreviewThumbnail, false, 200, AnimationType.SCALE_AND_ALPHA); + animate(binding.currentChapterTitle, false, 200, AnimationType.SCALE_AND_ALPHA); if (player.getCurrentState() == STATE_PAUSED_SEEK) { player.changeState(STATE_BUFFERING); @@ -668,6 +687,25 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa showControlsThenHide(); } + + /** + * Returns the chapter active at the given playback position, or {@code null} if + * {@code currentChapters} is empty. + * + * @param positionMs playback position in milliseconds + * @return the {@link StreamSegment} whose window contains {@code positionMs} + */ + @Nullable + private StreamSegment getChapterAtMs(final long positionMs) { + StreamSegment result = null; + for (final StreamSegment seg : currentChapters) { + if (seg.getStartTimeSeconds() * 1000L > positionMs) { + break; + } + result = seg; + } + return result; + } //endregion @@ -1036,6 +1074,22 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa binding.channelTextView.setText(info.getUploaderName()); this.seekbarPreviewThumbnailHolder.resetFrom(player.getContext(), info.getPreviewFrames()); + + // Chapter markers on seekbar + currentChapters = info.getStreamSegments() != null + ? info.getStreamSegments() : Collections.emptyList(); + Log.d(TAG, "onMetadataChanged: seekBarClass=" + + binding.playbackSeekBar.getClass().getSimpleName() + + " segments=" + currentChapters.size() + + " duration=" + info.getDuration()); + if (binding.playbackSeekBar instanceof ChaptersSeekBar) { + ((ChaptersSeekBar) binding.playbackSeekBar) + .setChapters(currentChapters, info.getDuration()); + } else { + Log.e(TAG, "onMetadataChanged: playbackSeekBar is NOT a ChaptersSeekBar! " + + "Check that player.xml was rebuilt."); + } + binding.currentChapterTitle.setVisibility(View.GONE); } private void updateStreamRelatedViews() { diff --git a/app/src/main/java/org/schabi/newpipe/views/FocusAwareSeekBar.java b/app/src/main/java/org/schabi/newpipe/views/FocusAwareSeekBar.java index 8176a9aef..651d2f373 100644 --- a/app/src/main/java/org/schabi/newpipe/views/FocusAwareSeekBar.java +++ b/app/src/main/java/org/schabi/newpipe/views/FocusAwareSeekBar.java @@ -33,7 +33,7 @@ import org.schabi.newpipe.util.DeviceUtils; * (onStartTrackingTouch/onStopTrackingTouch), so existing code does not need to be changed to * work with it. */ -public final class FocusAwareSeekBar extends AppCompatSeekBar { +public class FocusAwareSeekBar extends AppCompatSeekBar { private NestedListener listener; private ViewTreeObserver treeObserver; diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index a6a0884c7..9c6ae0a40 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -415,6 +415,23 @@ android:orientation="vertical" android:paddingBottom="12dp"> + + - Date: Sun, 12 Apr 2026 11:01:38 +0200 Subject: [PATCH 084/155] Add ChaptersSeekBar to render chapter markers on the seekbar --- .../schabi/newpipe/views/ChaptersSeekBar.java | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java diff --git a/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java b/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java new file mode 100644 index 000000000..a67b267d1 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) NewPipe Contributors + * ChaptersSeekBar.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 . + */ +package org.schabi.newpipe.views; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.util.Log; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import org.schabi.newpipe.extractor.stream.StreamSegment; + +import java.util.Collections; +import java.util.List; + +/** + * A {@link FocusAwareSeekBar} that draws thin white vertical tick marks at chapter boundaries. + * Call {@link #setChapters(List, long)} whenever a new stream loads. + */ +public final class ChaptersSeekBar extends FocusAwareSeekBar { + + private static final String TAG = "ChaptersSeekBar"; + + private static final int TICK_ALPHA = 180; // ~70% opacity + private static final float TICK_WIDTH_DP = 2f; + private static final float TICK_HEIGHT_FRACTION = 0.6f; // fraction of view height + + private final Paint tickPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + + @NonNull private List chapters = Collections.emptyList(); + private long durationSeconds = 0; + + public ChaptersSeekBar(@NonNull final Context context) { + super(context); + init(); + } + + public ChaptersSeekBar(@NonNull final Context context, + @Nullable final AttributeSet attrs) { + super(context, attrs); + init(); + } + + public ChaptersSeekBar(@NonNull final Context context, + @Nullable final AttributeSet attrs, + final int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + tickPaint.setColor(Color.WHITE); + tickPaint.setAlpha(TICK_ALPHA); + tickPaint.setStyle(Paint.Style.FILL); + Log.d(TAG, "init: ChaptersSeekBar created"); + } + + /** + * Stores chapter data for rendering tick marks. + * + * @param newChapters list of {@link StreamSegment}s; may be empty but never null + * @param newDurationSecs total duration in seconds; used to compute fractional positions + */ + public void setChapters(@NonNull final List newChapters, + final long newDurationSecs) { + chapters = newChapters; + durationSeconds = newDurationSecs; + Log.d(TAG, "setChapters: count=" + newChapters.size() + + " durationSeconds=" + newDurationSecs); + for (final StreamSegment seg : newChapters) { + Log.d(TAG, " chapter: startSec=" + seg.getStartTimeSeconds() + + " title=" + seg.getTitle()); + } + invalidate(); + } + + @Override + protected void onDraw(@NonNull final Canvas canvas) { + super.onDraw(canvas); + + if (chapters.isEmpty() || durationSeconds <= 0) { + Log.d(TAG, "onDraw: skipped — chapters=" + chapters.size() + + " durationSeconds=" + durationSeconds); + return; + } + + final float density = getResources().getDisplayMetrics().density; + final float tickWidthPx = TICK_WIDTH_DP * density; + + // Track bounds: AbsSeekBar pads the track by getPaddingLeft/getPaddingRight + final int paddingLeft = getPaddingLeft(); + final int paddingRight = getPaddingRight(); + final float trackWidth = getWidth() - paddingLeft - paddingRight; + + Log.d(TAG, "onDraw: w=" + getWidth() + " h=" + getHeight() + + " paddingL=" + paddingLeft + " paddingR=" + paddingRight + + " trackWidth=" + trackWidth + " chapters=" + chapters.size() + + " durationSeconds=" + durationSeconds); + + if (trackWidth <= 0) { + Log.d(TAG, "onDraw: trackWidth<=0, skipping"); + return; + } + + // Center ticks vertically, scaling height as a fraction of the view + final float tickHeight = getHeight() * TICK_HEIGHT_FRACTION; + final float tickTop = (getHeight() - tickHeight) / 2f; + final float tickBottom = tickTop + tickHeight; + + for (final StreamSegment seg : chapters) { + final int startSec = seg.getStartTimeSeconds(); + // Skip the very beginning and anything at or past the end + if (startSec <= 0 || startSec >= durationSeconds) { + Log.d(TAG, " skipping seg startSec=" + startSec); + continue; + } + final float x = paddingLeft + (startSec / (float) durationSeconds) * trackWidth; + Log.d(TAG, " drawing tick at x=" + x + " for startSec=" + startSec + + " title=" + seg.getTitle()); + canvas.drawRect( + x - tickWidthPx / 2f, + tickTop, + x + tickWidthPx / 2f, + tickBottom, + tickPaint); + } + } +} From 80682c2daf43ce9a313cf779ea43a816741d28f6 Mon Sep 17 00:00:00 2001 From: h Date: Mon, 13 Apr 2026 05:52:55 +0200 Subject: [PATCH 085/155] Enhance ChaptersSeekBar to render transparent gaps at chapter boundaries and add haptic feedback for chapter navigation --- .../newpipe/player/ui/VideoPlayerUi.java | 23 +++-- .../schabi/newpipe/views/ChaptersSeekBar.java | 98 +++++++------------ 2 files changed, 49 insertions(+), 72 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 5ef52cefd..563927e19 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -27,6 +27,7 @@ import android.os.Handler; import android.os.Looper; import android.util.Log; import android.view.GestureDetector; +import android.view.HapticFeedbackConstants; import android.view.Gravity; import android.view.KeyEvent; import android.view.Menu; @@ -152,6 +153,8 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa @NonNull private List currentChapters = Collections.emptyList(); + @Nullable + private StreamSegment lastChapterForHaptic = null; /*////////////////////////////////////////////////////////////////////////// @@ -595,12 +598,16 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa binding.currentSeekbarPreviewThumbnail, binding.subtitleView::getWidth); - // Chapter title tooltip + // Chapter title tooltip + haptic feedback at chapter boundaries if (!currentChapters.isEmpty()) { final StreamSegment chapter = getChapterAtMs(progress); if (chapter != null && chapter.getTitle() != null) { binding.currentChapterTitle.setText(chapter.getTitle()); } + if (chapter != lastChapterForHaptic) { + lastChapterForHaptic = chapter; + seekBar.performHapticFeedback(HapticFeedbackConstants.CLOCK_TICK); + } } adjustSeekbarPreviewContainer(); @@ -1078,17 +1085,9 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa // Chapter markers on seekbar currentChapters = info.getStreamSegments() != null ? info.getStreamSegments() : Collections.emptyList(); - Log.d(TAG, "onMetadataChanged: seekBarClass=" - + binding.playbackSeekBar.getClass().getSimpleName() - + " segments=" + currentChapters.size() - + " duration=" + info.getDuration()); - if (binding.playbackSeekBar instanceof ChaptersSeekBar) { - ((ChaptersSeekBar) binding.playbackSeekBar) - .setChapters(currentChapters, info.getDuration()); - } else { - Log.e(TAG, "onMetadataChanged: playbackSeekBar is NOT a ChaptersSeekBar! " - + "Check that player.xml was rebuilt."); - } + lastChapterForHaptic = null; + ((ChaptersSeekBar) binding.playbackSeekBar) + .setChapters(currentChapters, info.getDuration()); binding.currentChapterTitle.setVisibility(View.GONE); } diff --git a/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java b/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java index a67b267d1..20d2e57a3 100644 --- a/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java +++ b/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java @@ -19,10 +19,11 @@ package org.schabi.newpipe.views; import android.content.Context; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; -import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -33,18 +34,15 @@ import java.util.Collections; import java.util.List; /** - * A {@link FocusAwareSeekBar} that draws thin white vertical tick marks at chapter boundaries. + * A {@link FocusAwareSeekBar} that renders narrow transparent gaps at chapter boundaries, + * giving the seekbar a segmented "chopped" appearance. * Call {@link #setChapters(List, long)} whenever a new stream loads. */ public final class ChaptersSeekBar extends FocusAwareSeekBar { - private static final String TAG = "ChaptersSeekBar"; + private static final float GAP_WIDTH_DP = 2f; - private static final int TICK_ALPHA = 180; // ~70% opacity - private static final float TICK_WIDTH_DP = 2f; - private static final float TICK_HEIGHT_FRACTION = 0.6f; // fraction of view height - - private final Paint tickPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + private final Paint gapPaint = new Paint(); @NonNull private List chapters = Collections.emptyList(); private long durationSeconds = 0; @@ -68,14 +66,12 @@ public final class ChaptersSeekBar extends FocusAwareSeekBar { } private void init() { - tickPaint.setColor(Color.WHITE); - tickPaint.setAlpha(TICK_ALPHA); - tickPaint.setStyle(Paint.Style.FILL); - Log.d(TAG, "init: ChaptersSeekBar created"); + gapPaint.setStyle(Paint.Style.FILL); + gapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); } /** - * Stores chapter data for rendering tick marks. + * Stores chapter data for rendering segment gaps. * * @param newChapters list of {@link StreamSegment}s; may be empty but never null * @param newDurationSecs total duration in seconds; used to compute fractional positions @@ -84,64 +80,46 @@ public final class ChaptersSeekBar extends FocusAwareSeekBar { final long newDurationSecs) { chapters = newChapters; durationSeconds = newDurationSecs; - Log.d(TAG, "setChapters: count=" + newChapters.size() - + " durationSeconds=" + newDurationSecs); - for (final StreamSegment seg : newChapters) { - Log.d(TAG, " chapter: startSec=" + seg.getStartTimeSeconds() - + " title=" + seg.getTitle()); - } invalidate(); } @Override protected void onDraw(@NonNull final Canvas canvas) { + if (chapters.isEmpty() || durationSeconds <= 0) { + super.onDraw(canvas); + return; + } + + // Draw the seekbar into an offscreen layer so CLEAR mode can punch transparent gaps + final int sc = canvas.saveLayer(null, null); super.onDraw(canvas); - if (chapters.isEmpty() || durationSeconds <= 0) { - Log.d(TAG, "onDraw: skipped — chapters=" + chapters.size() - + " durationSeconds=" + durationSeconds); - return; - } - final float density = getResources().getDisplayMetrics().density; - final float tickWidthPx = TICK_WIDTH_DP * density; + final float gapHalfWidth = (GAP_WIDTH_DP * density) / 2f; + final int paddingLeft = getPaddingLeft(); + final float trackWidth = getWidth() - paddingLeft - getPaddingRight(); - // Track bounds: AbsSeekBar pads the track by getPaddingLeft/getPaddingRight - final int paddingLeft = getPaddingLeft(); - final int paddingRight = getPaddingRight(); - final float trackWidth = getWidth() - paddingLeft - paddingRight; - - Log.d(TAG, "onDraw: w=" + getWidth() + " h=" + getHeight() - + " paddingL=" + paddingLeft + " paddingR=" + paddingRight - + " trackWidth=" + trackWidth + " chapters=" + chapters.size() - + " durationSeconds=" + durationSeconds); - - if (trackWidth <= 0) { - Log.d(TAG, "onDraw: trackWidth<=0, skipping"); - return; + if (trackWidth > 0) { + for (final StreamSegment seg : chapters) { + final int startSec = seg.getStartTimeSeconds(); + // Skip the very first position and anything at or past the end + if (startSec <= 0 || startSec >= durationSeconds) { + continue; + } + final float x = paddingLeft + (startSec / (float) durationSeconds) * trackWidth; + canvas.drawRect(x - gapHalfWidth, 0, x + gapHalfWidth, getHeight(), gapPaint); + } } - // Center ticks vertically, scaling height as a fraction of the view - final float tickHeight = getHeight() * TICK_HEIGHT_FRACTION; - final float tickTop = (getHeight() - tickHeight) / 2f; - final float tickBottom = tickTop + tickHeight; + canvas.restoreToCount(sc); - for (final StreamSegment seg : chapters) { - final int startSec = seg.getStartTimeSeconds(); - // Skip the very beginning and anything at or past the end - if (startSec <= 0 || startSec >= durationSeconds) { - Log.d(TAG, " skipping seg startSec=" + startSec); - continue; - } - final float x = paddingLeft + (startSec / (float) durationSeconds) * trackWidth; - Log.d(TAG, " drawing tick at x=" + x + " for startSec=" + startSec - + " title=" + seg.getTitle()); - canvas.drawRect( - x - tickWidthPx / 2f, - tickTop, - x + tickWidthPx / 2f, - tickBottom, - tickPaint); + // Redraw the thumb on top so it visually overlaps the gaps + final Drawable thumb = getThumb(); + if (thumb != null) { + final int thumbSave = canvas.save(); + canvas.translate(getPaddingLeft() - getThumbOffset(), getPaddingTop()); + thumb.draw(canvas); + canvas.restoreToCount(thumbSave); } } } From 4b6264de6f19d61c8d81f8cfd3903d00e86291ff Mon Sep 17 00:00:00 2001 From: tobigr Date: Fri, 9 Oct 2026 12:45:52 +0200 Subject: [PATCH 086/155] Improve chapter title length and alignment Use SPDX and REUSE compatible license header --- .../schabi/newpipe/views/ChaptersSeekBar.java | 17 ++--------------- app/src/main/res/layout/player.xml | 10 ++++++---- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java b/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java index 20d2e57a3..3c3a61ebb 100644 --- a/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java +++ b/app/src/main/java/org/schabi/newpipe/views/ChaptersSeekBar.java @@ -1,19 +1,6 @@ /* - * Copyright (C) NewPipe Contributors - * ChaptersSeekBar.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 . + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later */ package org.schabi.newpipe.views; diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 9c6ae0a40..c7cac3e80 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -421,15 +421,17 @@ android:layout_height="wrap_content" android:background="#60000000" android:ellipsize="end" - android:maxLines="1" + android:maxWidth="250dp" + android:maxLines="2" android:paddingLeft="5dp" android:paddingRight="5dp" android:paddingBottom="2dp" + android:gravity="center" android:textColor="@android:color/white" android:textSize="12sp" android:visibility="gone" tools:ignore="RtlHardcoded" - tools:text="Introduction" + tools:text="This is a very long chapter title filled with needlessly little information despite its length" tools:visibility="visible" /> + tools:visibility="visible" + tools:ignore="ContentDescription" /> @@ -483,7 +486,6 @@ tools:ignore="HardcodedText" tools:text="1:06:29" /> - Date: Wed, 7 Oct 2026 21:45:05 +0200 Subject: [PATCH 087/155] Update user agent to Firefox ESR 153 --- app/src/main/java/org/schabi/newpipe/DownloaderImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java index 5971f03b8..7ec3f718a 100644 --- a/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java +++ b/app/src/main/java/org/schabi/newpipe/DownloaderImpl.java @@ -32,7 +32,7 @@ import okhttp3.brotli.Brotli; public final class DownloaderImpl extends Downloader { public static final String USER_AGENT = - "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:140.0) Gecko/20100101 Firefox/140.0"; + "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:153.0) Gecko/20100101 Firefox/153.0"; public static final String YOUTUBE_RESTRICTED_MODE_COOKIE_KEY = "youtube_restricted_mode_key"; public static final String YOUTUBE_RESTRICTED_MODE_COOKIE = "PREF=f2=8000000"; From e24141417e734e4102db05558933d8b05dd88add Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 11 Oct 2026 18:09:23 +0200 Subject: [PATCH 088/155] Update extractor to latest version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 230bf09b9..fa9a2f500 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "65cabc2ba5216ee871ace4a9963c08bdbf5d5dc0" +teamnewpipe-newpipe-extractor = "3313901108f0f52df68c28a04d88c2891f9c400b" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" From 78c44029f4ab75da51b989df12429bead26fd813 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 12 Oct 2026 00:06:58 +0800 Subject: [PATCH 089/155] gradle: Update multiple dependencies to latest release Signed-off-by: Aayush Gupta --- gradle/libs.versions.toml | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fa9a2f500..9c07145c1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,10 +4,10 @@ # [versions] -about-libraries = "15.1.1" -acra = "5.13.1" +about-libraries = "15.2.0" +acra = "5.14.2" activity = "1.13.0" -agp = "9.3.1" +agp = "9.4.1" appcompat = "1.8.0" assertj = "3.27.7" autoservice-google = "1.1.1" @@ -16,27 +16,27 @@ bridge = "v2.0.2" browser = "1.10.0" cardview = "1.0.0" checkstyle = "13.8.0" # See https://github.com/checkstyle/checkstyle/issues/21175 -coil = "3.5.0" -compose = "1.12.0" +coil = "3.6.3" +compose = "1.12.1" constraintlayout = "2.2.2" -core = "1.19.0" +core = "1.19.1" coroutines = "1.11.0" desugar = "2.1.5" documentfile = "1.1.0" espresso = "3.7.0" exoplayer = "2.19.1" -fragment = "1.9.0" +fragment = "1.9.1" groupie = "2.10.1" -jsoup = "1.23.1" +jsoup = "1.23.2" junit = "4.13.2" junit-ext = "1.3.0" -kermit = "2.1.0" +kermit = "2.2.0" koin = "4.2.2" -koin-plugin = "1.1.0" -kotlin = "2.4.10" +koin-plugin = "1.2.1" +kotlin = "2.4.21" kotlinx-coroutines-rx3 = "1.11.0" kotlinx-serialization-json = "1.11.0" -ksp = "2.3.11" +ksp = "2.3.12" ktlint = "1.8.0" leakcanary = "2.14" lifecycle = "2.11.0" @@ -45,21 +45,21 @@ markwon = "4.6.2" material = "1.11.0" # TODO: update to newer version after bug is fixed. See https://github.com/TeamNewPipe/NewPipe/pull/13018 material3 = "1.11.0-alpha07" media = "1.7.1" -mockitoCore = "5.23.0" -multiplatform = "1.11.1" -navigation3 = "1.1.1" +mockitoCore = "5.24.0" +multiplatform = "1.12.1" +navigation3 = "1.1.2" okhttp = "5.5.0" phoenix = "3.0.0" preference = "1.2.1" prettytime = "5.0.8.Final" recyclerview = "1.4.0" -room = "2.8.4" +room = "2.8.5" # Needs migration to 3.x, may as well be moved to shared runner = "1.7.0" rxandroid = "3.0.2" rxbinding = "4.0.0" rxjava = "3.1.12" settings = "1.3.0" -sonarqube = "7.4.0.8496" +sonarqube = "7.5.0.8588" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" swiperefreshlayout = "1.2.0" @@ -76,7 +76,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" teamnewpipe-newpipe-extractor = "3313901108f0f52df68c28a04d88c2891f9c400b" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 -work = "2.11.2" +work = "2.11.2" # New versions require minSdk 24 [libraries] acra-core = { module = "ch.acra:acra-core", version.ref = "acra" } From 280101d7793860b3cbea99af7e575882fc86596d Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 12 Oct 2026 00:13:05 +0800 Subject: [PATCH 090/155] gradle: Update Gradle and wrapper to 9.8.1 Signed-off-by: Aayush Gupta --- gradle/wrapper/gradle-wrapper.jar | Bin 47505 -> 48749 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew.bat | 52 ++++++++++++++++++----- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index eddabd2eef8d94a5437d6168ff9c87a78ff725b3..9fa7f288283f81eec4952784c271abd7e0938dee 100644 GIT binary patch delta 40003 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 delta 38903 zcmaF+hiT$xrVZJA^}1)zay1(Wuso<%ct1h>#)WS)qE`g5Om(VXe|txk!m$Z0-@dNi zdOh*kY_`2`HB)y4`;>k2dh@hza~4;h+9%1+LWi!VxqHn~D(gFV`U&+na)LO_qYvO|qLA+7??(LeIhQ}TG>|N^2T=JgHkJ&wEs$9HE--6hE_gQX9 zL~Y--?%}mfVltEM`Ge|*6yr>WR z-uYeHx_kBp&n^YAKc4eg`2R7~PqAQhO@DCk_l)B;b$ja>4rsnHs<@f+?4$60@uF70 zkDSvv5Dj?3O!x5BIlrbrvWQp#k{t#CkxkEpA(&T zG|MGY{{KDosfH?RE{b3Aa;mqH;df8|cZcua3d z8f^Ub!>#30UBmC$c%6Cu-ReS8!4HLNN=Ap4Ufff(blZ>f`NkRXS<6prv$4Bx-v46J zms?B4kC)rNI8??U%OSC4*%!Sx2gNQ{N$Bouu}%7YVF7E#{4e(to_|%psFLIGnO_jwW|7%&>iuT8xQL0 zFJ^EgAJ4zJFYMl6DRw=rm;iK(@z z?drX6nUXz1?@mkaaK9wPle{kc`fE9J-G$QAu87Cpe%2Q`u`eRG%~-R;_)G5R*mco& zR=!@nH8+ukONggSTCt|>pBGC8>!nNc3-$+!GS=S>e;T(pm0LZc`mV}KpQlq&FFxAm zKVgez&Ed&{{Lb5W19@#;Ug4ayraEu+PQ_+6=STZWQa&`W6z6t{zGUbAS=tt%w}0It z@tGnbDV`tigmAG1Nw|c$icj(^dBo&=e&vf@+Py8^tIlY~C*O&GC7Cd6hTUIE$-7n(Y9PJYm zcYpb&{U}r*_Vvy#PM>8H-5cAA7kxUwS$=!Bz-N&!0_DHYtd`xq@`2vQ!pkWVXXd`= z4NWtUmMZBF5qoKDSQ5_sYyIgxJH_txFEsxnrLDVLZO@7(o|y~lFNpUCyDSSj;28pRiTcH|0;@-J|AWLwLh`oGlTPQiGMBHzjyqy-(S{I*mmlP zVi(VQLnFtFvTgD+;{NqKJS2W5x5nbv*NH2v4E(djWZfm)+nfAadk*CHEb{rv!g+kL zVv?ZQH*rvMRK3Qyu84_&nPCnyI6Za=d)80Wi}hNl^keOgrfo}8(7 zj893+c3Jxjh8u8yfPPmex5x-|9i zVGW7qeNVSfRh?(KEyp>~o_Bm{Z0VAUbD;`XVwMVWZN2&G1-FTc zM3=MkqEziC3olGak=XptNuuYKWs}~WcZ(yFJ?zSs2-_vjs6Wr!{(QUSqn&@sq^vGk zne;3->2?Vp@Bv}LjxdfdJc#5?_#zLC~TQCZ_1Ue{lo=8d0s z_1Vh>Qvc*_55F-uD3xbapK@e(z{jqvZMKSs8{X-A-Q|=LAtXY^FJR>#L>!R6| zo<)&ccjXm?Z}-`nHkGyhW^N+KJC0dvirlZRa=Kk2W$Hfj)`K=>Bd@)Su2sZd-77IU z)o`MAztFXFwV&>1NU%xDao%3IBIQJHPj643X1&`1i6^P66SE&}%j0M(JiRVO+e}|t zX|-fk*|k+ycSP#FSQhbUoAR3@JvTPwINk2seMe*KGu0A9pO#;G*Y@W6=GPbQPK_+v zsjX6CT(Ud#u4hb209Rt-r{m z=W&TD-N_QS@(#>S%w6$eg8ie&=GjxuquRLZqPH;nuq@;@?x1NSL%OL?`Q75w1V^U-mekDYeoJYDaf)vII}Hpimhx+n#FA|-#t@Vt}d|n z=pgekh2=3%GkcEVf+>>?+dNl=#jOu+SMF>-k#PRkl;bw*Diqflm8iHY?bxS(=y{d3 z&Y>;hiEWCHqUJBLF}U*1>Bj6GPZRS`OMH!J-@dszzFy$$d7l3*-AYN_%&|yzS{P?{`7C!e+Te?3cC6X1&nYtB_NV zU+|rE-{~CZ%4V0s`hU9XmepLoaKFQJqSmDhmA&(B9bCHHw?}NYgtlG4^<-h|8MlsY zy?UcJ_sqJy$LIK-#hDjgKQ4a7XO_*g`M>5&e!nJ@gc}mAUe`UBdz6Moht3sX z7kM7}zSL#!9nXh+uRh(o`cfxV_kHcBgXMpje?8zY&~0x$_C6%E-AtCZ^2NH~=QZi` z|Gv$)`1V&cq0!ndDEId{q8 z?Cm=bRvpeP^eLS*({P?-IhUpSEz?y}eEu$IR2RWEJa82k9P)z-5q+2zx|_lxl~ ztEugHE1>0DvMoRJ{vOp|0k#s(6&JK_NY-u6D`?A|Huvp`TdUGO^z|$({}QotPF9xY z-6!lJw;z5x7I(RRmI?c(rup{9FIMSI7f9MsckwLuo9JT-(f7VA$bOwRZJ~1MM2mlI zvOK427}{RE&-wa&!q-n{T2HcWt8mW{mCp2@t9-&}i@x95LzV|~oJ_gyBu31&TIRPx zmNnemYFBRbT(6gX+B{{imc4tIRJRUo{F-y3}A5qqkU&H))HXo5bm(FT5m;^aPb%k8#ClxdonbJN;(c=2jW= z*tWfE_hq$ZrCBp=zdcQgDb;YUN{qAR3by5Pb4~>>P!?tXF0tzIn+X@Ywy|wdIJV)@ zp+}0|*Hu&`oY*h3e><5W?&euiZ?I;Lf9#=Bk^JV_k>zKEi}v@N-J#g?dSmOoP~XKS zE5B4EJdrrR!}=EA=^Jf+iZ9Fj6+S8C7fkHGzD+NXPttmWu}{$Zq>lgJ&J}TdlRf{z zVX?HN-t6}m?=|IR+?jUa?1h`TS~kC}=}8kM(aT`*mzxp>-Ime%PeFF20Y zua8{1RL=JEA3gV5-dk!D-yA)wGH2HL;Mpl2dMbfe-!({C)@Xm@?zk3BS?0H}T#=cUedpwjsta?Z#V=)xLiYR`H6#i5tmr_IY{b6x5>^U7VrrA=|uBa|lf$W>lk(s9k=&8u&LS6x&CmS-(^ zCCl+=PkG~)s6CPO;i5%X9UB++aQd_b9w^MR>Z`M#Ubz2-QuarN!=~cwN)H#Z%{lP& zY1p%``TI-l4_&w#ZV)p!>dc%SeMTp9>jFR7d4(?8eJ3oo`$}~1I-&P1e-GOH{9rLp zV9NX@TUNwP|6rnOUHhiv%=C{sZPOo1+PMFlWn#GhTa%o^W7a(yZ{q3~6{O^@o*;k8 zb#d-01qV$lvlFdvB7@-Q6M_f5LrEnIDa= zuGQH~v4yp7XZvbY8?aW%@s@X~O)Y0XU&Gn;V)vr^`}@A1xHbRM zvo+^`UHdQaxVh~Q1m#4qDyt&V< zMDntR(z>Mgp5hz7FUh`9eQE34$e@A?F8}{8+a9}Rci+6(NiQEhlw4!kzV+ojNt5Ht z3SDcYUJGBoF=5WJ(6b9OWB$q;rBuxSH~pfq%YF{Cq+o{9SsYg`T<#IwxUl0#ec{{c z8?yEKiLW(Xl3pq?PPv~F1LJ^yx`p@AG5#Q;OsMflA!A;ptP=iqw#}V{>5jCcQ?J3 zs@l1zrP|-ou6^;#8$3qxM_KOfRL+?E=;8VW3oRTMu^QI*IUFu%*gN?dOIfh$HW91t zfVaPkJtiqg-+a7Ua@k3vD3_S0c0sm(=5C~>8)XB)&9 zF8^)s?5w2e(zR50$>jA3@j4Ux)TN43MRntkGCTKv4}IbJA-pqVt^Ogw9UqldeU=9Q zTgm@U>rrCW8f&RV^)Y-Irt@r?Q`0YoiLO5`*0qZNOGx~qWSjFV=FEC*QZ@78|0~}) zZ8VFXym@oo?%QhBJrldwr>%^z*^u*6dD7oQhwXVqKZ+Y^9X?w(aZdAVF42$Qp9OHH z`<<_O}_ze-66MM(*u6Uaq73UZ(OGJ(CpGbmZeX_X1!eYNF$)uFL1;B#T)i{T>WWw z^?Bwd8|SY-c|)IX7y0vEqqN>dIJ!MFhdFlJ_Uav5<*wg~X8=`y7o8QdFR(E%r1MQy z6my)Mw^^lr?&SCWmmMUI@85pV%1iyWh-m#n(JjA^_B8kyNGblxYAR$?exLU?H{{mq zOJyp@JRbdj%h>|81N46*F%iy2JS^Z-IXK z4&jbf_g-I%xwrb}#N*E1I;LwXll~qHxc}0cPxlR%y+U|Y#u?pnXZ2snZ%*LJI{o_h zvWh(GriYEs%U{RNkM3JByDv8WbIf$_)tTNOC;e{xkREr#G2!$(H~m`=gZJO&s?-qa zF$nR$BFEFIba=wYB=NS^XPx!8nj6|>!aV+;m{#^DPSI?^bDl(d5@&s>^n?LTE}>@l>62li$U= z98^)%tiFbNHNTJ|#$)b5SN&8EC{u(l#pSJq<@^H-^ZciV2I#u^^th9M2S^r<~ zZ$S*Nxxv~;R(V-FnpOu+Ds3zDUsql9@M0tcS9;&*Z%l+Rp-$+G5F2#yqaDGTQsnBar#Zr`zu> z!hg2?sq+b6asI-LuBogd!gW>;r+R%n#1QN_L|CA<{H%+)a`>#ae##*kI_MjA%b9>_y^T~IWOX_cL zSsHOlt%JL7f$rS^hf_*RgiO@73S_8!<=;7Xr!KScyHb@8gOpvSAiHm+(r8M`=1 zeNC61hhD4Z4rPy>XXmzT)7=ugJk9b|Oy}&r`i|9Ciw-@y+VZgQ%&R1|wf;h3%g(>` zHodHJaNY#Ijgu7S&hhi}TRp!ffv2(8%Qx%M)I_efnO!=|PfdEg%p-Hz#He)%luZw-rJZlBt%ej;@a2;~|@!-43UY@&R z_8MHLf_L>+8Gdo!WL?w0+$V2(u=F~UH=k<0*ftAA7A@*bIn#bSrCfATLWhD_`O4RR z0*56y9`L;jda6~nE@}Sc{d+q1WF8W~?YLDcbK1Tp!M5n6`}I?8luw&_-&p6|X&Q4q z=CDudk|*quhYO!K2Yfuy-!75*VlU%@2Zo{(UjLeUYK>TV%d?==rVa(E1HwJ={cobw zxE?)8E7kpPGqfS5hto_=uZ6WtV&p@%?Q>MS>$_(!CT=K^w;Ze{-X+e#O zV-K{s%Wpp6OT8)G8P~C?UQeY-(}&%l^EprFvZLpwoXB3B*wVz=yDaNFRP2UE*2 z?$#TIPRn0($}fH|y+^;Nj%N;|yg(@TTdy_gA6UNcyD%|v;x)cod+mFEvt+q6Y(Da` z(fv5L`wQzs5pP&Fo>gwy_xR;A&NQ?7q-_R%tAcfE{vJ1RFx-CmrvJ9sBNyB^@?KM2 z`_(7vKX_>NOWevw`zQ0OXVo(s3e1i8op?2Be_vcvyH;-anxnrO7c^C9gsrLgFzxQ# zbr*BWPNumEu+~pfKiF)4KwkCSx{iBCWYUcEKi}JP=J)Z}(hNBVl$w_xKfd{%ZFy^X z^R4H%??``C`@YCvnpcG6%P@(b9y=Ucl^m<~2zj2~?et#F^KeUke~Z_KlaCjO)_3ht zHSX1wH?OX1ukw9A+um!c(gQJHr&TOpZrv?gep+7ZfJ8`pV3v)|BreG{?rH^0$~CQh z%a;^Ov@X0*7oTM#s^+-aro%Wp{^$j+?o^5Nfc;|I4+T20pF6PE?fkTbM;2_+-nyll zhpTsLx8{liE~2LbQUkh83VUr2TJO$hVyn;Yo%(P7;(Fe@iuWg~Wl1gC#=|G|SDxKD zdkJ6JzqJwE7v#F1xKGWAf7aX~sl8>(f{)I(G@EDoJW=6|HFdcd!e48uhoi2E#86eYqNF7v`#Q*)2 zQ_jf3z+lM)9d=WlY^`ZnZ*#>hrG z@OazOc~6D(6V$4|ohjG*e75}A?|%LJ40oKHAO1agvin-}*3(~=A4aTd^P)vZv_xbeJk+4t5u5uP~?ci$CS3zS|pH*NntOZ00+eL}}?-Q>wd zso7EYrEi!q9(Q89GPNNrdG*GfOZRy<8>Za4=kV%LXDT<_*~w{_r`*}#8oYh&vvtoc z?wEel3AcG}Bv4d)zkkJ6=gggHT%2u3o$JobHY-2-tnPcji$pHZHjC+M&WZ2K3t~1M zp76y@_e5pJ&afXH3u9)Uo$b1c{mQobAlrZf!J9lmJC-Q)wz9??Sk!dphPJ^H=lqz1 z8$wo|OBT4i#YFGFYi-p+Z50oJB1yLOYc`zUVACG;b!(Go%;^VO>x`%T>$R7Q*ru4m zW&S_dZr8!JJYj{iT^{W7f2{uU`O00UE3hHb;sfa&eIda(-KP7YdI%PXFETk z`&j+AoChVXH79pptl0c^Lfq}(cm3Z^Ois|O>NEW0;rZ#)#6IN~LHE`-Y;R9>TxKfT z>i1k`XRq;-*XbH{Y8?yx%sl^F)c))^y~M-4$!0;Qwd=kBsYl1y*VG)%TK;WWfK_`{ z*CT=Q_7ycQnM~LJwb=J&WTb5FSo_z-&`Q^JmOsCY$od}|y8pOADdc(z<1`5-28Kw; zxanrilj+8aq9KK-e=TeC&x9bZ6Y*y*C`u%kt#1|pN( zomOWpuvNLUz(r0e_TJ|WukJ0j=5Tk+*jg3S7O}CdzRvW);Z+@`e6}_jRi%$+J@c>2 zS5ak5Hc?zDbYYEY*4MVLQ&^8FT)(RP_|eV@Cl)N~&Hvq2EtDJ1^*e-}F+9#)W6vWs zm(8Ew?h@=bVD{$msY36y-A@_lu zUGuKX^us$m*rMy7o}2GxZshdy?Okg&*0pIB<;4}nM%MqQebBWC^_cA#x0-ux-8`$A z-LZ1J6U^u;~x zC+Z~$8$8YC9_YCgwt(TINZ7&|KZMq(uK60@=_GV{p2{y1!A;y7esHmZ;$_P3sV5sJ zC+L>fi=2wodFso0RCudyZhuD$(=is$o=#qgK%OHG}Wv{QW9@Ao+|@jkQfp?9WBlcI?xSagGi8D!X;X zt9ilObL1lCMHksP2gGni7sLk?P5-T08~);V-QkZ{>zB&r{a&=<+Sy5mU#n_Ai7+|h zbackzs7TAh?@e-MGqF4UI^xynRk_c`e0|+p=46lD3f`67&!_21h}mXlEql_YYjStn zmeBKsJF-J`!}mP8BwqAu?e6zg@^`;ht@vQFP4I(*ieP%h714W)*H2IQ;5>a{%v-Mu zY_Vw_g_%Y?q2GVhGhWYmH|v(0g6{PtR~qUXQv>vk-EG{Y?H#M;N30XINfp@nUvjr_ zjBicdvy(DCTxOVErDx&_+(3|@`jvTSFe9Nvwj}j)RcMW{c&5HgcD^N9!lc>l-e9w-afjXUG2m_ z?elFet{I++{YuU?Q}ehFCuk(CeR!p%=5Y2lhc>r~ORS}p`_DD)@u~2exHMR4HiPCd zg|(@_W;xE0Q;5D%^23jafF;Tg0#6`HHFY4&B{Wa{lR;Cze%;uULCTw{4pxQG4@9!NSgVdB1?F>qmZE z+_}a?ly8E)N6t+S5pGt+Z~UO-7Aq2xls?(cAhUk&l0dF)Tkbe%1Z7V4;x-NFS#G@i zgvFOp~SIyTa6;zxjD?`}cp} z?5h9$dB1%+L*GN~HumrDmL3mT9dnWQ-K%Lcb)sh}?AGNu zDC?;2eaCZ^>caYSR#!I(OV4=Nro1b8YSN}N+McmRb1t~V@4x09v3q}E-Lfo+lpVS` z?GYz0+%Mj<{CmZlIEEfYi@ea>(3lIn2L-miNm`Xrd{#j7>V;s*)iKYOnJt=~)N{LU zgXj;*vincASDt#1W;k{BKFyHugJo^k?%X(1pcj2&nR`1|^2^T7h4rT++fH<_uiLe2 z;wIO?Gs}_=Lc5llQ#Kc?*;rRA)F0a5FWi^Mt$UZF?#|P^s~_*gazE7F!dl3{?#z+Y zzQpFpg=sUaipy6OsprnP`f2ZL?bRs{-O}9|-tzq3KEd;#HILU`?G+9ukDORN;ngjk zvK-Aq4)+gv0_}qQiVbO!KI|uh#iuXSFRV4*wzhh~I)j({oVWT+f4!{OQ^(*ITWG@ML4vy#DU!(8N_q!k%ug+dU=;OH7!=leg%nk;lQ6qUL@a=_!u>k9C~iOx>M$ zSim)J$=jr@IzHtYaia4qxXzh&gfA^vw@P}JO1+)G?d*rkGIs{9%e+{ny67W=Ue3f_ z*Y}GzOB^x??F-j3(T=;#CcQW4+;jsaO*cusBa82J7HxhQHP!oaM2B9u$*Eqi&ft8m z=iq$t91|j1|+(eYC6AF7P?^B82~4R0-oZ)v$J>J@q;2LflgoeC{N1=r@-MW$vzqbs;zhMhfA4<%H0Ax5gWKMJ$W6a~a53}0^c(UY zuYb6g+|glQv!(6daf^?}R!cvo@V<1<_;>60Je|K^nP&ds=6SkY>7Ub&!>%5kXg0d8eP^zCF4NuX|7LD&Wb;k9V@(rkN2`z#QSEU30I^ zYKy}6c8{`(Y?~$j6*kuTANu=1^UdcQwf~vD+2=$=VZ{Ll6V8*$+t|k z>LWNBr)>$yaJ{tU(?tHH)9#wSt82bY7SIYY5RIPx#yjH1o3^{WO*v=rs)r#?AoJx+%)q1vFBme zDvwROaG>DO3GVtU*Pfhf%3W18?P18JLY*6{#P%ykXKyb0C*_=d?}^y;w>u|QZ@ta5 zy><4<;$vdraXYtu%Dp{B{Y;Lc`^A)u^&PVfd@I#gMk#GlT=;5LZS%s#``w;3y0ZEI zKd?w%{lc^676#{NQ9sV*wHfXQ`rS-S7s{ot+M_YEMNj@5m%jY0*81zwbw9js-3|%o ztq^Lmn8B8A?SfA`(_ji{3`vu{1t{fLw@h|oeL$k}_iHpQ6 zuiAc5Zptt|)L~drdc0=WoZU?pr(}-rKJ-4w^rz^S=^hgdj$HViuN?GE_G4m*NqEuo zL;Z#qXC=ninmH~_oak_*@)PT!ddq9^yqj+YZJzdehhju^|H1u{203;MwZHR(rtgTc zcCu-e=A2u$PY-X=(EV`h@WUk6#oR@!CAYH% zmR?Lyes{^@)K8n(g0_hIubNlccee+a8hdmVr%6V{D?iH!$XQ&owQurEwa<^4&ve&M zV6|5>c)9rFuL%oJzWr};Fmh3JFn4RQ^d+S)ilL&sa{IHCif(R{-#_`#zYZ=P*#i?+ zL_VmWE$&!9P5AF#(--SKzi}BgP$(_#{pJ}T zVE$&op>WO?qZ=Ki@|za@Q;RIrPN@i4yu@64RsFiB^&+twL%gO&3h|`>&J_!pyqw3@ z_4Vz3-@shCEy_`G?iSi7#FUq52+ulpA=L8u)X%=$iQMx|7dPZaaRh%!THwNMwzoRt zrmaA;H+Kw!w`h^}of4gl#f+0)ls;AMy{3?vn{?6g(tEF{WR=&B4=p^;pMQD#yhy13 zr_&x5bK~mm4y;t(vV1c8i;kN9bINl>e_3AIt^H-5@*MH1jxXK6U--N68J_sSyKZvP z%!jIN{RXq<*&di`+cVi&E38Q4pIqNgxz57(a#p+dT&&%*|I3~q$IDw5^7+5G$?Px4 zc|}mKbDHcwr+`BmD_x_GJ$ldm>-)sdN>eAO-Bi(=5Pk0Y6^45LlQ%yIF1u{ZzT>5@ z%p<uyt-O}>;uYZZv4=IlRA6q)J-z7yWNbOO{znob8qOS4iOxqZhiFcg&J0lq_ z=XM>tG%>rt4Yp@S-PT!;)S@4_b;&9 zQ{9piwIsgJhHu5wJ<@s0m^17HC5pXr7`2rgDp#ne*YoX~ZSS~N^ek`KlX}MPc_}aY zgs!*WSb6x;y2)#Ng4tijs>~FQWgUs!kc z>7C+pws)%c*W2x5n3FXBLFvvt-{-v*{Q6vn>&?2i{co4OJ)U@o)wfc{GEv6hthbs( zs84tBDw+CIe|Da7N-aMgqH%4@x6(1Xdg*s_`*ST9jx>2L4K{ta z)oN|o@jA^0fe8LWwc4`7tjZQ$Pmj#?km7jut7&(6h?dxwM+Qp*FFY5NR(XBa=Lv_F z@va5y7F;|c+mm+2-}edUCvGjHWgL9Jq;0)-7OY>o#J_gkCGOlEPXztfbM!o(d|XK9 zO+=tUpwf!}kIgrxFYF28WEJVY;Wky_`sMV6tE7YXPs&)bl~?JtN$l%g)-4MK1G0I- zZ~S$stk~_e^kd&G=?#U_yYdeH0C(^BUaC7fGcqtthAhwP66T+5<-|Anl8t`-uGUR8 z-mR({Ehf1x8dE+k6mVFa>Bw{?Ve6f|yva*v-%TyQ93&{R|HI_)cDs+qRzLF5Ds!tT zxgvhQ=8EJ$u5^=myEDBtOOLhRyJsuEzxbWy{^C!c?eG6*NYKwSytAY3uh09dKRC>f zw*>cmKYI3Jg;w4!(es-sGj{rgAJyfW^t=9$n2o>^ozDwS>u?wAtO#qWxUaFDd16=f z(sf+lcjRQ?GC(r>?@ly5P^1gn5mz2^W~`v{X(otPfZq+j&QMf6a?%zn2fzsk`ZNA+`1Od^Wm!w@tV{fvZ_gYG!0! zR9J}PoQ1jqa^EXo{4!FLOf#`*PLJLoYyCoV--n#MAm3~1Ml)5j7AQ8x8o5nMJgRtl z<00k$6VFxhYL*=3*go6GIec35p>s`EQ?AtLbAGdYGi}>><29XMu3p%5*}ZnY|Fbm> zw{}c-tiKd^(5@=Qv!#C1M9J;1S^|YPNmUgt5dD4e_y(PcxhlmPZE`Zp)FO_kMmDm( zba}XGbCK6`);$_``_H-7`m9%QUaItuze9Urn{dR{uE!Rh3uS~1*7)kIiD~X=`DwK2 z(mT;p3MJC1Q90J}Pi20k{$Z@*(-#w;S|Ju#_Qxb{@_H*}ey?pScSj$sw_Igj*!e8* z@PaGbAC_jBWOn@0>McK_#OutvZO_RKUj@sqZFB9s{c}S5qa&ih6-7Tpd5m)+<~-ZD zDpmaHgTl7n=W`5?&n@7&DV01gxwehVxNTww^PSHc7S8TToM~s9E?#yIoFtc8$#bM2 z@Yk{V9v@c3uL^4s);n==nftqthZpLf{fKAYYp_IpactU)JDCxU4|gm)$h%X8=iTho z>=+4=Q}az??tkbgYjZAHT*YP>l2Y|b@$$U6tV#DPmD;6Cyro6MoeddI)TX1%eDiml4q*jKc_@q6?KIXi_T7tZb! zu0M4CLS5aKD`HXlo?H7rY+Q2C_f*xPqONx?3myeODryrmd&`~FWO?oU-pw^GdQU?w zPYW_%J=O6+nN#=f(|{N0Es2xwl$T^LGHwf-RO9z(y~iz||I^j8BWzpk-zA>S&G4*^ z<(<9kLv+ynn8VjJ|4g~E-E}&<@r`-A+vm0(e(PLbzrpC{ymu=WZvL+qR=#EV`v+;8 zYBhvP#DXq+T;H&K!fZ$Xh5J9-WjOmkK2a-^eB$DBZ=UTNHC?xdOV%Cv_uJxVfOFl4 zyuXR7+BSbS+x^_<7T4cjKc%>WEfg-V`9Jg0{R#8G-d}t=I`~G}_J7%*UQ5R4oJm-6 z!ElZEa>c9-SvyR6>kUus71C^*babLW$Nf!;2Y0Jew3*)?8KJfB0+lj}2}9U(T;^zMphf!rbA?y=NNV zpVc#hn&RBi39orr85qnsz)f*&r+|82e-TH4+Ou^$I@WsHi{kd2;WX1Jb|_&@cIuet zuvo(8`TuA85*P z*X-Q&%U~yu(#o_cM-S#LSavXN!KW=3+@@KbKb9#c{CFCVr~4h7sd;PsJkQ2V-IY+T zRo}b#>;jKtD|L?Tx>g~0`LpMqvoY2`t?k$LBqsP>+o;7ndF|Y_Z|6SvtkmN0-eUcl zMdr6A9Ei)CY_QSDOyt!XmD!%cemg~H#hfjf*0TQm)RlAQnKS?Pnpo^^G?_D!KeutJ zvE}rI6VKF$&z-1cTf(|azjWE@aHh3idnen8ZM@RlUO(@E!BlZU*%@~({`Lya)MJrb zCvT=?#Xq~Phv#kX9D|?sHxAo2_N_W?7q($b4`UnC>i<3)VzpkSRz-+r$bWESVQaTq zyggKE;@^nV96ye$)*qgzGfT?3{M4sCz1+xS=8(`>&Ry2taFxtD!? zct3Fd-9Yxm(LWYzyx*b!LG-Qvb)IcApFCzv@1OA?`Jp-cwNDbs8?M^i{>2Q6wg{%> zm6H`*vg_*ee9na6|sP8;lx~^WtQuFwfq!`)9uWlx3 z#`lyw5!rhpTDkRNMV#glQ^92aY47vS=cz}pu03WSeyLPw&hxN|izY4Do11?7+uVuT zaRzMv8zMJ_)CF9&bUw4iO?dINNmnZurDRt*8Rz6lcFnWM(`;qhzDsxB)3&vNX`Fd& z4qQQPWm^({|%d9>Z8ELz4Vx^t>Yk=o%; zwX+u9WS5w=xcjWQcT}I@jzzl1nN}R;vR7HdbAWq3zZ?tmhw!k(wyE1p>pE_`>r76# z{g}tuUv!^R;kkL*lB-rYKT0UwxP9rh$|mkqp=(ASV)`$-yymRyEi1oXz>`ofd+qnd z23}*uIZHBwLre4$g`0n8)c=2=)9Iga^1GzX>%(a#Mptg8-P+?Yb)i^dMwi~Ubu(?6 zp1XWn%frjPHCEO4e37@4uNroB`OG!;JB zx!AYG!yu>YTEc73!?}k(xU#L!4V%KVx_+_g`5nyGt#9?(djAK9a=yK?ktIfc{^R$Z zee>FPYjG`Lu716N{r8JAt1?$~?LAO_(s=TF#yu)K>Sr#D)4Z9yY-wx}+dqTw7ZXAz z&U|dqP(Ag~HM!xqSAzPb1@ts}Ze!0^|oTk0GHj#VNrFTv!HQ|%|lhnBA zL(XEW@~38ExktqgTkJ}Zc)s+?pA!#xOquP&m6oge_=o&>e{HJL%q!<-E4X`zNE#gF zjZWY=8yLdrz`A|jtj>C2#upp@YAkYzd?_mZdYP2v_limHEENm5LJylt9QOCFsZZoRic042S*t_31_Ve&xoZ#tuP}zS=TeQbTOXax> z8hGwsP8Z0L`mNdA!q%DR-?*Lo?$sye50*`4SpKBI{}-QA@Qn!H%8sB(3nuB53U8`m z{~FxEU25TZs``caqT3Q$%E8A9u6|;i;^Q;VrR))7(aaAwRL=c-ctQ2Rn&#JrN-Zf; zzV#8$6tWoP1m*1~l&LN(5#FE@$$!DhMRv}5CRwGK47UVlAIh_OxpPDMk8~aJ9ZCET z1#cvOspfxPe@LpayX@;ZzoPpsw@Xi#W=|86zq8Q&hF3o0(j5)mS4Dh7I3^}F&spf9 z`N_Y!u6fGI9Zwj`a~{au+x1jLUqxwU#bJCxt? z?tk6!+PJp<&}ol-x^izc9v?o_D1EuUJLl`Vv#B*oL3w5K^&Wq=JDAiS-6!1t`mW}y zo&`1X_l*LhioS0MSsnA#T21Vr_7#aOvuC9KVp(#$>E5%@hs4p$1HrSZRTJ5D_<6cC31-<#@auXR;)g~a?a_K?|*@(9@0Kst&wG8 zU?}DW*YL`I4)xN8A~MX0mrZI^8ZX3&^KqU^3%$64QHw9+kxS^xi53gupp_W!*79I3-cwr*lwZglbew_WVE|BEG^78spa7PiVbcZ!4c=0b_+t{$#@ zou@lDJi9UigEBriD?$5d#X>)~jPm7EqH|j<56avEtiP%mP*@tagu_WX8K@ z3ombugJh6b#Bw%K*I6vfzjZ#ow$ZqLi^t^&%kCC#)Xv*+Q?I;t%d{@f16S4F&VM8S zrt7UOo13|ziMQSRT2{QI^qo6G^HOyr(~i$D^x1#C zJVvhGa$oq%pVJiT6=DuLJ5G<43p=yUVEdsR;!@tS@7j`%y|_J9?tQq-%*T6F#j>x- zBsSlA{lo9gt|vFd96cgW2F{*4f9`DaeR2%R7ozH9W;~kpn5%7<{EblS2h+4ySu?)> z?i#T7)%%Kd=hp^@yS5+C`*Q1_&4;%REs2*ol^=FGxX!9q+#5J_92 zba+Bx?QJo}!!Dn7S!bP0ott=Ik!P-4ptAUVwma#Pm)Q}YB4K~y_Sw7#?^SljZz_#*=Jh`E^$mmG3yZeL zQi3iu%csAbo*pWfRr-4WjbuKT5POFE>0^UskBHwfm#H=Y>=&W0l}9eJ9%DSpWIm<2jkn zeUttEW51v3GCxJ%&Y8AZ?Y;QB-^nv>{L(9}mOo~uF?k^IMt>84SO)Q+k9{t0|FlWCc*+Ao80%jedw|DOBv z{g(2Z`;R zZ`6IL=25uUKD$k4WaGcozkcep>d0wL>o0~moeS5PIz-I8yDfg51s`Wv%a@bdoSR-A z{BmHyKP9$f3(i%GW_HcqrYv!3o=ytar0BjAYrNw0xM%Ksw{}^HZt|JDu6N<-_|MFNO5UGDZX8N~F=yRF?Z&q$X%&_AQx?A6 z^!C=l&`&8>UaIYk=lR;{+O}e1#FYh3!3!1EDYktp+p=i#!vsf`&3C?s+h$&EU2Y}m zC)xSZe&=6Vmy5ek9G+7VC1|HwTff#P*5DPdbl0m~hrX;E&3hC5eoIvSKknqn@BI4B zoxSXpZN~qlpD6HceaygTu9CgGwRLBv(A9c%Z=pl-M>iU*e9RNI*X^KZTi=GnOWZb> zizUA0Nn791O?k%b8F%ua=9g6$3TG``9%&u8QP%sy>v^Gx3V!RwHyzn35p>Ki+AdMUQTmCbJX9aY!nOl?YRi=CaBW30-S#2)yT>+r|=3mykeU*$Y_+7;91ee$|Q zRL_yabJ_}hR!BJZS^b>;&E`z*r(bPdhIg)PkiPryu2M+Dlax-+x|O z;Pm)2<6nan%v-G^w@hL@@WLh7aXH7_(2@&P?Ri#rmABNdKKX~O>}##V_1jWaUDwQR zDVutC?QX4a6?4g)ep2h({=*ZmNBBKkZ4s!tZJ+z~bcvt)+@(E2CcZj%A?Rpp{|UDb zqRKyK=1cgQHS3u-F59tvrq&jfyAth6mTr zy|w-2#AnK3HD}JL%vyZ*iF5^XrT6eLHVtZ zlYb^z-ItNw7F4-=uci5=iQ9@~J(m`yAG)_gbK|_~xxQ0BA3hq=)sehyvU;eJS!v#j znEeZX1_~>2@T7G6-MKf>=VnuAWcrfqBO8S@cfYRRk^Ho1+vQUKZxw1&w+gYg!jAtPPrIuotMOV{$84rjrUq+J#Mxz&UMloxv%btxxZ;$*X)^7&pO^|kY0N&vbq=3pG)Z2oU{W1@&}z~q-aS4E^|xj=6&D>?me9NT zopP7>)`VDw?Te<~IU8kk;oRnvO>ZMwb$mD0T)TPCXda8z#n5)XJ8B&Jmn`DBV;8Ny zj#;8d+T^Ty)&st*sT(im&)3*7NscE;_}!YrZZ53*db;DH5?7q6Jb6y+&eGr8&Ryb| zy6szBXmexurEMmM^?s)a+}%}PFTE}Jg44CfnR<6Ot!69KFJnnq&|Y0xvwy1AEypia zEbo*jTYjD6tNS@}R)6G#_jYf>yuZCx&2HvcuuiP*j=YP&^_Mvc9jfnkn|j-FB8dB*Ly=h|W0R}a6X$?EG>HCM>S zt=I0K8ouUGhCu$8vi&DNU;W*^%{je(bNe4lN7;$iGTAD=flU>w+v{g5TsOM^v0lpO z{rR#pn~z(6`BWZs_NtYn#Z1iz^>?;{+l!+tcsJ}>H%D>9dJpL(Z&!VtpT6V$hKNr> z6P?T^ZJx8IURF_7_`UF!xac(p1J$czHmA;9_?`VjoQ>mE)l+`Yt~Er8eOZvQ&Aav`=Pm-yYI4-;>16t3=KRnylxwk={=U2p2jS?6!A-oMT@W!;ZeTkmr`Fs_(o znvk~jS4!pe&5Sit`z@^*e(}snmP>qlI_G?v(HYJ>^9@CPJjU5m(qx1grxeV)6Vd4s z8nVm%x^Bk0pCwb4d)9B8p6O>FJ*;xmOsZa-Y)`=_k* z-wf9)2i{K-`Fz~&_rgVU*H8I9xhcAS)r+8cdJl^j;tz;x%5qN4^emZAPEeqS%hh)yWwZ=;#lzY#g`yXnzzTa#O|A4bj}k>L1rL?PyxPS<1*L zCp-Orvf8?eix;;%UHI&qvs_v6gt_Zj3{<--6lT6xJy?kHyoc}b#Gh1H-jfu?`+>~kWQVsSZ1#jQ;65;?iER4$KUM? zx+h@v$XjMv%aY{p>BfI+4zez7?d`v#^;#<7{HuLik52z)_3}VL?b?!anM>m?tv5I4 znEm0IWQkF+j&)l3*T|R3oY~uBH?*y__&sfM+Xm_N-scrq;@9n4SktHOwz+d|Slit2 zy4-j(>##GiyEmM-vZydh|6iZeeQ)Y@yWM&JUX^K2m0Hk!!7^S^nrTzqyA|sv_L`Uo zdv`gNg_XDFxks?_iyP;~y}1=QZ^D_mLb;26Z%SV6zahPBl6%)KqbEyzcD`0G`^_z} z>e6Sg?mKIj)i3@2s#Kdr`{+iM&E1-JbtXLZE1%Gm>a)}RLfBQd-8{SF=4}j$t!Lk} z_IBi{tz1!>yKeLClAdpETNcVF^~-)sx&FdQt#NLff~%M>DSyw@+rMV>J}>j_2BOZt zUe={D-ZhK=7IZlENSyZk=h-%ir|j0U++IJkHFd&AE$5zj%3*er;YoXEK3t>8zDI9+ z6NlHCw?$7C_8zQFnNids+Ro@%dREhK>X-U@1C9054m0Km>??L+-}d(P`?v2qd7hf8 z?l?O`)BVo8ZZ$5irhem7=REkzZom0G$Kz&MP0+91Q>}x4n0dITm1|F2V^$f~=Bb@; z{5dNwYR<-FHLs=IehmmK^`|%5LH#lV;{Kb;&7rAN5A6|J+dh z&~I7(-^}{dqieqZ`NBN&n~%5K+7smgug|pQx>u-gZq1YNSXQjL+kCFxuKh+8{MnTn z3VhpMx1WD#WqY%-=c$eNXR*_=@##O+wS#{=S^3@IrKC#jl@rgbjl*u4Jr$f*&UCrE zzp8thu)OKhQXTu)WgjkX_Ave+&6#KR)I|8BRqM}Vg3lgruix}7Gu-)m!rjjPiQgSl zBkEba(%$?_`o*Dq=CDag`es&9!{@3qZSLQwvpf3J#F_VbP5P-*^g6D! zWS?uE`KxJzIMphdwX(A+u*h`# z!q^-4r#yKh^h(|E*x|<~d=`A**%_zu{=s*JtYrnvJyOj_FCSq09>2M<_dx%J`qTtz z!Qd-_Z};%tllj5e6nw)g^_9FHWAHjZ#rIFrImLpHHzh~3d@qb!eO}7HzQSIy`SIP! z7J}KmvQ{C7ly@&#-x9pryW;RQAwTz8)jg`O^dG*xIP2QBZ_l&{WMaI;eEEcF-vvzMw|FjR@?6c~2#xJt#{H6Y3wQ7x)*xH##mS>*xtWmpW*Oz{* za9hjsq>XpizWpP8xp=aW!=1f%5nZJ z$Gs{HU*+ci zGk;Anl9;sgl;;e&TUBDeoi^=Jc{pi}-bvo`UjjS!b%{JKO7>6^Wpui9CUf=bhWwTk zUB**a%=EU$tWYcAd@}FKA-lOhJ+{1My0$`aDfj*2<7QFWytiT_+*@y7Y(38TdPUk^ zS!ca9ix2TX*uedI#fLzf`X`61wBCGJy`hh*o-CBcn`aax z%8KqgP!|iL4#|apfmoeH0 zYbaklAj+)Te8zz3`VQ_mkGMvqm$(009gP&-w`Z>Q{n>GbC*I`L2c5pd%4{!k-{c;9 zOe$mUjHE4R)K54!R(==WDPk%&X~QDhX<~<09Gm1eQ+WsXoG|@~XL9u<=gn1fNjdTK zu5)J4s?y8;y|Z83-1VBD>FJigA~mztrnpMmzH7YEvPG`KZyUqLf7>SH%$<@1_^bxmeouW5S*HZ$GqK%3rAbubT66M~m;P z|B3$-+Zg`tQH+}OS9adv@7haOtXEdy|1hsRM8*6q-|t`N6)uHMVo(12^!AJlt1sJD z<{LeqGxJx~@zfvl9vL#29mn&su2Va=7)$jmnoXM~ZeOPUoJt zqM=srM*-`dw@vHUHvHAASjFU4tM}(u=8bx>=8Lm7-&k+?xAn%t6*uL~l5_vuKlMLq zVzQ2N+8Sr|wz{lC%hHpr&PkViSe8F)=Dx~!z;_=AeNG-$UBm0lVJ=tar}+Ju?eFLBXR2s%Z7WYt zKYL61b;s^n!OCm9o|df@Jsp}T<1vp-Ym@U+&aP}lR(}@NYMYIB=N0_+6jQraHT|^9 znuv}0?Kbt>ni-D^``fImTphAHd;f>KK3-gNIOYmyvu0i0`s&rJuh&?THMWE-i`^*e zad5+uE$@HKst&SPZ`z-{aPHiNxBXh~g)Yp{xOzT`c`?uA<9}MLC%Nz2TwbDc=gI+# z!*9ZBt2f`h@&1j8`F5$Ve!D~S%gVmTU6VZ3d%q)WRr87ZQwjBXJB&J-zDPQ++f;MF z;B)!K&pH$4U10O#c`SYSme9Hd5eHb-89gzc6!vzaneg?00avYjg9N2!Bx(Fos$D92 zcJe$UoiIJ^$bB+e53TY<40Wp=NHvhD}Bd;JoB|&Naac_xdl5X)AW?y=DJmG?U(h zH`8~S@lQJj#e^R>N*ph*EmcXl(h@Y4u~+%4(1mKQSMU7o-d|+!Zd_87!<)P zpIm;(%g=4By`qYxH$Ppt$s-*<@929!SEW50!h6+cXzAIdDZ$)@^9Ib6&BYvZ%UI+Ja*&Ntd2<@9uqiIZL^AkW4w(7pRJEH z&I}2;KEp&P%RrQ0{kQb-!)rS^J$`{GSNtR|LM9-|B)3VjgadYA1NpDh>_w^^Fw%w>- z^||%LsVUs&*XSO+X>{(8CCl|AwVd8Fmo7=Gda@!;!ex!Yx1u!~2aSHrn9Y=@_HfS{ zbBWV$XFbe3oAo_PSCo6}k;hRnhkiybO*`SWV}b&wdkWv2h}>6syv9Xw7Gi$$?ETCa z>%Dd1zIH0(kX8MmFZ*`fT7G2nLZ=%c8a$ttuKYOP>qw}X}x%XWz{Z=`IW0= zUQF5OyW*T)LXu+B_6h8M0ZGqlt{pFXBcM_yq!Y@^7h~1ubj>d~=!UL_28(-;vH4sM zuHX629>>HE-rEzi{N0Ow)v13irCvQ`nOOZ|+Pxjy{9g)PGyS8ivmz$#*c-KP{SlWs zJ1iD(23~%7YwC(uEotk%ZnP>htB+ZBL|ZmNT`TiNclMeCDG|OF2MnL3=yz)qiW_(UH zS#`vzu8hykgX8#4zkpjRj~UiIHwaS_%)Ni@#=IHZ^tWBSprx+-=*VZrI}v9L zmt)U+R+2F3>#`YL+rztyqJ9g!_I_21 z!U7)IuGHY(zjS}Ub5`29jc)rAC(S>g-u(~99+Sc_~QVuPy(7Sc*nc+iQ$>}e?hja@B zf7iaauOsUHM>F@|N3X5Q_#dY_DJa`Q<=wMjrz|B2{`8V3T2HvXKe9Xc`uS$nLk|{c z%7y>3+*=>WlHv5h*+SX>@J~UjQ)a?{g!btq3w-y#viu>_LYcK*6%#})+!FUrdXYL& zwWd{??eeD1tMz}?R=?5tS98K_X@7q;OFx&prA4DazPH5@CJ8Rjj)1dI%X-B+SKNHE zN?G@@K^w=rSBDJJSZvfDC-QWg9k*|M&2!?hk=!BSmZj?4t*5SP&A!0%tS=-yE&kBt zmeQ-i7VA3q7TFwOd7Ad4GU{0HkE(6=q_$;0tZjT~-GhdI_!s_L5;U{kYLeHam-h2*&HER%JZ)R--T5Y6LhOIGe@xS>y8|K zw4}+T)Oh#IIVum2D>3+mKDV!*_))6vlu^}QYrWV~&$-O@&!?}L^kkpz!z22v=A}PG z#oJs~X-_PC|LN7Wrk%gcf2?izC;L2BcbfX!Z^1eY>Y`UwW+YqMef$2SIpC%|r}sVU zeJ%EdZl^bBuel?V&Urt)mTS+G;*a8gLXXY=s203>pF-f|i_cfJMX~=or^S2R=~ex| z-n(y%*X#*X|JS*_W!*ioeRr&8TK(5`xcBgjHF&*(m{u;9&O z-P{zuso>kHC$|*3EO!SNTPQx#f1)xw@Y#xv;8M23)twF#HZ5*H=pQV0`Ay==2(`#5 z=O-;VChKW2?Z$#{)+aTqz8*H|J^$S*gKc%s>v|LQaMp#BT1!=rDd`Ga z{cE8s!a23l=6#5Wwc>IZ*T0& zSsZO23F#%yY}t&V9Q2*vz-=8pq06H`hlv`cCYad~KHZYq$E}JJ~LtHGi$)t-%s8C>{W*DUg5#pHi}8}-+-~ciEb+bb{*v3H&h#j`*+Qi=E=M;#PTulg z=6*)UqjyWzZdp6ScH?C4G_yBzL<9`K8{~@b)VL`0R=EA`6OF}IyIM8}Db=tZzplrp z9CyQ3@%VF(%c=@ZYrf1eI$M9%yiBcw)*7=9|geEP44} zOdz)tKWp$dab$7lIkJnyGl(~ZTqIgYnx;L%-W`YbXHe^S5{u+ z?JZaLr(WN6*7xkcX|d7PQD*O>_HSH!)YC9eS<`D)rRJooe=M5)3@2T9Dk83yRR48) z-|}}0M0N{I4o$9}yX8E~lbc87!WZ9)3;Q6t%s9n;vW)z>_dk!7{W!4trIh3ITYF*@ z&dfEbQnpgK{Pj@aT~?DP*Q=^r-qbjR%zL|ReSN?(>6dDUep}Br+rE9<`p;Xw9oey; zyRvDe%cSM;!K>vSzL$IWexAp(XC2QUMU?MQSFKMtypglOuD?0&VciVX>{nhHf^tuK zS99&UIz#H^;W_n6QT>zcy0$j8-afMRT%BL~n|bo$oclZN99L*4xIWvp;OGunfznp? zX_2j4R4*=1+2x$_c~w(o#-1YIR-O|j)*n|Sn?F?++4Jdy!A7;k%tz1sE)lQYHsfL? z$E;hZ7qvesckYVocr6RcHxY7i}j@} z^Mi`l=a@eIHOc4uh3VcKI}NNCx$JiGO8xiOUsb&AHkXjp@{dzn^E%b+_g@Ih4inYp zmP|7#%`d*x{AEIq(yvoI*0yK<8I%=RYzx1=*z6Z?;H@i5F0Ey$pSiQHQ|@U-U!Sf( z-*dNOwtmB^trH^sgr=r#(+HTa<}4EY<$vyFo1&~cvpRQYPw`lytnUKO?~6RlQT}rd|l(?FTB02$Y5QOW1iVNmoT5FMn5%k|D>AP`X6UK zncw+E_Fd71?UpwV*+?A;RlYIji>z_we|`0HOzmr~ZBgm(^O|44oP6%lk>Y7C_4lW~ zOr5y0TlvgFi>}oPzWcP2y+UffdUD+?>q&nt`fH!XSN5By@1IfUew=msJeTmbpA&by z`*lF?hg#J;(Ogt!Ul0 zPxn`>_BhTX`_$^$%LtJVuU8aZeUTyKkb76)oGsJ5bAOr(O8FLRUI<&h*s}NQ*Sd`_ z?VHZFxVLXqHR#E0oLjm(Mtr&8g+kBe+0*;h`N?KU-E}wT=(uI_O{TTAe@>r5l_CGs z6~|aNL@euke`Z7P2kq7QQ(NkfDsYPT7%cdCkEO>UEoS47B0a`5*tzYe$gPugg2Uj&FU|UoXMVWL>^(d13QggFLM& znbO9FtEJxUXG^o&`)hAN-PG-u2G1N1x|mePg1H z$cLM49}5mtbHraQROwy6w6H|NpS8v{Zo6)8dfx-frt|N%$up*(W30Ltt1@rDd&MNr z-zu{9G7Em+o%A~Nu!eE_N2$kLSLXBf$vpoW|Ki72hC4lK8#Uw0z1RFQFZpve+{EIO z!u$V+Z{!R7Ub?#EPxeX%o%9Rkz85|z-Oj6j{IYbehr-)p@6;624K_@t&DdT~dy`xs z%|Gd{agBkqHBZKG1+O+wz9lQ4teE~$;>z=cop<@>F5^#_rf}^1;yb?I(>i{4v4(79 zEM2_Y!(#I8ig3xPQunSL%{wx?qWS5yl{pNlk&(V`elo?Me`W4lv}kExQG4{I%y)a$ z`F3@mlC9r%*Xc%4yW-mOi5E(rTsFOtn9^2gUE`Bj@Pu>QRo}`tT#uU7%Y4s8vL#J* zxR|-G!tQjga86}gp~Z!H%Usu4m#(sLF}1q7`Dd3;cJkbcQ@3u#x$#=f6^+ok+Zwcf zcKrEknUT*Qobdh=q_^|!wIWZBr0s9T+P1wnD(C0EzfOB`y=bOYen;5vt|Jo}^*7I6 zCN}rl^oy=mTW6}vG*6Dd`%UrIotN8KW43>g`h2yrL$B=f;XcNa9XI1=*OXn?-E;0= z`i7d7Z>t_UJ?l=|&A<6>+2gaTf;%*ey(C(!eC{?Hz48tIvEt_rcN@7S`~2*RJ0>0b z`Lroop8K#x-pS*3k98NoK==N`cH`-RyV-};R<`stB}5|f)V_jS7+yc<13Kg228ZG-0v zXR)VAOia0qVulHv`g^;jiXS^kJuI5CIAd4fhO8-bQWtHJIPbR9vZHF9;T^_L?~m@e z${;mAC;W_}hCekeD#f9JKkGt%E4dwFfO!Tl;(v55IconFuWaKrDg z(ru=Y8?QFpxYpry+h|UrwS4+5J-4a4omsc*uH0DXy7q0=m796Vb*YAKv#(B&IkR}~ zQwuX6fA*~MjjQd1ZzyaEnYHibTHnjXZ#G)(-QdU)xnOPmww|~r62>-r+GPJOWehPm zb-HnzNp1iAdWj6{woAX%bIP69ZP&|`eiFHN?LP^twwG5Aoa5#Bm^`=c*0DT0`vY-y zF8i;&+@AUCufX4>VaxYVzi40j%l!Sc0)ZW2g(7=`S4U6i?Apcm$h>-ao@QN%NyMLP zxB85{J@4*FI4Be0Uf{U#h3Jij)h)Y=i!XdJv*KC3^M+UPjjYc%vbb+%P5-p}=nKgo z+f&*8mo{neYTG*WUtsC~)Ko`->+t zA2cp%J0lvj-0LZ)-Zx*4J4dF?ozE!RdHvM|_7~2f5}~$-CHH;){Q37+UWW4q!UcO{ z>^5z_v)C>$IYqBjQ9S7Ot1&HwwNUd&K_akBk~l;gG-{qXFcmduI?`!>(LzGdwU7MsZURhJeg z1~t1sKe2jyxV1^nMU@W<4?cF-Y8_h^^8UB-OS8t8AqQB5eoSsC{36(s4;r*fJN$F+ zSq27%H;{WT^3ud7OV#PsZ|&QKdR?BAI?EGv}F;(OT|} z50rOmG;zxxXcsyk;_AYu@_bIsb8eOQ^6T>%$~K<*U?LT}UG7cvyKk;9ZnAH?y><0A zY1WM)HWLFQxRv|^;<;6K2$tM!r^UATxeNYxs*42%KC%LT%Y~Ru$kTW_UfH2u8Y&G?#g<)nB zawbGcs6Jov(4lD+M!VG6rkS1HA=_@P-=mr|vwP;cwbsnj)1STWHx8^3dAP_suV+bX8+ZDxFVFhFde4?gVU-!IbB)iwSkuk3D*4mPzzgE}FFlSu-ryQA%WOsC z$=tr4v}3ypq%Pmt^=sWFFUi{vmMWN5u9!G$qe-8jBIEaSD_8HYvg(ernto1L>s&x?As`SgRzB$Tvi=RlisCRzPQin(*(`QS$b=sT~42(GBKU^)H`^s0k zpjZu`g3-{+0-cc#)C$! zY+<`!Yzo%Uco8r=Zh5=e<);@qUl=eZ&DPSj&DE&ae{#+BZjlRr@bgy(66!DcunV2^ zQJCeEqO{RPVUh&1?X;Anv|W}PGXHB>JxfrS%)@h3sF|_2US(EiKkGT|b<){o7ezUg zW-ciezr1JHWz7RuZ?6nrckkeqU-g-NYzJS5{VDu>ZBb=^`!9_%DgMX#X55Of-dke& zRwy>+@RrKb#?vM9hkdT<4%JgsEot=3SR7G*#8r%Q^9lcyU~5bN|C%H~IBUYoKq>|N)Q zmgS2kF^lT(_o#Xqs>zF6f70yD%w;wH{Wz;J{7YVDwpD%Z>TVV8m#Ue@vwV*lCF|bp zsBhzFl}_I6`%%$j3s=$AU;Zu&4}MNFdwVL~fvq}oe*2~^@^X_ry;#`&S+ji_LS*Nr z%4G9jsCJDrH`1MBx1V?2*4&UKNf!<}>1dvNwIJofZ$UPpXZy|_$uMJnbcSQemYwS^ z`G%LDEvadgJu_u4^QC`t>>ezf{o>i7rPta1l)->%iSk3O*X zk^gvs{pDf-hq4lbNsThRKBZ+{lWXSKDPG#SwP4M(H+>I7isDlon*J^?@H3g`Gdu3r zmXw|Rm(mN)EfCYobCSsWekuOa^CuGyKRUhPg5}c5Ruh>^vwquz%=FAN{4TC^NON5f z4`=zMSh-!z@5Jg?B&n69x9u(AfBPxG_U`E|OV&L;Gx3d`;=}Gq3-V4d6;{6V7FziF z<@(l)gv~rZesqc6dG9{2p>QkjlF1))j*0B8c$qCUA?(8SNXzviyZc>D_i(GUYgKwA zXfVCy)r+1QF_nXPR%nc|kR&&c`?pz*jF){_j3x?NSSp>`7m>E3vOaW?@=S@YrEW|! zA9}FKrzMpBe0J|4hs{!R>rGY$v%Hd$({vchWhd`mv*F?te(AG6D_hn!%m`7K)>gh; z#Z9q=|I{=G71m3i>Ueg(eEsP*v-8R)9ETj#ruusC@y=dwQ>SO@;_d_ILTp4LrXI`q zH^(9TlF&rc7@irdFQmEF#7&K>->Y>|?5u-g>fy#eN2YEp(Giw7m*RGL;j|i^oM{_o zv|mycxT_?1y31|Wmq#rb>Xt0AM+=;H{t!55-L8|#+cA-4Q)Y*{P)C#JhUk4J5+1Xc zg?TAV^X%U8{a8XsN27b9mGj9f9xUJL99w@Bm$GIAoZPVA@%RxTd6sXwXYeqS%E`K%8v&X$$+Rh%>P!?V_>;o`C(>bu%s?r7(`c%MNj(u_|SPKUerU-qn-^Dk`8|MvnsT4$uce2=S|BKMi0#;$S01YensUZc6OhLYm> zdyAz09PXR8I%%=kgg?uuE(NUEqK4YQ^zglQoNj@5mfn*}-$3Q>}X1KgmYT#CPYPsQa~Q9ToZKTopI% zzxJl%nQwBKW+t=kW#|$NteP-!@0a&No^ea$8T-#h2z#8lIkC%QtN6wTy)CEYnG2UI zJ6kE8jP$90{%5^_Y{wtYy^j`7f4RKK_`vGo6#fLRioZKWKgGGS=yvS3wKh>{%!oD% zp5_|Yykx?mQ|vSKeqSz*`02Rd{q!%|o=N+~TEpU!B@fhBy(s;~duiplf2m8hTqzBm z_OGY%v+l385y$HtH%`?vc~NfgwAO*|!p+;0cne&A#zUf_PVOnfR+6e-zomBcH7jmOtOLbJO&6<1z@_-^vg`n{d^ zY(QN}Ri)l_r4=7-mK~5^J-wcHUO&Usb9_s_mg(zH@rgfQ7jyH?qoYixt+bPv;!b#{ zs%qUkDw?OcM5&qifrm|cy4JChu)8G-ug=#x{B+Nu!>21$lXBH=Ub}tq=FQp5-^h4N ztY*Bv+k9PVp{-BK^S-mbuVe3Ic$3PY;yhLXYbW(t4z41`KHI~3dVk*9 zyXe@z|1bQPGl^`{_#fo)V3r?m?;e{27k9ewd@=E6x0*R!dauoqL=~5Nx{-pKx9-XG zzbpLs)#rJc%4UYHU#u>(6B0u5wXgnWY&h7k=UJr1?V}HBU)D=%8d@0sP0itvs6LX= zpdPL?$>Uu|Z^U}x>D87;Gx_fykYqnufA#J3TOIRj_XPAiCEZ@Q_esasf)$A({i5%t zhsenGsR*UntW~|8SjtnE&sZ{V8_S2<{)6wGKhC)I{E_|V4~&)5KX?RfoMx!2y?&bZ zTz=30mh}wLl2=zYrs%ZSdoj$*oPQ?ya{LE&+ZyG?NpqW(G7r3&VD4b=40pZ;|FCw1FDoc~15Fbecd{*x&% zQ(te-pGc9dH52{|$!TYKq!|bK?)b4mWVYz0z{rg!w=cetBC<`F@lJ0Ri)($X%Cw26 zynL4YI3U}Rks6urQE1$9`Mt}U=?xn917C)DZk^`)##3SP&L8tKw^pn)d9a_!SM@W? z0@t-l5$Xx4Au53(`*@A*PKT_J$@<}~VJ>lXqx<4Y&1a9|s=EFKGClnJG@tkODUP2~ zF7Zk(?^%@H6^ars9pz`ZfA+__ybp$z^=#fs=bx>(e3<_e%bx`6D~hg5y5%>W(f{A` z_~~P&CH#h~r1_6XnVQd@`C>!F)0s^jHhBgUyB}H|yXRq(&DAy2K6dfXE8O0Htp6=* zfA?U2dX)GI@0kXP7ay%U*dUVrazUuLn-JsANXIUppNbw{ej7#CNO@l0EulKm|FT;2 z>CFr4yXQ9rnko0C#PrNMzI)>uw(^h0%lF(k7vVf@_Py;#zw8Uv+ShgP^Omerhwlqd z`CNO#VyQfLxys%@YeEXOe^?&aw#~(C8q`O;Fa{HlMJU%T>t?;j0s#xwN|HWPU! zc1>EjiQRQBlhxo+Y_2=%)8(2djffy;@8VSe89;&Nx{U=*#p5o+4`+9j#9y8unFUPlUbesNcvfS`jZ|k+S*H(o6 zU3F{f9rm0h+D*l;{NiI*E(v;ll~p4kgyYNGZpOej-n*}~KG^i3nZs*sQMJI#ud~ck z&boxeP1^G+skHOWevxx_0^U!Q_j+#?pU`!W)lc=aXx*bA>4Pg2xD)2N@NCKav)=5r zd3fo}`aLH6{VMFStAsZu-MzI{Z)<4G>O;X(md?uSzqO=F<>Be|D!(FEzut2C;A_!W zcQ+ON-ZK5=pDhc^Iyfe5H&+jiD^-2_X~kTw5A}|Bd-S=qbh6jY`ZoDd+Fz#`f_jCA zOh57DO=l0B{wjUfhySl`7W}IGRJ20LB8ZnE$k#t^Wk{JxeKOy)o!=MS;q6O%YPf>6 z+pqS@CO5^Ice5mJcr1)6JI?jI@~YfHm-zt=b-b#V+m16_nsG75?SeCdn2nJ4Y5O3L z?v=`gt6O4L8y5HP^jBv$T{XFR7bC~k311o}Ewf*kEwFaU3^9=@9&8iVB{wr36fwH~ zCMfd6CS^;G&+}Rx1n<^gmX*A#=wcAs?ffmpo$X9W-I8TrKF?g2cFCk&CPkt8=Et+H zc{Q_@?U%j2=DoSZdiJV|yEuPeOy0`BSHW^)yT%0pzW1{hR36W)t9Z?#n^7_0PcQ$a zM-Q5}Yh=j^Pu=L_FNMBbYuRq+d9MEBN^_~c z%exA`v#hQEk`%rAZhCwbzi#e_o9Fr4Wh`$M%&>8^-xqVKeDmDn%j<;h-1;DJu#)ex z;A7+UyWyxOOdgPr|?Z;A4vDXx}aUjL-K%o>LcKNOMecvs3`=@Zz=gG_C zr`Y^e`g!fZC*KJzxBAa>R4!j2)w=(yOYnr5Mj5XAf>q~k-Bmm(O>#@$O?%dZw^B@Z zZE8#PogH^sV$Py%m;QNwe3~1z^jLu}^Oar}|LDSCncv?X*R~g4s@?G++v08L0T!=wtD1DIs_2W|ZRIcNlS{l$VPUlN&@t4pOe>|pt2_dyC~i+*a3QZ}n+g*xxQE zT$N>F`}j%Li}M$idHWp=x)YD*ChY2qD%mYI|I$D0y*>ZAXZ<#+lnvg}!n3wp^p|n= z1@@Z@_&bx%DfLPkI@L>9nXs<3_KWoTVzzU6#=R}Zb}0`UJyY86wodwa zwd$LEx!Ss$-UR$}`m*;|*x$tKY6j9Q7Ku#dhgjkclyCpjH}U)D!~)$baW@vMt>vAS z-?n?+g0^Gs`kP|+l$^8`$%v_{JE8aP;)C{MW&W2YZ=ZO$?EhJ_7Y~m|)c?QwyL-|> zU-gse7wir6|H*!sap&EYXYCT&t)cgJ+&ksIG+$=<@}sZSUfj0)weQEz{T=h`MdBMa z$uAc_8WeUQNGj1x-}h2|#`8Zn6TQp#zmT5)i*HS~!i|zSas1y;MBKBxKVyM;@t6CG zzh!pMSiyYk@r7eA_sm^2`w!o2{%uuBHTAE=eG_w8Evwk;k1fBqf2-%MMZO1~`^!!3 zH!@z?xctnbva|1O?&>w%^w>Qo?B%w;sM2c2*fqD$ez42jojEn%^a#kb$hI9)qi%uiAD##cs(^Yar=h_-jN-%|bbME_vqw@YjIl9u0?$8Kic z!7J~`eZ8$To4epn_tFz?udW_zJC^+Bjh$Qi;h8rtxBK<2Uic|$-sEKYLnoh4G|t#| z|6TEo^`}2BnsB#&r)sNZ|9!clp36G>W10Bo%NCim6&_QmUw^7F_C(}qUXGX!wYnPK zXFu-9thYRueYo!MJucxLXP>{B|KO{scCpN)8BfZ;C~GL5Iq`N2uhjiE1L2|rT+Zi` zYYh2TJ@qcV@X<{6aj#^MkZ+>hs+Bb#ebz@2&V^_$j&lzGP0#4Btg- zmBQ!V-zDHw8DX52;byt)`+Lp2qa{0}*Of}o6~B^MFl{Q^!lnin|L(3RImd0zJ9OVv zzc76FY@X-2bC35bZ{72M+6gP`_BnOWCtsN@KR5sXm*<(E3+)8>x})y#$JPH>CUajY z>wmzG-=0yg%FTQ~9siKdXIpw&MP5q%eAxcY)pLX#O%xT{*&nVa)#jeT!T7qK`e%n;`+jA*&t89j^=;{whcA6H{=C1r>mm3-@dAM zH*U4kuHIE^^1iQ*Ub^)W$9>;@nk_mlEbRwZY~RbK?~s+q$uUpZq<{H?mCMh)y7QT@ zch`$m~d~6s8MY(+RP?z@WXBQLH6!&?_~#P)X1DTZjzq)(=q#J8MF#ewAI`xd-?x*{I>swdd&{SqZ5v6u6fH9dh?IohG*|ef7m9x zZ~v#Yp`H8P!dE~0Vmp?9{_*pM)$y}z1-I*6>wYH-d^&3|bH4K#`Q_(deA`^&vfcfq z>)m}W>tB4E{$*L7?$bNjp?Z9O+2x*ye&y8C=-tpKcZ^fSLp`JKApg7t#U*nx#EwKq zu<+jgdM)DTia(!gXA0#6?wb)7(cR1C{-<%9M`g;xJb|uFVRaX_=p29Ap1?%X z7ndwvbgDj1BY37l;*zj`7Zaz1Y3TO(eCj{U#1O~GP|-BuZvPKi{txH>N>u3{&+j<& z=Ueihv=f=xrgPS=bK86UsWIPWr2}aSlm6$qZmQpX_3n))#x)micP`NDU$|I|Q82nG zNWPsXR^h+bg~PiFPUxx@tv-G&>gnoFmG2gA{@b>mD|AzMaDBwn^51)R`K)Vli~qEn zv8bnA+avJr-J7lN>pd~#&E^o)Pzg@#DdZW!^x+l z&#b(ekTvISt=;s`++U(SU*&TIH*HoBtzB?gD0OQ`(Al%|S3Ya!(Jd@j?G&HJnb25a zqa^q6gRWLu}6r5)uXr9yF{M1Z;*9< z{DiH$;dR~jlGRqC>^6 z5AV*p`gGgBdr?8ZGw++MTz7t@ zU_sBk)tE5{59BJPjG21cKvxbYU}ov z&VYqSGFtS*Of|~$uDo^J<+)vcL3C+#hu!Miw_obrt?S&k>b7!;&-VVs`=)%;tcu!x zf7$br-$H+Vwy(b=y{mTey@_G&!kMu$7v6fst-n3@kDS;K(Pz>nv!CtVCHwgM>u+lN zVz-xnsK2{wZ+riXZxZ$1+wVVm|EYiCgnj4Fzx?O_!?cd~@AV(LFIPujIiBm0xhwP( z%Zpv{-takSCFx}d_i}DXTPF{MAYEKC$*>Nj>pPYv95~r z7w*{qd2XAHO-NkAg{W!eYoz}6ZFOPVn%*|~lYjI!N&l>5?j>gp)=!zoKezG9hJ{(n zUi5WomuLx}P~Exw6O*&<6PpXg;VI3h@5RdmJ7gQrVQv--x_#c^)fuH!+v<6&r?;+R zNq@HSS%RTseNu$(nfGDWPu#IgjXp7pap|cy4%ciNgW_V9FX>u`&HNdv!XK0>{O9YX zmRc#ruS+`{6mnm0Vk*6Q?XhG0znPb%^qlT^A1F6>+n#*YZ%(yt&(kUyqqb6Z$D8d6 zU;8KiF+Q)gPFdgllFmK1%@bd({#o3xqg>%*{mf^p)`oCvSo>SYdfRQC{_OU)OH9%F zx?8?ZyuYnm?B=h`jk;aGrvxa^f5i~BqE9*Hahyxr>VNE@S!$(A{}{i>FfcG%f+yma z%+;%Z>nH3e(ssY`kdx*Vr|tyD!q6P<)IbMqQ?+HCoSuI>OeKDr-{m`fsBWXYM6$|9 zvprm$GL++&5|8=6>Gu+~?ex?eX#Zm?92y9iF{-vHH^Rthuj$ zAIe-Iy=vcLy_LJNtCt;hzFgY1?Y6*@--m>31h(ur-CVzDpZ1r(3Y(ZqliQ;kBZ6!f zXB4l`@an(KTe$j4#L|fUC1>8dOmjW7@B?#^>cTC1_U+lVZl4@ea>w;MC$1l@y)49I zye>bZ?Y#7~3voa0d~R7E8hcn^Uz5b)A9D6jW*wDvt`4~`T(u%$f@1BWd&-A0KkQN! z;W6ZqaaqP8dBg1RgL>J^hKG0aY`jxe*S*kw`h72j#*G#tD#9JfDH6;c7rUNH@yv|* zdStuUuVu+oRLfVj-8!uxvaN~7FwdpZDECOo*5e}bLaIAr{T|3HYd36_Y&)sP$hC>5 zOP%$!X9C|#i?qTPeVTe(`)Du-wB)(Pi6GrzN)YT&#n z%j!{L%JtU!K@%3qX(vc5GgqDMcRjJ;8E4O>?H={PFBUT%;XZGlZ1bB__`TwM5w(f$ zj_8ymO=|6*QPKT_eNKGNqeVO^5qZ(k{|-nPe%^5<@tT#-sT(Jw}>d$%|b`WVjFOi$I_UfX1Oq=zjOloAi2cLDBe%P{iyofao4&6&;o0x!pScg1iLu7T z$LUG?$9cDXztX#BnfSK7v&3JScuzSaeD`axtl;Z55l`=$n-j0`TZ`Pg9hbE?En3Ul zRKL6aZ%A65(TN+q8OsH84YQ^G|10y?6#JE;vwYKq8*B3OuI_!V)Z*~c>${JKdZ$vO zXzn8gGov688;O~zDNWon%lXzW-Lmw=4hiuYdneaQYTWE?{(Mcgb!T^z!_)KSxhLnm znsQhx-C6JAL4}(B+L;%b|5zB_*;*;0@kafwioHNYT!idW_w8Gy8PiMOF6+_snf_o= zkelG-$ukb*NG{!<>6h@QV}6g8zFz%j34foDA+iQFTvgYt>;x7_1vxwNvcw(tA8cmKlu3-x`!OCC^h2%o)G&3N5Y)&Ku}?~Z4j zbG)2~|NZ^=Q#JD18NZ~qcWqobBd$v|c~@*HPq1)X?$T9d6DQw&s&?JRFTwS5P*v;e z?0NBD>yv_2&wi;edNw6E^sJ|((ea~7`zL7nO;|tsX21T=Wu9%N@2aLu<(c{M#JDUa$AvzF&t7E`Od?+^Kk} zM>{~$iZ_4z+HXHz+~rVu5hQr5uQW}mfFGJys2EtqSsNB+2XLlg*y-DJpG}h9(W> zi~~On?j2WgKA#wKkd>|V%B} z#Hswh-bJ1Kt{fA*@PU={jcV0x9|iKZoG7{;d(ijNPIZ&;3hlNP6B-`17khP{P4YW> z{71_})ARZj)w*AfKks{^*j@Q@uS3l2J6flYsLb5Sk@q;5Q)lanH*JC^LW;MG=uA$J zteZXYN1{^SlV^NkAvJC1H7ArDo?xj||Dk@_u5SG$W&2Vr9!76b?wO?MDtyMrq%I+a zum8gJ9qR5cX4k&-)YU(i^XksTg;E5#A8qUSvmz`d8EG>_4zq9#0#0u`N4V0_>2ABgAR7{?;d+?Eph66 zzv}1CT$k*M)otZv2DA2W%`xf|H_6p4Bf8TFq+nE{j}s?^dreF%WtZ4sA~Q`Ej#72wZW&(YTNAF z8?p+rKOEb(@!zCbZx+w}#$3XqBz0%8#4+ZqS_$QYznN{g-sRphtv+2+b0|(mfl$O+G6JfT~li1&GwGdysI$@W8{G`jz@Q!Wo-7ADMXHY1`Gp%DiZ%Vx-<% zRx2;>yxY22F^~K|IVV42uW#6Y{QR-tQ%WCC*UtMqr+8j*UVi=GpC5$}C};4*`}@zn zdOmCVYv)AiSIbs?zp`kR_2P}0h38A&TsmRM@-ir*X?N2k=6BP+G+t=0UuR!*^{m|X zn81+Ze=l|Pd#AnlctyZ})iJiKr(Q+YpWm({)Yn>aa%xM~&Y*iMR>V(A;8{8Cv3Kkq z6WxOW1u5~bz4IcRtS8pkhy_*4KkQ5XerBJ(`f62y^b;~4lh;Mwd6(V$ZsLW#EYBoF z4wu+wmi^t(rx-gwIO6h0Bzw8G3+*k8u7CcCfYaWzj)f8x&>(aR3nZnRFmGEFSiK47zm3fJ^m z&ff}W$1S_~`t4+c?{~KN=65S@+w{xtpsLRD2?tVdeG2`2G;eR&jl8R~+Sg0}-m0=r z%j04FA)9lLtqvc$8O{@4K6%GVht5gcMVBZq(~9W1VaqC+;{46Qkx$%t+oA-`OV>o6 zD2JtVyua{R$=k81ZiR@%q#5eR4m}hOS+>LA=ob<3%E?W+P4oDTz*+|eCnO84CY1KneK4jygT9Uc`+kKu8&F#t2Z+6Z+=tWaLGL3k=WwT zGD(nA-mgjQ))Qi4U|@vYLdm?+ygoN4__|~r-?rrAds&n0cvDT=CLEFfm@!L;NjFnt zO{C`ni5EPPo27r>*m>le>GkU@zZ}E2mCC>UwXtvOh5piL^RUdzGp^NSTncY zumA97XL0-Qc|CovZ+b?abN#*eW{rv9*;z}w0LIFQ8$M;FruX`g`Xy7V&d7eBJMreM+^D(=*06b3 z{9mtJ6sNa@uW$a8$lLv5vsOi@P28rqnkk##V#cgok>K{c7v-Ef@h&_4rtkJR?4voe zW7?X?bJDDh>zKDc-+cYx6&>}Etc!Vzb8hf+l$7Xgy*|hNx*?-~`gKFz(;JOA>~HP( z^#9AVI&JRHT#xMkJ)uTo7roNIFhE=X1WC=~ZRW$bo!oz=Sj>>ncU z_>zQ`m|jaQbbjh}*6;STE8cZ3the%RO*~zdEf9S{Z^N#e|NguX_#ozMtG=PGu(CPz zxR-d6V~LX9hE<$L`j<55N1Ln;a`tLnDLr2-V&Y>to#Z{sk_xYAvDFv!ACP6uync7S z=#8-Qmnj^*l1~qu;9yEmttb-uCu z!0*g=Y!WnnIGJ3WUgzq>Z5I6UCz~#kT0=XA;U0!qW z=*@+jbh#(>e&}&nuqZlIY)$R#JBr=vA5sL;KZ!02fBujK0;~QOxFy#)yB%3 zBPP!|wkxw``Nl%F+4^0!os~H!zf=n+=BwFt=NfyQNvK|t&St&t;o}OOE6RI}U&zlp z$o%(SB~Oac-+f1PzMXquET44O#w_*FKFJ!hH?p%?9s9riPMUe<#fuE1H?xmjypVkI zdtr>EN1yNGii|0b9&yimVBK<4|EqaOqMk`fcQ2^eXJi62Q?;q&o|%(5wIeE!-` zS6(m)qz{O8PjD1e#`zfidnYRIb-L! zGr1oRKTkjXeY3{jJ^lr<_D47E3i?rauvk`l$`cKan~S!*k4gVk5u<8&z9xBlLHpk()vkm~M}-}u5F z#V&hL&GAq@qILenYx*15iX*x!fBj&1{V}`cqoQYROYaZfcZc#l-;~#||79$H+~4uQ z|3;6!aaXI~m7Im>GQK2Un_R6qaq4qItq$(jSe3CY;DP3c=YtotfHxzP2!jX%2L}fO1A`*NhV6?dcWrRt$~u2KYAOQ*!%l|D zH#RuR$hKF^0v*y3&d9)E$iT^f00R7z7jBW69LujTX{UgU>NUo7MNA9~bC?+z)KJuQ z3xL(_+^8zkyGHZBCldq1Y!(IvV-!VE!jl(nQJ%bBSQ=zlNP(ztDl-Ga1$G7o8x(cC zVqkUcn@m_QIxA#fn0#Q9DAQ9(u;8yvrZPFVH%>8UVqj=uLD#9N2v(H0*+d3>Njwt+ zgElJzgDr~jmz5_k+@d*IQ$>E#P66rozn^l-89^7BGcZ`7sAHRKxFtjyagQ~+civ21 zu*F{ne4jES149=R1A`HY{yc54WAwIa$$)RcWny61!NR~`kD@3-7p!RdR&yD|<&fy1 zYiclg;TEOIJlo`1cmDc4?bT$1ZKBL`O&KPiGBudAQ$QAR=@$co4vO(ltU!tsC-2;- z$^yFaX7c-OVoY5&lMA;?PgdG)EDgF&Wj-SVgEnZG14SppxXa|g z9ZHkAcWAMK&vc)>eupU29IwfNdqgMS-eD>OI)vJunSp_om4U$##pFgGup)&3b5Jq> zozKg`%)sEq%D`ZPqRt`!s*ZE=gJ4CFTKG9hGN8naoK9Bxsz$ zyF{6uB!ML!>|&eTohA!1q!j5?8nnco3RP<^gV^Z9z@UZVs)RJCBEiX#yX9pN+hrIS zlu#4~R!$DwBQ|-}Zgm;ZK949y28MHt3=Fy`ipr}d2kw!X%(+KL1~H_`z@UJl$h2m1 z;2vuh&~Vh`346qt8fJo>uy>ED3~10KfRTY=3nO}(QJMo*6uUqMNUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +1>&2 echo. +1>&2 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +1>&2 echo. +1>&2 echo Please set the JAVA_HOME variable in your environment to match the +1>&2 echo location of your Java installation. "%COMSPEC%" /c exit 1 +goto exitWithErrorLevel :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -59,13 +87,14 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. 1>&2 -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 -echo. 1>&2 -echo Please set the JAVA_HOME variable in your environment to match the 1>&2 -echo location of your Java installation. 1>&2 +1>&2 echo. +1>&2 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +1>&2 echo. +1>&2 echo Please set the JAVA_HOME variable in your environment to match the +1>&2 echo location of your Java installation. "%COMSPEC%" /c exit 1 +goto exitWithErrorLevel :execute @rem Setup the command line @@ -75,8 +104,9 @@ echo location of your Java installation. 1>&2 @rem Execute gradlew @rem endlocal doesn't take effect until after the line is parsed and variables are expanded @rem which allows us to clear the local environment before executing the java command -endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel & goto exitWithErrorLevel +@rem This label must not be changed. We rely on old scripts being able to jump to this point. :exitWithErrorLevel @rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts "%COMSPEC%" /c exit %ERRORLEVEL% From dfd5c8c1565ed92b64112a14789e20d354a05a5f Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 11 Oct 2026 17:01:20 +0200 Subject: [PATCH 091/155] Translated using Weblate (Latvian) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Croatian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Co-authored-by: Agnieszka C Co-authored-by: BLUEBIRD-hash Co-authored-by: Daniels Gaho Co-authored-by: Femini Co-authored-by: Ghost of Sparta Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Igor Rückert Co-authored-by: Marcel Alin Co-authored-by: Milo Ivir Co-authored-by: VfBFan Co-authored-by: justcontributor Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ro/ Translation: NewPipe/Metadata --- app/src/main/res/values-az/strings.xml | 26 +-- app/src/main/res/values-de/strings.xml | 12 +- app/src/main/res/values-hi/strings.xml | 2 +- app/src/main/res/values-hr/strings.xml | 4 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 30 ++-- app/src/main/res/values-lv/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 3 +- app/src/main/res/values-pt-rBR/strings.xml | 107 ++++++------ app/src/main/res/values-ro/strings.xml | 161 +++++++++--------- app/src/main/res/values-zh-rCN/strings.xml | 96 +++++------ .../metadata/android/ro/changelogs/1015.txt | 1 + 12 files changed, 220 insertions(+), 226 deletions(-) create mode 100644 fastlane/metadata/android/ro/changelogs/1015.txt diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 4de1a8bb2..e2faab131 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -8,7 +8,7 @@ İmtina et Brauzerdə aç Paylaş - Yüklə + Yükləmə Yayım faylın yüklə Axtarış Tənzimləmələr @@ -31,15 +31,15 @@ Səs yükləmə qovluğu Yüklənilmiş səs faylları burada saxlanılır Səs faylları üçün yükləmə qovluğu seç - Standart format + İlkin ayırdetmə Daha böyük formatlar göstər \"Kodi\" ilə Oynat Çatışmayan \"Kore\" tətbiqi yüklənilsin\? \"Kodi ilə Oynat\" seçimini göstər Kodi media mərkəzindən video oynatmaq üçün seçim göstər Səs - Standart səs kodlayıcı - Standart video kodlayıcı + Standart səs formatı + Standart video formatı Kolorit İşıqlı Qaranlıq @@ -48,8 +48,8 @@ Ani görüntü rejimində aç Avtomatik oynat Yüklə - Fasilələr ardınca (məsələn, telefon zəngləri) oynatmağa davam etdir - Oynatmanı davam etdir + Fasilələr ardınca (məsələn, telefon zəngləri) oynatmağa davam et + Oynatmağa davam et Baxılmış videoların saxlanılması Məlumat təmizlə Siyahılarda oynatma mövqe göstəricilərini göstər @@ -85,7 +85,7 @@ İkinci fəaliyyət düyməsi Birinci fəaliyyət düyməsi Yalnız bəzi cihazlar 2K/4K videoları oynada bilir - Standart ani görüntü formatı + İlkin açılan pəncərə ayırdetməsi Əlavə Et Ani Görüntü Paneli Seç @@ -200,7 +200,7 @@ Əsas səhifə məzmunu Yeni versiya mövcud olduqda tətbiq yeniləməsini xatırlatmaq üçün bildiriş göstər Yeniləmələr - Mobil internet istifadə edərkən ayırdetməni məhdudlaşdır + Mobil məlumat istifadə edərkən ayırdetməni məhdudlaşdır Limitsiz 1 element silindi. Server əlavə et @@ -354,7 +354,7 @@ Tələb olunan məzmun yüklənir Yeni Pleylist Adını dəyişdir - Pleylistə əlavə et + Oynatma siyahısına əlavə et Emal edilir... Bir az vaxt ala bilər Səsi aç Pleylisti Əlfəcinlə @@ -392,7 +392,7 @@ Ani-pəncərə oynadıcısına kiçilt Oynatmanı avtomatik başlat — %s Aşağı keyfiyyət (daha kiçik) - Göstərmə + Göstərməyin Endirmə uğursuz oldu Server çox iş parçalı endirmələri qəbul etmir, @string/msg_threads = 1 ilə yenidən cəhd edin Bütün endirilmiş fayllar diskdən silinsin\? @@ -717,9 +717,9 @@ Naməlum ExoPlayer tənzimləmələri Bəzi ExoPlayer tənzimləmələrin idarə et. Bu dəyişiklikləri təsirli etmək üçün oynadıcını yenidən başlatmaq tələb olunur - ExoPlayer-in çözücü xüsusiyyətin istifadə et + ExoPlayer-in çözücü ehtiyatı xüsusiyyətin istifadə et Əsas çözücüləri işlətmə uğursuz olarsa, çözücü işlətmək probleminiz varsa (daha aşağı prioritetli çözücülərə düşür), bu seçimi aktiv edin. Bu, əsas çözücülərdən istifadə ilə müqayisədə zəif oynatma performansı ilə nəticələnə bilər - Bu həll yolu səthi kodlayıcıya birbaşa tənzimləmək əvəzinə, səth dəyişikliyi olarsa video kodlayıcıları buraxır və yenidən işlədir. Artıq ExoPlayer vasitəsilə bu problemli bəzi cihazlarda istifadə olunur, bu tənzimləmə təsiri yalnız Android 6 və daha yüksəkdə var.\n\nBu seçimi işlətmə cari video oynadıcı dəyişəndə və ya tam ekrana keçəndə oynatma xətaların düzəldə bilər + Bu həll yolu səthi kodlayıcıya birbaşa tənzimləmək əvəzinə, səth dəyişikliyi olarsa video kodlayıcıları buraxır və yenidən işlədir. Artıq ExoPlayer vasitəsilə bu problemli bəzi cihazlarda istifadə olunur, bu tənzimləmənin təsiri yalnız Android 6 və daha yüksəkdə var. \n \nBu seçimi işlətmə cari video oynadıcı dəyişəndə və ya tam ekrana keçəndə oynatma xətaların düzəldə bilər orijinal dublyaj edilib təsviri @@ -727,7 +727,7 @@ Qabaqcıl məzmunda yükləmə aralığı həcmin dəyişdir (hazırda %s). Daha aşağı dəyər onların ilkin yüklənilməsin sürətləndirə bilər Yayım yoxdur Canlı yayım yoxdur - Media dövrələmə cihazınızda standart olaraq qeyri-aktiv edilib, çünki cihazınızın modelinin bunu dəstəkləmədiyi məlumdur. + Media girişi cihazınızda standart olaraq qeyri-aktiv edilib, çünki cihazınızın modelinin bunu dəstəkləmədiyi məlumdur. %1$s %2$s Əsas tabel mövqeyi Əsas tabel seçicini aşağıya köçür diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 465588f46..272c979e7 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -20,7 +20,7 @@ Option „Mit Kodi abspielen“ anzeigen Option anzeigen, um Videos mit Kodi abzuspielen Audio - Bevorzugtes Audioformat + Standard-Audioformat Herunterladen „Nächste“ und „Ähnliche“ Videos anzeigen Nicht unterstützte URL @@ -87,13 +87,13 @@ Alle Deaktiviert Im Pop-up-Modus öffnen - Bevorzugtes Videoformat + Standard-Videoformat Im Pop-up-Modus abspielen Diese Berechtigung ist für das \nÖffnen im Pop-up-Modus erforderlich - Standardauflösung des Pop-ups + Pop-up-Standardauflösung Höhere Auflösungen anzeigen - Nur manche Geräte können Videos in 2K/4K abspielen + Nur manche Geräte können 2K-/4K-Videos abspielen Hintergrund Pop-up Eigenschaften des Pop-ups merken @@ -313,7 +313,7 @@ Ablehnen Um der europäischen Datenschutz-Grundverordnung (DSGVO) gerecht zu werden, weisen wir hiermit auf NewPipes Datenschutzerklärung hin. Bitte lies sie sorgfältig durch. \nDu musst dieser zustimmen, um den Fehlerbericht an uns zu senden. Unbegrenzt - Auflösung bei Verwendung mobiler Daten begrenzen + Auflösung bei der Nutzung mobiler Daten begrenzen Beim App-Wechsel minimieren Aktion beim Umschalten auf eine andere App vom Haupt-Videoplayer — %s Keine @@ -664,7 +664,7 @@ \nBitte installiere einen Storage Access Framework kompatiblen Dateimanager Angehefteter Kommentar LeakCanary ist nicht verfügbar - ExoPlayer Standard + ExoPlayer-Standard Benachrichtigungen Benachrichtigen über neue abonnierbare Streams Neue Streams diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 8aa3f2650..0f6eed64b 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -16,7 +16,7 @@ बैकग्राउंड पॉपअप ऑडियो - रौशनी + लाइट काला देखे हुए वीडियोज़ का इतिहास डाउनलोड करें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index ee331d14f..d89285159 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -128,7 +128,7 @@ Slobodan i jednostavan streaming na Android uređaju. Pogledaj na GitHubu NewPipeova licenca - Ako imate ideja za prijevod, promjene u dizajnu, čišćenje koda ili neke veće promjene u kodu, pomoć je uvijek dobro došla. Što više radimo, to bolji postajemo! + Ako imate ideja za prijevod, promjene u dizajnu, čišćenje koda ili neke veće promjene u kodu, pomoć je uvijek dobrodošla. Što više radimo, to bolji postajemo! Pročitaj licencu Doprinesi Povijest @@ -883,4 +883,6 @@ NewPipe ukida podršku za Android 5 Nažalost NewPipe ovisi o nekoliko biblioteka koje su ukinule podršku za Android 5.0 i 5.1. Sljedeće NewPipe izdanje će stoga nažalost raditi samo na uređajima s Androidom 6 ili novije. Pročitaj više u objavi na blogu. Objava na blogu + Podcasti + Tečajevi diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 07ef58478..28aee0886 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -207,7 +207,7 @@ Weboldal Látogassa meg a NewPipe weboldalát további információkért és hírekért. A NewPipe adatvédelmi irányelvei - A NewPipe projekt komolyan veszi az adatvédelmét. Az alkalmazás nem gyűjt semmilyen adatot a beleegyezése nélkül.\nA NewPipe adatvédelmi irányelve részletesen elmagyarázza, mely adatok kerülnek elküldésre és tárolásra az alkalmazás összeomlásának jelentésekor. + A NewPipe projekt kiemelten fontosnak tartja az Ön adatainak védelmét. Ezért az alkalmazás az Ön hozzájárulása nélkül semmilyen adatot nem gyűjt.\nA NewPipe adatvédelmi irányelvei részletesen ismertetik, hogy összeomlási jelentés küldésekor milyen adatok kerülnek továbbításra és tárolásra. Adatvédelmi irányelvek megtekintése A NewPipe licence Licenc megtekintése diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index bae625d8b..073dafb81 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -30,8 +30,8 @@ 업로더 썸네일 싫어요 좋아요 - 외부 비디오 플레이어 사용 - 외부 오디오 플레이어 사용 + 외장 동영상 플레이어 사용 + 외장 오디오 플레이어 사용 오디오 다운로드 폴더 다운로드된 오디오 파일이 이 곳에 저장됩니다 오디오 파일이 다운로드 될 폴더를 선택하세요 @@ -68,7 +68,7 @@ 삭제 체크섬 팝업 모드로 열기 - 일부 해상도에서 소리가 나지 않을 수 있습니다 + 일부 해상도에서 오디오가 제거됩니다 구독 구독중 구독 취소됨 @@ -79,9 +79,9 @@ 백그라운드 팝업 기본 팝업 해상도 - 높은 해상도 표시 - 일부 기기에서만 2K/4K 해상도 재생이 지원됩니다 - 기본 비디오 형식 + 더 높은 해상도 표시 + 일부 기기에서만 2K/4K 동영상을 재생할 수 있습니다 + 기본 동영상 형식 검정 팝업 크기 및 위치 기억 마지막으로 사용한 팝업 위치 및 크기를 기억합니다 @@ -103,7 +103,7 @@ 전부 해제됨 지우기 - 최대 해상도 + 최고 해상도 되돌리기 전부 재생 NewPipe 알림 @@ -186,7 +186,7 @@ 정확하지 않은 빠른 탐색 사용 정확하지 않은 탐색을 사용하면 정확도가 떨어지는 대신 더 빠르게 위치를 탐색할 수 있습니다. 5초, 15초 또는 25초 탐색 기능은 이 기능과 같이 동작하지 않습니다 다음 스트림을 자동으로 대기열에 추가 - 관련 스트림을 추가하여 (반복되지 않는) 재생 대기열을 계속 종료 + 관련 스트림을 추가하여 (미반복) 재생 대기열의 끝을 이어가기 기본 콘텐츠 국가 디버그 항상 @@ -308,8 +308,8 @@ \n버그 보고서를 보내려면 수락해야 합니다. 동의 동의하지 않음 - 데이터 제한 없음 - 모바일 데이터 사용 시 화질 제한 + 제한 없음 + 모바일 데이터 사용 시 해상도 제한 구독 취소 탭 선택 업데이트 @@ -415,7 +415,7 @@ %s명 청취중 - 빠른-감기/되감기 찾는 시간 + 빨리감기/되감기 탐색 간격 피어튜브 인스턴스 선호하는 PeerTube 인스턴스 선택 %s에서 원하는 인스턴스 찾기 @@ -709,10 +709,10 @@ 예를 들어, 물리적 버튼이 망가진 헤드셋을 사용하는 경우 유용합니다 스트림 보이기/숨기기 플레이어 화면 왼쪽 절반에 대한 제스처 선택 - 원본 오디오 선호 - 언어에 관계없이 원본 오디오 트랙 선택 - 가능한 경우 시각 장애인을 위한 설명이 포함된 오디오 트랙 선택 - 설명이 포함된 오디오 선호 + 원본 오디오 우선 + 언어와 상관없이 원본 오디오 트랙 선택 + 시각 장애인을 위한 해설이 든 오디오 트랙이 있다면 선택합니다 + 음성 해설 우선 플레이어 화면 오른쪽 절반에 대한 제스처 선택 오른쪽 제스처 동작 밝기 diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index e38483b97..8b1dd8531 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -489,7 +489,7 @@ Melns Tumšs Gaišs - Motīvs + IzskataIestatījumaEkrānu Noklusējuma video formāts Noklusējuma audio formāts Audio diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 802b001a4..2e71adc50 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -311,8 +311,7 @@ NewPipe jest wolnym i bezpłatnym oprogramowaniem: Możesz używać, udostępniać i ulepszać je do woli. W szczególności możesz je redystrybuować i/lub modyfikować zgodnie z warunkami GNU General Public License, opublikowanej przez Free Software Fundation, w wersji 3 albo (według Twojego wyboru) jakiejkolwiek późniejszej wersji. Czy chcesz zaimportować również ustawienia? Polityka prywatności NewPipe - Projekt NewPipe bardzo poważnie traktuje Twoją prywatność, dlatego aplikacja nie gromadzi żadnych danych bez Twojej zgody. -\nPolityka prywatności NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, kiedy wysyłasz raport o awarii aplikacji. + Projekt NewPipe bardzo poważnie traktuje Twoją prywatność, dlatego aplikacja nie gromadzi żadnych danych bez Twojej zgody. \nPolityka prywatności NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, gdy wysyłasz raport o awarii aplikacji. Przeczytaj politykę prywatności Ze względu na wprowadzenie Ogólnego rozporządzenia o ochronie danych (RODO) chcielibyśmy zwrócić Twoją uwagę na politykę prywatności NewPipe. Prosimy przeczytać ją uważnie. \nMusisz ją zaakceptować, aby przesyłać nam raporty o błędach. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index c0d08bb0b..6e9a13b6a 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -77,15 +77,15 @@ Áudio Reproduzir no Kodi Pesquisar - Mostrar opção para reproduzir o vídeo no Kodi - Usar player de áudio externo - Usar um player de vídeo alternativo + Exibir uma opção para reproduzir um vídeo através do centro de mídia Kodi + Usar reprodutor de áudio externo + Usar player de vídeo externo Mostrar opção \"Reproduzir no Kodi\" O que aconteceu:\nPedido:\nIdioma do conteúdo:\nPaís do conteúdo:\nIdioma do aplicativo:\nServiço:\nHora GMT:\nPacote:\nVersão:\nVersão do SO: Reproduzir no modo flutuante - Resolução padrão do Popup + Resolução padrão do pop-up Mostrar resoluções mais altas - Apenas alguns dispositivos suportam vídeos em 2K/4K + Apenas alguns dispositivos podem reproduzir vídeos 2K/4K Formato de vídeo padrão Reproduzindo em modo Popup Todos @@ -95,9 +95,9 @@ Limpar Popup Segundo plano - Lembrar propriedades do Popup - Lembrar último tamanho e posição do Popup - Atenção: o áudio pode não funcionar em certas resoluções + Lembrar das propriedades do pop-up + Lembrar do último tamanho e posição do pop-up + Remove áudio em algumas resoluções Sugestões de busca Escolha as sugestões a serem exibidas enquanto estiver buscando Melhor resolução @@ -125,8 +125,8 @@ Não foi possível atualizar a inscrição Inscrições Novidades - Continuar reprodução - Continuar a reprodução após interrupções (por exemplo, chamadas telefônicas) + Retomar reprodução + Continuar reproduzindo após interrupções (por exemplo, ligações) Histórico de busca Armazena o histórico de busca localmente Histórico de reprodução @@ -199,8 +199,8 @@ Nenhuma transmissão de vídeo encontrada Nenhuma transmissão de áudio encontrada Player de vídeo - Reprodução em segundo plano - Reprodução em Popup + Player em segundo plano + Player pop-up Obtendo informação… Carregando conteúdo solicitado Importar base de dados @@ -213,7 +213,7 @@ Aviso: Não foi possível importar todos os arquivos. Isso irá sobrescrever suas configurações atuais. Salvar arquivo para reprodução sem internet - Mostrar informação + Mostrar informações Playlists favoritas Adicionar a Arraste para ordenar @@ -242,10 +242,10 @@ O monitoramento de vazamento de memória pode tornar o aplicativo instável durante o despejo de pilha Reportar erros de out-of-lifecycle Forçar entrega de relatórios de erros Rx fora de um fragmento ou atividade de lifecycle após o descarte - Usar busca de posição rápida (inexata) - A busca inexata permite que o player de vídeo ache posições mais rápido com a precisão reduzida. Não funciona para voltar ou avançar 5, 15 ou 25 segundos - Enfileirar a próxima transmissão automaticamente - Continua a reprodução da fila (sem repetição) adicionando mais transmissões similares + Usar busca rápida não exata + A busca não exata permite ao player buscar posições mais rapidamente com precisão reduzida. Buscar por 5, 15 ou 25 segundos não funciona com isso + Enfileirar automaticamente o próximo stream + Continuar encerrando a fila de reprodução (sem repetição) anexando um fluxo relacionado Arquivo Essa pasta não existe Arquivo/fonte do conteúdo não existe @@ -288,7 +288,7 @@ Velocidade Afinação Desvincular (pode causar distorção) - Ação preferida ao tocar em \'Abrir\' + Ação \'abrir\' preferida Ação padrão ao abrir conteúdo — %s Nenhum vídeo disponível para download Abrir gaveta @@ -307,20 +307,19 @@ NewPipe é um software copyleft libre: você pode usá-lo, estudá-lo, compartilhá-lo e melhorá-lo à vontade. Especificamente, você pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (a seu critério) qualquer versão posterior. Você também quer importar as configurações? Política de Privacidade do NewPipe - O projeto NewPipe leva sua privacidade muito a sério. Por isso, o aplicativo não coleta nenhum dado sem seu consentimento. -\nA política de privacidade do NewPipe explica em detalhes quais dados são envidados e salvos quando você manda um relatório de erro. + O projeto NewPipe leva a sua privacidade muito a sério. Portanto, o aplicativo não coleta nenhum dado sem o seu consentimento.\nA política de privacidade do NewPipe explica detalhadamente quais dados são enviados e armazenados quando você envia um relatório de falha. Leia a política de privacidade A fim de cumprir com o Regulamento Geral sobre a Proteção de Dados da UE (RGPD), chamamos sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. \nVocê deve aceitá-la para nos enviar o relatório de erros. Aceitar Recusar - Ilimitado - Limitar resolução de vídeos ao usar dados móveis - Minimizar ao mudar de aplicativos + Sem limite + Limitar resolução ao usar dados móveis + Minimizar na troca de aplicativos Ação ao mudar de aplicativo a partir do player principal - %s Nenhum - Minimizar reprodução para o modo de segundo plano - Minimizar reprodução para o modo Popup + Minimizar para player em segundo plano + Minimizar para player pop-up Avançar durante o silêncio Passo Redefinir @@ -425,7 +424,7 @@ %s ouvintes %s ouvintes - Duração de avanço/retrocesso rápido + Duração da busca de avanço/retrocesso rápido Instâncias PeerTube Selecione suas instâncias favoritas do PeerTube Encontre as instâncias que gosta em %s @@ -536,14 +535,14 @@ Reporte no GitHub Copiar relatório formatado Nunca - Apenas em Wi-Fi + Somente no Wi-Fi Iniciar reprodução automaticamente — %s Fila de reprodução Não foi possível reconhecer a URL. Abrir com outro aplicativo\? Pôr na fila automaticamente A fila de reprodução atual será substituída Mudar de um player para outro pode substituir sua fila - Pedir confirmação antes de limpar a fila + Pedir confirmação antes de limpar uma fila Aleatório Carregando Nada @@ -559,7 +558,7 @@ Ajustar miniatura para a proporção de 1:1 Mostrar vazamentos de memória Na fila - Pôr na fila + Enfileirar Remove os cookies que o NewPipe armazena quando você resolve um reCAPTCHA Remover cookies de reCAPTCHA Os cookies de reCAPTCHA foram removidos @@ -600,8 +599,8 @@ Automático (tema do dispositivo) Tema noturno Mostrar detalhes do canal - Desative o túnel de mídia se aparecer uma tela preta ou se tiver travamento durante a reprodução do vídeo. - Desativar túnel de mídia + Desativa o tunelamento de mídia se você tiver uma tela preta ou interrupções na reprodução do vídeo. + Desabilitar o tunelamento de mídia Interno Privado Não Listado @@ -633,8 +632,8 @@ Modo tablet Não mostrar Baixa qualidade (menor) - Alta qualidade (melhor) - Pré visualização da miniatura na barra de busca + Alta qualidade (maior) + Visualização em miniatura da barra de busca Os comentários estão desabilitados Marcar como assistido Curtido pelo criador @@ -651,8 +650,8 @@ Adicionado na próxima posição da fila Enfileira a próxima Deslize os itens para remove-los - Não inicie os vídeos no mini player, mas vá diretamente para o modo de tela cheia, se a rotação automática estiver bloqueada. Você ainda pode acessar o mini player saindo da tela cheia - Iniciar reprodução principal em tela cheia + Não iniciar vídeos no miniplayer, mas mude diretamente para o modo de tela inteira, se a rotação automática estiver bloqueada. Você ainda pode acessar o miniplayer saindo da tela inteira + Iniciar player principal em tela cheia Sugestões de busca remotas Sugestões de busca locais Processando… Pode demorar um pouco @@ -675,7 +674,7 @@ \nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download Comentário fixado O LeakCanary não está disponível - ExoPlayer padrão + Padrão do ExoPlayer Notificação de reprodução Configurar notificação da reprodução do vídeo atual Notificações @@ -708,7 +707,7 @@ Selecione a qualidade para players externos Formato desconhecido Qualidade desconhecida - Tamanho do intervalo de carregamento da reprodução + Tamanho do intervalo de carregamento de reprodução Ver no site Se você estiver tendo problemas para usar o aplicativo, verifique estas respostas para perguntas comuns! Perguntas frequentes @@ -723,7 +722,7 @@ Falha ao copiar para a área de transferência Duplicata adicionada %d vez(es) As playlists em cinza já contêm este item. - Ignorar eventos de botões físicos (hardware) + Ignorar eventos de botão de mídia de hardware Útil, por exemplo, se você estiver usando um fone de ouvido com botões físicos quebrados Remover duplicados Remover duplicados\? @@ -733,40 +732,38 @@ Parcialmente assistido Em breve Totalmente assistido - Escolha o gesto para a parte esquerda na tela de reprodução - Ação para o gesto à esquerda - Escolha o gesto para a parte direita na tela de reprodução + Escolha o gesto para a metade esquerda da tela do player + Ação do gesto esquerdo + Escolha o gesto para a metade direita da tela do player Brilho Volume Nenhum - Ação para o gesto à direita + Ação do gesto direito Altere o tamanho do intervalo de carregamento (atualmente %s). Um valor menor pode acelerar o carregamento inicial do vídeo - Dar preferência ao áudio original - Selecionar o áudio original e independentemente do idioma - Dar preferência ao áudio descritivo - Selecionar um áudio com descrição para pessoas com dificuldades de visão, se disponível + Preferir áudio original + Selecionar faixa de áudio original independentemente do idioma + Preferir áudio descritivo + Selecionar faixa de áudio com descrições para pessoas com deficiência visual, se disponível Áudio: %s Faixa de áudio Selecione a faixa de áudio para players externo Desconhecido - Configurar ExoPlayer - Gerenciar algumas configurações do ExoPlayer. É necessário reiniciar o player para aplicar as mudanças + Configurações do ExoPlayer + Gerenciar algumas configurações do ExoPlayer. Essas mudanças exigem a reinicialização do player para entrarem em vigor %1$s %2$s original dublado descritivo - Esta solução alternativa libera os codificadores de vídeo quando ocorre uma alteração de superfície, no lugar de definir a superfície para o Codec diretamente. Já usado pelo ExoPlayer em alguns dispositivos com esse problema, essa configuração só tem efeito no Android 6 e superior -\n -\nAtivar esta opção pode evitar erros de reprodução ao alternar o player de vídeo atual ou alternar para tela cheia + Esta solução alternativa libera e reinstancia codecs de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície diretamente para o codec. Já usada pelo ExoPlayer em alguns dispositivos com esse problema, essa configuração só tem efeito no Android 6 e superior\n\nAtivar esta opção pode evitar erros de reprodução ao mudar o player de vídeo atual ou mudar para tela cheia Uma faixa de áudio já deve estar presente neste vídeo - Usar decodificador alternativo do ExoPlayer - Usar sempre a solução alternativa de configuração da superfície de saída de vídeo do ExoPlayer - Habilite essa opção se você tiver problemas de inicialização do decodificador, que retorna codificadores de baixa prioridade se o decodificador primário falhar. Isso pode resultar em pior desempenho de reprodução + Usar recurso de fallback do decodificador do ExoPlayer + Sempre usar solução alternativa de configuração de superfície de saída de vídeo do ExoPlayer + Habilite esta opção se você tiver problemas de inicialização do decodificador, que retornarão para decodificadores de prioridade mais baixa se a inicialização dos decodificadores primários falhar. Isso pode resultar em um desempenho de reprodução ruim do que ao usar decodificadores primários Mover seletor da guia principal para baixo Posição das guias principais Nenhum conteúdo Nenhuma transmissão ao vivo - O túnel de mídia foi desabilitado por padrão em seu dispositivo porque seu modelo é conhecido por não suportá-lo. + O tunelamento de mídia foi desativado por padrão no seu dispositivo porque sabe-se que o modelo do seu dispositivo não é compatível. Vídeos Inscritos Quais guias são mostradas na página do canal diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 976f68893..c50f4e73a 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -3,7 +3,7 @@ Publicat pe %1$s Niciun player pentru streaming găsit. Instalați VLC\? Instalare - Anulare + Anulează Deschide în browser Distribuire Descărcare @@ -11,24 +11,24 @@ Setări V-ați referit la: „%1$s” ? Distribuiți cu - Folosiți un player video extern - Folosește un player audio extern + Utilizați un player video extern + Utilizați un player audio extern Locația videoclipurilor descărcate Videoclipurile descărcate sunt stocate aici Alegeți folderul de descărcare pentru fișierele video Dosar de descărcări audio Fișierele audio descărcate sunt stocate aici Alegeți folderul de descărcare pentru fișierele audio - Rezoluție implicită + Rezoluția implicită Redați folosind Kodi Aplicația Kore nu a fost găsită. Doriți să o instalați? Arată opțiunea „Redați folosind Kodi” - Arată opțiunea de redare a videoclipurilor via player-ului media Kodi + Afișează o opțiune pentru redarea unui videoclip prin intermediul centrului media Kodi Audio - Format audio implicit + Formatul audio implicit Temă - Întunecat - Luminos + Întunecată + Luminoasă Descărcați Arată videoclipurile care \'Urmează\' și cele \'Similare\' URL nesuportat @@ -84,23 +84,23 @@ Provocare reCAPTCHA solicitată Rezoluția implicită a ferestrei pop-up Afișează rezoluții mai mari - Doar anumite dispozitive suportă redarea videoclipurilor 2K/4K - Format video implicit - Negru + Doar anumite dispozitive pot reda videoclipuri 2K/4K + Formatul video implicit + Neagră Redare în mod pop-up Toate Dezactivat Aplicația/UI s-a oprit Ce:\nSolicitare:\nLimba conținutului:\nȚara conținutului:\nLimba aplicației:\nServiciu:\nOra GMT:\nPachet:\nVersiune:\nVersiune SO: - Elimină sunetul audio la anumite rezoluții + Elimină sunetul la anumite rezoluții Fundal Pop-up - Reține dimensiunea și poziția pop-up-ului - Reține ultima dimensiune și poziție a pop-up-ului + Rețineți proprietățile ferestrelor pop-up + Reține ultima dimensiune și poziție a ferestrei pop-up Sugestii de căutare Alegeți sugestiile care vor fi afișate la căutare Ștergeți - Rezoluție maximă + Cea mai bună rezoluție Abonare Abonat(ă) Canal dezabonat @@ -112,11 +112,11 @@ Stochează local căutările Istoricul vizionărilor Reține videoclipurile vizionate - Reluați redarea - Continuă redarea după întreruperi (ex: după apeluri) + Reia redarea + Continuă redarea după întreruperi (de exemplu, apeluri telefonice) Player Comportament - Istorie și cache + Istoric și cache Anulare Notificare NewPipe Notificări pentru playerul NewPipe @@ -149,12 +149,12 @@ Despre NewPipe Licențe terță-parte © %1$s de %2$s sub %3$s - Despre & Întrebări Comune + Despre & Întrebări frecvente Licențe Streaming sursă-liberă pentru Android. Vezi pe GitHub - Licența a NewPipe - Când îți vine idea de; traduceri, schimbări de design, curățare cod sau schimbări reale de cod - Ajutorul este mereu binevenit. Cu cât mai mult, cu cât mai bine! + Licența NewPipe + Indiferent dacă ai idei legate de traduceri, modificări de design, curățarea codului sau modificări majore ale codului — ajutorul tău este întotdeauna binevenit. Cu cât se face mai mult, cu atât rezultatul este mai bun! Citește licența Contribuie Istoric @@ -172,17 +172,17 @@ Noi și populare Niciun player pentru streaming găsit. (Totuși, puteți instala VLC). Descărcați fișierul de flux - Afișare informații + Afișează informații Playlisturi salvate Salvare în - Folosește parcurgerea rapidă inexactă - Derularea inexactă permite player-ului să deruleze mai rapid, cu o precizie redusă. Derularea timp de 5, 15 sau 25 de secunde nu funcționează cu aceasta + Utilizează căutarea rapidă inexactă + Căutarea inexactă permite playerului să se deplaseze mai rapid la anumite poziții, cu o precizie redusă. Căutarea pentru 5, 15 sau 25 de secunde nu funcționează în acest caz Datele cache de imagini au fost șterse Șterge cache-ul pentru metadata Șterge cache-ul pentru datele de pagini web Cache pentru metadata șters - Adaugă următorul stream în coadă automat - Continuă coadă de redare (care nu se repetă) prin adăugarea unui flux asemănător + Adăugare automată în coadă a fluxului următor + Continuați coada de redare finală (fără repetări) prin adăugarea unui flux asociat Afișați sfatul „Țineți apăsat pentru a adăuga” Afișați un sfat la apăsarea fundalului sau a butonului popup în videoclipul „Detalii:” Țara implicită pentru conținut @@ -229,12 +229,12 @@ Începeți redarea în popup Deschdeți sertarul Închideți sertarul - Opțiunea de deschidere preferată + Acțiunea de „deschidere” preferată Acțiune implicită la deschiderea conținutului - %s - Player Video - Player Fundal - Player Popup - Întrebați întotdeauna + Player video + Player în fundal + Player în fereastră pop-up + Întreabă întotdeauna Nu există fluxuri disponibile pentru descărcare Trageți pentru a reordona Creați @@ -257,7 +257,7 @@ Ștergeți întregul istoric al vizionărilor\? 1 element șters. Playlist nou - Adăugați la playlist + Adaugă la lista de redare Importare Importați din Exportați în @@ -294,11 +294,10 @@ Umplere Mărire Subtitrări - Modificați scara textului de legendă a playerului și stilurile de fundal. Necesită repornirea aplicației pentru a intra în vigoare + Modificați dimensiunea textului subtitrărilor playerului și stilurile de fundal. Pentru ca modificările să intre în vigoare, este necesară repornirea aplicației NewPipe este o aplicație liberă: Poți folosi, studia, partaja, și a o face mai bună după propria voință. Poți redistribui și/sau modifica aplicația în termenii GNU GPL publicate de Free Software Foundation, toate dintre cele 3 versiuni, or (la opțiunea dvs.) orice versiune mai nouă. Politica de Confidențialitate NewPipe - Proiectul NewPipe ia foarte în serios confidențialitatea dumneavoastră. Prin urmare, aplicația nu colectează niciun fel de date fără consimțământul dumneavoastră. -\nPolitica de confidențialitate a NewPipe explică în detaliu ce date sunt trimise și stocate atunci când trimiteți un raport de eroare. + Proiectul NewPipe acordă o importanță deosebită confidențialității datelor tale. Prin urmare, aplicația nu colectează nicio informație fără consimțământul tău.\nPolitica de confidențialitate a NewPipe explică în detaliu ce date sunt transmise și stocate atunci când trimiți un raport de eroare. Citește Politica de confidențialitate Nu s-au putut citi filele salvate, deci se folosesc cele implicite Restaurați valorile implicite @@ -320,7 +319,7 @@ Fișier mutat sau șters Șterge pozițiile de redare memorate Marcați lista de redare - Limitați rezoluția atunci când utilizați date mobile + Limitați rezoluția atunci când utilizați datele mobile Acordați permisiunea de a afișa peste alte aplicații Ștergeți toate pozițiile din playback\? Ștergeți toate pozițiile de redare @@ -333,7 +332,7 @@ Găsiți instanțele care vă plac pe %s Selectați instanțele PeerTube preferate Instanțe PeerTube - Durată derulare rapidă înainte/înapoi + Durata căutării cu derulare rapidă înainte/înapoi Gata Apăsați „Gata” după ce ați rezolvat problema Raportați pe GitHub @@ -448,8 +447,8 @@ Forțarea raportării excepțiilor de Rx nedistribuibile în afara ciclului de viață al fragmentului sau al activității după eliminare Coadă automată Coada de redare activă va fi înlocuită - Trecerea de la un player la altul vă poate înlocui coada de redare - Solicitați confirmarea înainte de a șterge o listă de redare + Trecerea de la un player la altul poate duce la resetarea cozii tale + Solicitați confirmarea înainte de a goli o coadă %d minut %d minute @@ -498,18 +497,18 @@ În așteptare Finalizat Actualizare NewPipe disponibilă! - Automat + Auto Grilă Listă - Mod vizualizare listă + Modul de afișare în listă Niciodată - Numai pe Wi-Fi + Doar prin Wi-Fi Începeți automat redarea - %s - Minimizare la playerul popup - Minimizați la playerul de fundal + Minimizează playerul în fereastră pop-up + Minimizează playerul în fundal Niciuna Acțiune la trecerea la altă aplicație de la playerul video principal - %s - Minimalizați la comutarea aplicației + Minimizează la comutarea între aplicații Afișați o notificare pentru a solicita actualizarea aplicației atunci când este disponibilă o nouă versiune Actualizări Fără limită @@ -535,7 +534,7 @@ Activați sunetul Dezactivați sunetul Pus în coadă - Puneți în coadă + Adăugare în coada de așteptare Coadă de redare Cele mai apreciate Adăugate recent @@ -571,12 +570,12 @@ Blocați aplicația Rezolvați Evidențiate - Puteți selecta tema de noapte preferată mai jos + Mai jos poți selecta tema de noapte preferată Acest videoclip este restricționat în funcție de vârstă. \nDin cauza noilor politici YouTube privind videoclipurile cu restricții de vârstă, NewPipe nu poate accesa niciunul dintre fluxurile sale video și, prin urmare, nu îl poate reda. Descărcarea a început Selectați tema de noapte preferată — %s - Automat (tema dispozitivului) + Automată (tema dispozitivului) Radio Acest conținut este disponibil doar pentru utilizatorii care au plătit, ca atare nu poate fi difuzat sau descărcat de NewPipe. Acest videoclip este disponibil doar pentru membrii YouTube Music Premium, ca atare nu poate fi difuzat sau descărcat de NewPipe. @@ -584,13 +583,13 @@ Aceasta este o piesă SoundCloud Go+, cel puțin în țara dvs., deci nu poate fi difuzată sau descărcată de NewPipe. Acest conținut nu este disponibil în țara dumneavoastră. Afișați detaliile canalului - Tema de noapte + Temă de noapte Următorul pus în coadă Adăugați în coadă pe următorul Marcare ca vizionat Oprit Pornit - Mod tabletă + Modul tabletă Deschideți site-ul web Inimă de la creator Intern @@ -627,19 +626,19 @@ %s descărcări finalizate %s de descărcări finalizate - Dezactivați tunelarea media + Dezactivează tunelarea conținutului media Glisați elementele pentru a le elimina Încă nu este setat niciun folder de descărcare, alegeți acum folderul de descărcare implicit Comentariile sunt dezactivate - Nu porniți videoclipurile în mini player, ci treceți direct la modul ecran complet, dacă rotația automată este blocată. Puteți accesa în continuare mini playerul ieșind din modul fullscreen - Porniți playerul principal în ecran complet + Nu porniți videoclipurile în mini-player, ci treceți direct în modul ecran complet, dacă rotirea automată este blocată. Puteți accesa în continuare mini-playerul ieșind din modul ecran complet + Pornește playerul principal în modul ecran complet Sugestii de căutare la distanță Sugestii de căutare locală Nu afișa - Calitate scăzută (mai mică) - Calitate înaltă (mai mare) - Miniatură de previzualizare în bara de derulare - Dezactivați tunelarea media dacă întâmpinați un ecran negru sau blocaje la redarea video. + Calitate scăzută (dimensiune mai mică) + Calitate înaltă (dimensiune mai mare) + Previzualizare miniatură în bara de căutare + Dezactivați funcția de tunelare media dacă ecranul rămâne negru sau dacă redarea videoclipurilor se întrerupe. Procesarea.. Poate dura un moment Verifică dacă există actualizări Verifică manual dacă există versiuni noi @@ -672,7 +671,7 @@ Notificările sunt dezactivate Procent Semiton - Implicit ExoPlayer + Setarea implicită pentru ExoPlayer Dați crash player-ului LeakCanary nu este disponibil Notificări @@ -693,8 +692,8 @@ Selectați calitatea pentru playerele externe Format necunoscut Calitate necunoscută - Dimensiunea intervalului de încărcare de redare - Vezi în website + Dimensiunea intervalului de încărcare la redare + Vezi pe site-ul web Dacă aveți probleme folosind aplicația, uitați-vă la răspunsurile celor mai comune întrebărilor puse! Întrebări frecvente Sortare @@ -708,8 +707,8 @@ Dezactivare miniatură permanentă Listele de redare care colorate în gri conțin deja acest element. Duplicat adăugat de %d ori - Ignorați evenimentele butonului media hardware - Util, de exemplu, dacă utilizați o cască cu butoane fizice defecte + Ignorați evenimentele generate de butoanele hardware de redare media + Folositor, de exemplu, dacă folosești o cască cu butoane fizice defecte Doriți să eliminați toate fluxurile dublate din această listă de redare\? Eliminare dubluri Eliminați dublurile\? @@ -732,29 +731,27 @@ \n%2$s Filele canalului Volum - Utilizați funcționalitatea de rezervă a decodorului din ExoPlayer - Niciunul + Utilizați funcția de rezervă a decodorului din ExoPlayer + Niciun Se încarcă metadata… Schimbați orientarea ecranului - Gestionați unele setări pentru ExoPlayer. Aceste schimbări necesită un restart la player ca să aibă efect + Gestionați anumite setări ale ExoPlayer. Pentru ca aceste modificări să intre în vigoare, este necesară repornirea playerului Calitate scăzută Poziția filelor principale Schimbați pe ecran complet Preluați filele canalului Avatare - Activați această opțiune dacă aveți probleme cu inițializarea decodorului care trece înapoi la decodoare cu prioritate mai scăzută dacă inițializarea decodoarelor principale eșuează. Asta poate duce la performanță de redare mai slabă decât atunci când se utilizează decodoarele principale - Acțiunea gestului din dreapta + Activați această opțiune dacă întâmpinați probleme la inițializarea decodoarelor; aceasta va recurge la decodoare cu prioritate mai mică în cazul în care inițializarea decodoarelor principale eșuează. Acest lucru poate duce la o performanță de redare inferioară față de cea obținută la utilizarea decodoarelor principale + Acțiune gest la dreapta %1$s %2$s - Utilizați întotdeauna configurarația suprafeței de ieșire video din ExoPlayer ca soluție alternativă + Folosiți întotdeauna soluția alternativă pentru setarea suprafeței de ieșire video a ExoPlayer Transmisia viitoare - Tunelizarea media a fost dezactivată în mod implicit pe dispozitivul dumneavoastră deoarece se cunoaște despre acest model de dispozitiv că nu o suportă. + Funcția de tunelare media a fost dezactivată în mod implicit pe dispozitivul dumneavoastră, deoarece se știe că modelul acesta nu o suportă. Avatarele subcanalelor - Această soluție alternativă eliberează și reinstanțează codecurile video când se întamplă o schimbare a suprafeței, în loc de a seta suprafața pentru codec direct. Deja folosită de ExoPlayer pe unele dispozitive cu această problemă, această setare are efect doar pe Android 6 sau mai mare -\n -\nActivarea acestei opțiuni poate preveni erorile de redare când se schimbă playerul video curent sau se trece pe ecran complet + Această soluție alternativă eliberează și reinstanțiază codecurile video atunci când are loc o schimbare a suprafeței, în loc să seteze direct codecul pentru suprafața respectivă. Utilizată deja de ExoPlayer pe unele dispozitive care prezintă această problemă, această setare are efect doar pe Android 6 și versiuni ulterioare\n\nActivarea acestei opțiuni poate preveni apariția erorilor de redare la schimbarea playerului video curent sau la trecerea la modul ecran complet O coloană sonoră ar trebui să fie deja prezentă în această transmisie Deschideți coada de redare - Selectați coloana sonoră originală indiferent de limbă + Selectează pista audio originală, indiferent de limbă Nu încărcați imagini Calitate înaltă Despre @@ -766,31 +763,31 @@ Reluați dublat File ce vor fi preluate când se actualizează fluxul. Această opțiune nu are niciun efect dacă un canal este actualizat folosind modul rapid. - Selectați o coloană sonoră cu descrieri pentru persoane cu deficiențe vizuale, dacă este disponibilă - Acțiunea gestului din stânga + Selectează o pistă audio cu descrieri pentru persoanele cu deficiențe de vedere, dacă este disponibilă + Acțiune gest la stânga Calitate medie - Preferați audioul descriptiv + Prefer sunetul descriptiv Modificați dimensiunea intervalului de încărcare pentru conținuturi progresive (în prezent %s). O valoare mai mică poate accelera încărcarea lor inițială - Preferați audioul original + Prefer sunetul original Audio: %s Bannere Playlisturi - Alegeți un gest pentru jumătatea dreaptă din ecranul playerului + Alege un gest pentru jumătatea din dreapta a ecranului playerului - %1$s: %2$s - Mutați fila principală în partea de jos + Mută selectorul filei principale în partea de jos Coloană sonoră Fără transmisii în direct Alegeți calitatea imaginilor și dacă să se încarce sau nu imaginile, pentru a reduce utilizarea datelor și memoriei. Schimbările șterg cache-ul atât din memoria internă cât și din disc --%s Redați Mai multe opțiuni Miniaturi - Setări pentru ExoPlayer + Setări ExoPlayer Luminozitate Durată Fără transmisii Canale Transmisia anterioară - Alegeți un gest pentru jumătatea stângă din ecranul playerului + Alege un gest pentru jumătatea stângă a ecranului playerului În direct Shorturi Avatarele autorului @@ -824,7 +821,7 @@ Pagina SoundCloud Top 50 a fost eliminată SoundCloud a eliminat Top 50. Fila corespunzătoare a fost eliminată din pagina principală. „Permite afișarea deasupra altor aplicații” - %sK + %smii %s mil. %s mld. În august 2025, Google a anunțat că, începând din septembrie 2026, instalarea aplicațiilor va necesita verificarea dezvoltatorului pentru toate aplicațiile Android de pe dispozitivele certificate, inclusiv pentru cele instalate din afara Play Store. Deoarece dezvoltatorii NewPipe nu sunt de acord cu această cerință, NewPipe nu va mai funcționa pe dispozitivele Android certificate după acea dată. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index bbc461f59..e60c90dbb 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -42,14 +42,14 @@ 历史记录和缓存 撤销 播放全部 - 总是 + 始终 仅一次 添加至 文件 清空播放历史 无 - 最小化至后台播放 - 最小化至悬浮窗播放 + 最小化到后台播放器 + 最小化到弹窗播放器 频道 播放列表 取消订阅 @@ -122,7 +122,7 @@ 默认分辨率 未找到 Kore。是否安装 Kore? 显示“使用 Kodi 播放”选项 - 显示“通过 Kodi 媒体中心播放视频”选项 + 显示通过 Kodi 媒体中心播放视频的选项 音频 默认音频格式 显示“接下来”和“相似视频” @@ -158,13 +158,13 @@ reCAPTCHA 验证 已请求新的 reCAPTCHA 验证 在悬浮窗中播放 - 悬浮窗默认分辨率 - 使用更高的分辨率 - 仅部分设备支持播放 2K 或 4K 视频 + 默认弹窗分辨率 + 显示更高分辨率 + 仅一些设备能播放 2K/4K 视频 清除 - 记住悬浮窗属性(大小与位置) - 记住上一次使用悬浮窗的大小和位置 - 部分分辨率下没有音频 + 记住弹窗属性 + 记住弹窗的最后尺寸和位置 + 删除某些分辨率的音频 选择搜索时显示的建议 最佳分辨率 自由且小巧的 Android 媒体播放器。 @@ -179,8 +179,8 @@ 无法更新订阅 订阅 最新 - 自动恢复播放 - 在播放被打断(例如突然来电)后恢复播放 + 继续播放 + 中断后继续播放(如通话) 记录搜索历史 Newpipe 将在本地存储搜索历史记录 Newpipe 将保留播放记录 @@ -231,7 +231,7 @@ 找不到音频串流 视频播放器 后台播放器 - 悬浮窗播放器 + 弹窗播放器 正在获取信息… 正在加载请求的内容 导入数据库 @@ -247,11 +247,11 @@ 收藏 最近观看 最多观看 - 每次询问 + 始终询问 新建播放列表 重命名 名称 - 添加至播放列表 + 添加到播放列表 设为播放列表封面 收藏播放列表 删除收藏 @@ -268,10 +268,10 @@ 内存泄漏监测可能会导致应用在堆转储时无响应 报告超出生命周期的错误 强制报告处理后的未送达的 Activity 或 Fragment 生命周期之外的 Rx 异常 - 使用快速寻址(不精确) - 快速寻址定位允许播放器以较低精确度为代价换取更快的寻址定位速度。此功能不适用于以 5、15 或 25 秒为隔的寻址定位 - 自动将“接下来”视频加入播放队列 - 播放完(非循环)队列中的最后一个视频后,自动将一个相关视频添加到当前播放队列 + 使用快速非精确查找 + 非精确查找允许播放器降低精度更快地跳转到位置。不适用 5 秒、15 秒或 25 秒跳转 + 自动将下一个音视频流加入队列 + 在(非重复)播放队列结束后通过附加相关音视频流来延续队列 没有该文件夹 无相似文件/内容源 文件不存在,或缺少读写文件权限 @@ -313,7 +313,7 @@ 节奏 音调 解除音视挂钩(可能导致失真) - 首选“打开”操作 + 首选的“打开”动作 打开内容时的默认操作 — %s 没有可下载的串流 字幕 @@ -334,8 +334,8 @@ 接受 拒绝 无限制 - 使用移动数据播放时降低分辨率 - 退出应用时最小化 + 使用手机流量时限制分辨率 + 应用切换时最小化 从主播放器切换到其他应用时的操作 — %s 静音时快进 比例调整 @@ -429,7 +429,7 @@ 正在恢复 无法恢复此下载 选择一个服务器 - 快进 / 快退的寻址定位时间间隔 + 快进/快退跳转时长 清空下载记录 删除下载文件 授予在其他应用上层显示的权限 @@ -515,14 +515,14 @@ 复制已整理的报告 显示结果:%s 从不 - 仅在 Wi-Fi 下 + 仅 Wi-Fi 连接 自动开始播放 — %s 播放队列 无法识别此 URL。是否用其他应用打开\? 自动加入播放队列 当前播放队列将被替换 - 从一个播放器切换到另一个播放器后,你的播放队列可能会被替换 - 清空播放队列前再次确认 + 从一个播放器切换到另一个播放器可能替换你的队列 + 清空队列前请求确认 无 正在缓冲 随机播放 @@ -538,7 +538,7 @@ 裁剪缩略图至 1:1 比例 显示内存泄漏 已加入播放队列 - 加入播放队列 + 加入队列 清空与本地存储的 reCAPTCHA 验证码有关的 cookie reCAPTCHA cookie 已被清空 清空 reCAPTCHA cookie @@ -579,8 +579,8 @@ 选择你最喜欢的夜间主题 — %s 夜间主题 显示频道详情 - 如果在视频播放中遇到黑屏或卡顿的情况,请停用媒体隧道。 - 停用媒体隧道 + 如果遇到黑屏或视频播放卡顿,请禁用视频隧道。 + 禁用媒体隧道 停用简介中的文本选择功能 内部 私享 @@ -613,8 +613,8 @@ 评论功能已停用 进度条缩略图预览 不显示 - 低品质(较小) - 高品质(较大) + 低画质(更小) + 高画质(更大) 被创作者喜爱 标记为已观看 远程搜索建议 @@ -626,8 +626,8 @@ 完成了 %s 个下载 滑动即可删除项目 - 若自动旋转被锁定,不在以小窗播放器形式中播放视频,而直接切换到全屏模式。仍可以通过退出全屏以切换至小窗播放器 - 以全屏启动主播放器 + 如果锁定了自动旋转,不要在迷你播放器中启动视频,而是直接转向全屏模式。你仍可通过退出全屏访问迷你播放器 + 全屏启动主播放器 已添加为下一个播放 下一个播放 处理中…可能需要一些时间 @@ -680,7 +680,7 @@ 没有视频流可用于外部播放器 不显示下载器尚不支持的串流 未知画质 - 播放加载间隔大小 + 播放加载间隔时长 常见问题 如果你在使用本应用时遇到问题,请务必查看这些常见问题的答案! 在网站上查看 @@ -695,7 +695,7 @@ 无法复制到剪贴板 变灰的播放列表已经包含此项目。 重复添加了 %d 次 - 如果你在使用一副物理按钮坏掉的耳机,该选项应该会有帮助 + 在用物理按键坏掉的耳机等情况下有用 忽略硬件媒体按钮事件 删除重复吗? 你想删除这个播放列表中所有重复项吗? @@ -707,36 +707,34 @@ 删除重复 亮度 音量 - 右半边手势动作 - 左半边手势动作 + 右半边手势操作 + 左半边手势操作 选择播放器屏幕左半边手势 选择播放器屏幕右半边手势 无 更改渐进式内容的加载间隔大小(当前为 %s)。较低的值可加快初始加载 - 偏好描述性音频 - 如果可用,为视障人群选择带描述的音轨 + 首选描述性视频 + 如可用,为视频障碍人士选择带描述信息的音轨 音频:%s 此串流中应该已经有音轨 选择外部播放器音轨 未知 - 管理一些 ExoPlayer 设置。这些更改需要重启播放器才能生效 - 使用 ExoPlayer 的编码器回退功能 - 始终使用 ExoPlayer 的视频输出界面设置变通方法 - 此变通方法在发生界面更改时会释放并重新初始化视频编解码器,而不是直接将编解码器设置到新界面。在某些有这个问题的设备上,Exoplayer 已经在使用这个方法。此设置仅适用于 Android 6 及更高的系统版本 -\n -\n启用此选项可防止切换当前视频播放器或切换到全屏播放时出现播放错误 + 管理一些 ExoPlayer 设置。这些更爱需要重启播放器才能生效 + 使用 ExoPlayer 的解码器回退特性 + 始终使用 ExoPlayer 的视频输出操作台设置变通解决方法 + 这个变通解决办法在发生操作台变化时释放并重新初始化视频编解码器,而不是直接将操作台设为编解码器。ExoPlayer 已经在一些有这个问题的设备上使用该方法,该设置仅在 Android 6 及更高版本上有效。\n\n启用该选项可在切换当前视频播放器或切换至全屏时防止播放错误 原始 配音 描述 - 偏好原始音频 - 不管何种语言都选择原始音轨 + 首选原始音频 + 不论何种语言都选择原始音轨 音轨 ExoPlayer 设置 - 如遇解码器初始化方面的问题可开启此选项。启用后,如主解码器初始化失败,ExoPlayer 将使用较低优先级的解码器进行播放。请注意,这可能导致播放性能下降 + 如果有解码器初始化问题请启用该选项,启用后如果主解码器初始化失败会让播放器退回到较低优先级的解码器。这可能导致播放性能比使用主解码器时要差 将主选项卡选择器移至底部 主选项卡位置 %1$s %2$s - 媒体隧道功能在你的设备上默认停用,因为已知你的设备型号不支持它。 + 媒体隧道在你的设备上默认禁用,因为已知你的设备型号不支持它。 无直播 无音视频流 视频 diff --git a/fastlane/metadata/android/ro/changelogs/1015.txt b/fastlane/metadata/android/ro/changelogs/1015.txt new file mode 100644 index 000000000..b268cfcd3 --- /dev/null +++ b/fastlane/metadata/android/ro/changelogs/1015.txt @@ -0,0 +1 @@ +Aceasta este o versiune de remediere rapidă care rezolvă problemele legate de transmisiunile live de pe media.ccc.de. Hacking plăcut! From 54dd7f9cb5e5311d9408c3cf288ce1ae8f0c0409 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sun, 11 Oct 2026 17:01:25 +0200 Subject: [PATCH 092/155] Translated using Weblate (Azerbaijani) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Czech) Currently translated at 45.0% (64 of 142 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Latvian) Currently translated at 26.7% (38 of 142 strings) Translated using Weblate (Korean) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Hindi) Currently translated at 27.4% (39 of 142 strings) Translated using Weblate (Hungarian) Currently translated at 42.9% (61 of 142 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (German) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Polish) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Croatian) Currently translated at 51.6% (32 of 62 strings) Co-authored-by: Agnieszka C Co-authored-by: BLUEBIRD-hash Co-authored-by: Daniels Gaho Co-authored-by: Femini Co-authored-by: Fjuro Co-authored-by: Ghost of Sparta Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Igor Rückert Co-authored-by: Marcel Alin Co-authored-by: Milo Ivir Co-authored-by: VfBFan Co-authored-by: justcontributor Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/az/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/lv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ro/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hans/ Translation: NewPipe/compose --- .../composeResources/values-az/strings.xml | 87 ++++++++++++- .../composeResources/values-cs/strings.xml | 6 +- .../composeResources/values-de/strings.xml | 87 ++++++++++++- .../composeResources/values-hi/strings.xml | 2 + .../composeResources/values-hr/strings.xml | 10 ++ .../composeResources/values-hu/strings.xml | 2 +- .../composeResources/values-ko/strings.xml | 84 +++++++++++- .../composeResources/values-lv/strings.xml | 1 + .../composeResources/values-pl/strings.xml | 91 ++++++++++++- .../values-pt-rBR/strings.xml | 90 ++++++++++++- .../composeResources/values-ro/strings.xml | 120 +++++++++++++++++- .../values-zh-rCN/strings.xml | 86 ++++++++++++- 12 files changed, 644 insertions(+), 22 deletions(-) diff --git a/shared/src/commonMain/composeResources/values-az/strings.xml b/shared/src/commonMain/composeResources/values-az/strings.xml index 66b46a902..6187929f6 100644 --- a/shared/src/commonMain/composeResources/values-az/strings.xml +++ b/shared/src/commonMain/composeResources/values-az/strings.xml @@ -47,8 +47,8 @@ Sevimli gecə koloritinizi seçin — %1$s Bu seçim yalnız kolorit üçün %1$s seçildikdə əlçatandır Sevdiyiniz gecə koloritin aşağıda seçə bilərsiniz - \\"Növbələmək üçün basılı saxla"\\ tövsiyəsin göstər - Video \\"Təfsilatlar"\\ səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər + Növbələmək üçün basılı saxla tövsiyəsin göstər + Video Təfsilatlar səhifəsində fon və ya ani görüntü düyməsin basarkən ipucu göstər Planşet rejimi Siyahı görünüş rejimi Titrlər @@ -62,4 +62,87 @@ Şəbəkə Kart İmtina et + İlkin ayırdetmə + İlkin açılan pəncərə ayırdetməsi + Mobil məlumat istifadə edərkən ayırdetməni məhdudlaşdır + Daha böyük formatlar göstər + Yalnız bəzi cihazlar 2K/4K videoları oynada bilir + Standart video formatı + Standart səs formatı + Orijinal səsə üstünlük ver + Dildən asılı olmayaraq orijinal səs treki seç + Təsviri səsə üstünlük ver + Varsa, görmə qabiliyyəti zəifləyən insanlar üçün təsviri olan səs axını seçin + Ən yaxşı keyfiyyət + Limitsiz + Oynadıcı + Xarici video oynadıcı istifadə et + Bəzi formatlarda səsi silir + Xarici səs oynadıcı istifadə et + Kodi ilə Oynat seçimini göstər + Kodi media mərkəzindən video oynatmaq üçün seçim göstər + Axtarış çubuğunun miniatür önizləməsi + Yüksək keyfiyyət (daha böyük) + Aşağı keyfiyyət (daha kiçik) + Göstərməyin + Davranış + "Açıq" fəaliyyətə üstünlük verilir + Məzmunu açarkən standart hərəkət — %1$s + Məlumat göstər + Video oynadıcı + Fon oynadıcı + Ani görüntü oynadıcı + Yükləmə + Oynatma siyahısına əlavə et + Növbəyə qoy + Həmişə soruş + Tətbiq keçidində kiçilt + Əsas video oynadıcıdan digər tətbiqə keçid zamanı hərəkət — %1$s + Heç biri + Fon oynadıcısına kiçilt + Ani-pəncərə oynadıcısına kiçilt + Əsas oynadıcını tam ekranda başlat + Videoları kiçik oynadıcıda başlatma, avtomatik fırlatma kilidlidirsə, birbaşa tam ekran rejiminə keçid. Siz hələ də tam ekrandan çıxmaqla mini oynadıcıya daxil ola bilərsiniz + Avtomatik oynat + Oynatmanı avtomatik başlat — %1$s + Həmişə + Yalnız Wi-Fi'da + Heç vaxt + Növbəti Yayımı Avto-növbələ + Əlaqəli yayımı əlavə etməklə (təkrarlanmayan) sonlanacaq oynatma növbəsini davam etdir + Oynatmağa davam et + Fasilələr ardınca (məsələn, telefon zəngləri) oynatmağa davam et + Sol jest fəaliyyəti + Oynadıcı ekranının sol yarısı üçün jest seç + Sağ jest fəaliyyəti + Oynadıcı ekranının sağ yarısı üçün jest seç + Parlaqlıq + Səs səviyyəsi + Heç biri + Ani pəncərə xüsusiyyətlərini xatırla + Ani pəncərənin son ölçüsü və mövqeyini xatırla + Sürətli, qeyri-dəqiq axtarış istifadə et + Qeyri-dəqiq axtarış oynadıcıya azaldılmış dəqiqliklə mövqeləri daha sürətli axtarmağa imkan verir. 5, 15 və ya 25 saniyəlik axtarış bununla işləmir + Sürətli irəli/geri çəkmə axtarış müddəti + ExoPlayer məhdudiyyətlərinə görə axtarış müddəti %1$d saniyəyə təyin edildi + Növbəni təmizləməzdən əvvəl təsdiq üçün soruş + Bir oynadıcıdan digərinə keçid növbənizi dəyişdirə bilər + Cihaz daxili media düyməsi problemlərinə məhəl qoyma + Məsələn, fiziki düymələri qırılan qulaqlıq işlədirsinizsə faydalıdır + + %1$d saniyə + %1$d saniyə + + ExoPlayer tənzimləmələri + Bəzi ExoPlayer tənzimləmələrin idarə et. Bu dəyişiklikləri təsirli etmək üçün oynadıcını yenidən başlatmaq tələb olunur + Oynatma yükləmə intervalı həcmi + Qabaqcıl məzmunda yükləmə aralığı həcmin dəyişdir (hazırda %1$s). Daha aşağı dəyər onların ilkin yüklənilməsin sürətləndirə bilər + ExoPlayer standartı + ExoPlayer-in çözücü ehtiyatı xüsusiyyətin istifadə et + Əsas çözücüləri işlətmə uğursuz olarsa, çözücü işlətmək probleminiz varsa (daha aşağı prioritetli çözücülərə düşür), bu seçimi aktiv edin. Bu, əsas çözücülərdən istifadə ilə müqayisədə zəif oynatma performansı ilə nəticələnə bilər + Media girişin qeyri-aktiv et + Qara ekranla qarşılaşsanız və ya videonu oynatdıqda donarsa, media girişin qeyri-aktiv edin. + Media girişi cihazınızda standart olaraq qeyri-aktiv edilib, çünki cihazınızın modelinin bunu dəstəkləmədiyi məlumdur. + Həmişə ExoPlayer-in video çıxış səthi tənzimləməsin istifadə et + Bu həll yolu səthi kodlayıcıya birbaşa tənzimləmək əvəzinə, səth dəyişikliyi olarsa video kodlayıcıları buraxır və yenidən işlədir. Artıq ExoPlayer vasitəsilə bu problemli bəzi cihazlarda istifadə olunur, bu tənzimləmənin təsiri yalnız Android 6 və daha yüksəkdə var. \n \nBu seçimi işlətmə cari video oynadıcı dəyişəndə və ya tam ekrana keçəndə oynatma xətaların düzəldə bilər diff --git a/shared/src/commonMain/composeResources/values-cs/strings.xml b/shared/src/commonMain/composeResources/values-cs/strings.xml index 4ac02913a..84bbb19f7 100644 --- a/shared/src/commonMain/composeResources/values-cs/strings.xml +++ b/shared/src/commonMain/composeResources/values-cs/strings.xml @@ -47,8 +47,8 @@ Zvolte si svůj oblíbený noční motiv – %1$s Tato možnost je dostupná pouze, když je zvolen motiv %1$s Svůj oblíbený noční motiv si můžete zvolit níže - Zobrazit tip „Podržte pro zařazení do fronty“ - Zobrazit tip po klepnutí na pozadí nebo na vyskakovací tlačítko v „Podrobnostech“ videa + Zobrazit tip Podržte pro zařazení do fronty + Zobrazit tip po klepnutí na pozadí nebo na vyskakovací tlačítko v Podrobnostech videa: Režim tabletu Režim zobrazení seznamu Titulky @@ -62,4 +62,6 @@ Mřížka Karta Zrušit + Výchozí rozlišení + Výchozí rozlišení vyskakovacího okna diff --git a/shared/src/commonMain/composeResources/values-de/strings.xml b/shared/src/commonMain/composeResources/values-de/strings.xml index dda59ef46..7c07378fe 100644 --- a/shared/src/commonMain/composeResources/values-de/strings.xml +++ b/shared/src/commonMain/composeResources/values-de/strings.xml @@ -47,8 +47,8 @@ Wähle dein bevorzugtes Nachtdesign aus — %1$s Diese Option ist nur verfügbar, wenn %1$s als Design ausgewählt wird Du kannst dein bevorzugtes Nachtdesign unten auswählen - \\„Halten zum Einreihen\\“-Tipp anzeigen - Tipp anzeigen, wenn die Hintergrundwiedergabe- oder Pop-up-Schaltfläche \\„Details:\\“ im Video gedrückt wird + Halten-zum-Einreihen-Tipp anzeigen + Tipp anzeigen, wenn die Hintergrundwiedergabe- oder Pop-up-Schaltfläche Details: im Video gedrückt wird Tablet-Modus Art der Ansicht Untertitel @@ -62,4 +62,87 @@ Raster Karte Abbrechen + Standardauflösung + Pop-up-Standardauflösung + Auflösung bei der Nutzung mobiler Daten begrenzen + Höhere Auflösungen anzeigen + Nur manche Geräte können 2K-/4K-Videos abspielen + Standard-Videoformat + Standard-Audioformat + Originalton bevorzugen + Originaltonspur unabhängig von der Sprache wählen + Beschreibendes Audio bevorzugen + Wenn möglich Audiospur mit Beschreibungen für sehbehinderte Menschen wählen + Beste Auflösung + Unbegrenzt + Player + Externen Video-Player verwenden + Entfernt Tonspur bei manchen Auflösungen + Externen Audio-Player verwenden + Mit-Kodi-abspielen-Option anzeigen + Option anzeigen, um Videos mit Kodi abzuspielen + Vorschaubild der Suchleiste + Hohe Qualität (größer) + Niedrige Qualität (kleiner) + Nicht anzeigen + Verhalten + Bevorzugte „Öffnen“-Aktion + Standardaktion beim Öffnen von Inhalten — %1$s + Infos anzeigen + Video-Player + Wiedergabe im Hintergrund + Pop-up-Player + Herunterladen + Zur Wiedergabeliste hinzufügen + In Wiedergabe einreihen + Immer fragen + Beim App-Wechsel minimieren + Aktion beim Umschalten auf eine andere App vom Haupt-Videoplayer — %1$s + Keine + Für die Wiedergabe im Hintergrund minimieren + Für die Wiedergabe im Pop-up minimieren + Hauptplayer im Vollbildmodus starten + Videos nicht im Miniplayer starten, sondern direkt in den Vollbildmodus schalten, wenn die automatische Drehung gesperrt ist. Du kannst immer noch auf den Miniplayer zugreifen, wenn du den Vollbildmodus verlässt + Automatische Wiedergabe + Wiedergabe automatisch starten — %1$s + Immer + Nur über WLAN + Nie + Nächsten Stream automatisch einreihen + Wiedergabe durch Anhängen eines verwandten Streams an die Warteschlange (ohne Wiederholungsschleife) fortsetzen + Wiedergabe fortsetzen + Nach Unterbrechungen (z. B. Telefonaten) Wiedergabe fortsetzen + Linke Gestenaktion + Geste für die linke Hälfte des Player-Bildschirms auswählen + Rechte Gestenaktion + Geste für die rechte Hälfte des Player-Bildschirms auswählen + Helligkeit + Lautstärke + Keine + Eigenschaften des Pop-ups merken + Letzte Größe und Position des Pop-ups merken + Schnelle, ungenaue Suche verwenden + Mit ungenauem Suchen kann die ungefähre Abspielposition schneller erreicht werden. Das Spulen um 5, 15 oder 25 Sekunden funktioniert damit nicht + Dauer der Suche bei schnellem Vor-/Zurückspulen + Aufgrund von ExoPlayer-Einschränkungen wurde die Suchdauer auf %1$d Sekunden gesetzt + Überschreiben der Warteschlange bestätigen + Der Wechsel von einem Player zu einem anderen kann deine Warteschlange überschreiben + Ereignisse der Hardware-Medientasten ignorieren + Nützlich, wenn z. B. ein Headset mit defekten physischen Tasten verwendet wird + + %1$d Sekunde + %1$d Sekunden + + ExoPlayer-Einstellungen + Einige ExoPlayer-Einstellungen steuern. Diese Änderungen erfordern einen Neustart des Players, um wirksam zu werden + Größe des Ladeintervalls für die Wiedergabe + Ändere die Größe des Ladeintervalls für progressive Inhalte (derzeit %1$s). Ein niedrigerer Wert kann das anfängliche Laden der Inhalte beschleunigen + ExoPlayer-Standard + Die Decoder-Fallback-Funktion von ExoPlayer verwenden + Einschalten, wenn es Probleme mit der Decoderinitialisierung gibt, die auf Decoder mit niedrigerer Priorität zurückgreift, wenn die Initialisierung des primären Decoders fehlschlägt. Dies kann zu einer schlechteren Wiedergabeleistung führen als bei der Verwendung von Primärdecodern + Media-Tunneling deaktivieren + Deaktiviere das Media-Tunneling, wenn bei der Videowiedergabe ein schwarzer Bildschirm oder Stottern auftritt. + Das Media-Tunneling wurde auf dem Gerät standardmäßig deaktiviert, da das Gerätemodell diese Funktion bekanntermaßen nicht unterstützt. + Immer die ExoPlayer-Einstellung für die Videoausgangsoberfläche als Umgehung verwenden + Dieser Workaround gibt die Video-Codecs frei und instanziiert sie neu, wenn sich die Oberfläche ändert, anstatt die Oberfläche direkt auf den Codec zu setzen. Diese Einstellung wird bereits von ExoPlayer auf einigen Geräten mit diesem Problem verwendet und hat nur Auswirkungen auf Android 6 und höher \n \nDas Aktivieren dieser Option kann Wiedergabefehler beim Wechsel des aktuellen Videoplayers oder beim Wechsel zum Vollbildmodus verhindern diff --git a/shared/src/commonMain/composeResources/values-hi/strings.xml b/shared/src/commonMain/composeResources/values-hi/strings.xml index dcfbcc2a0..0340fb9e9 100644 --- a/shared/src/commonMain/composeResources/values-hi/strings.xml +++ b/shared/src/commonMain/composeResources/values-hi/strings.xml @@ -38,4 +38,6 @@ अपडेटस बैकअप और रिस्टोर डीबग + थीम + लाइट diff --git a/shared/src/commonMain/composeResources/values-hr/strings.xml b/shared/src/commonMain/composeResources/values-hr/strings.xml index ead23d2ee..a6d1a68be 100644 --- a/shared/src/commonMain/composeResources/values-hr/strings.xml +++ b/shared/src/commonMain/composeResources/values-hr/strings.xml @@ -22,4 +22,14 @@ Otvori u pregledniku Gotovo Nije dostupno + Licence + Ako imate ideja za prijevod, promjene u dizajnu, čišćenje koda ili neke veće promjene u kodu, pomoć je uvijek dobrodošla. Što više radimo, to bolji postajemo! + Pogledaj na GitHubu + Doniraj + NewPipe razvijaju volonteri koji provode vrijeme kako bi doprinijeli najboljem korisničkom iskustvu. Doprinesi programerima kako bi poboljšali NewPipe dok uživaju u šalici kave. + Postavke + Pretraga + Sadržaj + Obavijesti + Video i audio diff --git a/shared/src/commonMain/composeResources/values-hu/strings.xml b/shared/src/commonMain/composeResources/values-hu/strings.xml index e5a10d747..b98336446 100644 --- a/shared/src/commonMain/composeResources/values-hu/strings.xml +++ b/shared/src/commonMain/composeResources/values-hu/strings.xml @@ -49,7 +49,7 @@ Feliratok Ez a lehetőség csak akkor érhető el, ha a(z) %1$s van kiválasztva témaként Az alábbiakban kiválaszthatja kedvenc éjszakai témáját - \\"Tartsa lenyomva a sorba állításhoz\\" tipp megjelenítése + Tartsa lenyomva a sorba állításhoz tipp megjelenítése Tipp megjelenítése a háttér vagy a felugró ablak gombjának megnyomásakor a videó \\"Részletek:\\" részében Listanézet mód A lejátszó feliratának, szövegméretének és háttérstílusainak módosítása. A módosítások érvénybe lépéséhez újra kell indítani az alkalmazást diff --git a/shared/src/commonMain/composeResources/values-ko/strings.xml b/shared/src/commonMain/composeResources/values-ko/strings.xml index 838ceef70..9969b9db3 100644 --- a/shared/src/commonMain/composeResources/values-ko/strings.xml +++ b/shared/src/commonMain/composeResources/values-ko/strings.xml @@ -60,6 +60,88 @@ 플레이어 자막 글씨 크기나 배경 서식을 변경합니다. 적용하려면 앱을 다시 시작해야 합니다 이 옵션은 %1$s 테마를 선택해야 이용할 수 있습니다 아래에서 선호하는 야간 테마를 선택할 수 있습니다 - \\"길게 눌러 대기열에 추가\\" 팁 표시 + 길게 눌러 대기열에 추가 팁 표시 비디오 "세부사항:"에서 배경 또는 팝업 버튼을 누를 때 팁 표시 + 기본 해상도 + 기본 팝업 해상도 + 모바일 데이터 사용 시 해상도 제한 + 더 높은 해상도 표시 + 일부 기기에서만 2K/4K 동영상을 재생할 수 있습니다 + 기본 동영상 형식 + 기본 오디오 형식 + 원본 오디오 우선 + 언어와 상관없이 원본 오디오 트랙 선택 + 음성 해설 우선 + 시각 장애인을 위한 해설이 든 오디오 트랙이 있다면 선택합니다 + 최고 해상도 + 제한 없음 + 플레이어 + 외장 동영상 플레이어 사용 + 일부 해상도에서 오디오가 제거됩니다 + 외장 오디오 플레이어 사용 + "Kodi로 재생" 옵션 표시 + 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 + 탐색막대 썸네일 미리보기 + 고품질 (크게) + 저품질 (작게) + 표시하지 않음 + 동작 + 선호하는 열기 동작 + 콘텐츠를 열 때 사용할 기본 동작 — %1$s + 정보 보기 + 비디오 플레이어 + 백그라운드 플레이어 + 팝업 플레이어 + 다운로드 + 재생목록에 추가 + 대기열에 넣기 + 항상 묻기 + 앱 전환시 최소화 + 비디오 플레이어에서 다른 앱으로 전환 시 다음과 같은 동작 실행 — %1$s + 없음 + 백그라운드 플레이어로 최소화 + 팝업 플레이어로 최소화 + 전체화면으로 주 플레이어 시작 + 화면 자동 회전이 잠겨 있는 경우 미니 플레이어에서 동영상을 시작하지 말고 바로 전체 화면 모드로 재생하세요. 전체 화면을 종료해서 미니 플레이어를 이용할 수도 있습니다 + 자동 재생 + 자동으로 재생 시작 — %1$s + 항상 + Wi-Fi에서만 + 사용하지 않음 + 다음 스트림을 자동으로 대기열에 추가 + 이어서 재생 + 중단 후 계속 재생(예: 전화 통화) + 왼쪽 제스처 동작 + 플레이어 화면 왼쪽 절반에 대한 제스처 선택 + 오른쪽 제스처 동작 + 플레이어 화면 오른쪽 절반에 대한 제스처 선택 + 밝기 + 볼륨 + 없음 + 팝업 크기 및 위치 기억 + 마지막으로 사용한 팝업 위치 및 크기를 기억합니다 + 정확하지 않은 빠른 탐색 사용 + 정확하지 않은 탐색을 사용하면 정확도가 떨어지는 대신 더 빠르게 위치를 탐색할 수 있습니다. 5초, 15초 또는 25초 탐색 기능은 이 기능과 같이 동작하지 않습니다 + ExoPlayer 제약으로 인해 탐색 시간이 %1$d초로 설정되었습니다 + 대기열을 지우기 전에 확인 요청 + 한 플레이어에서 다른 플레이어로 전환하면 대기열이 대체될 수 있습니다 + 하드웨어 미디어 버튼 이벤트 무시 + 예를 들어, 물리적 버튼이 망가진 헤드셋을 사용하는 경우 유용합니다 + + %1$d초 + + ExoPlayer 설정 + ExoPlayer 설정을 관리합니다. 이러한 변경 사항을 적용하려면 플레이어를 다시 시작해야 함 + 재생 로드 간격 크기 + 프로그레시브 콘텐츠의 불러오기 간격 크기를 변경합니다 (현재 %1$s). 값이 낮을수록 초기 로딩 속도가 빨라질 수 있음 + ExoPlayer 기본 + ExoPlayer의 디코더 폴백 기능 사용 + 디코더 초기화 문제가 있는 경우 이 옵션을 활성화하면 기본 디코더 초기화에 실패할 경우 우선순위가 낮은 디코더로 되돌아갑니다. 이 경우 기본 디코더를 사용할 때보다 재생 성능이 저하될 수 있음 + 미디어 터널링 비활성화 + 동영상 재생 시 검은 화면이 나타나거나 끊김 현상이 발생하면 미디어 터널링을 비활성화하세요. + 장치 모델에서 미디어 터널링을 지원하지 않는 것으로 알려져 있기 때문에 장치에서 기본적으로 미디어 터널링이 비활성화되었습니다. + 항상 ExoPlayer의 비디오 출력 표면 설정 해결 방법 사용 + 이 해결 방법은 인터페이스가 변경될 때 인터페이스를 코덱으로 직접 설정하는 대신 비디오 코덱을 해제하고 다시 인스턴스화합니다. 이 문제가 있는 일부 기기에서 ExoPlayer가 이미 사용 중인 이 설정은 안드로이드 6 이상에서만 적용 \n \n이 옵션을 활성화하면 현재 동영상 플레이어를 전환하거나 전체 화면으로 전환할 때 재생 오류를 방지할 수 있음 + 관련 스트림을 추가하여 (미반복) 재생 대기열의 끝을 이어가기 + 빨리감기/되감기 탐색 간격 diff --git a/shared/src/commonMain/composeResources/values-lv/strings.xml b/shared/src/commonMain/composeResources/values-lv/strings.xml index ce29a1b78..268ae0143 100644 --- a/shared/src/commonMain/composeResources/values-lv/strings.xml +++ b/shared/src/commonMain/composeResources/values-lv/strings.xml @@ -38,4 +38,5 @@ Vēsture un kešatmiņa Atjauninājumi Atkļūdošana + IzskataIestatījumaEkrānu diff --git a/shared/src/commonMain/composeResources/values-pl/strings.xml b/shared/src/commonMain/composeResources/values-pl/strings.xml index 8d30cb8fb..93f2c1d86 100644 --- a/shared/src/commonMain/composeResources/values-pl/strings.xml +++ b/shared/src/commonMain/composeResources/values-pl/strings.xml @@ -25,7 +25,7 @@ Otwórz w przeglądarce Gotowe %1$s na licencji %2$s - Projekt NewPipe bardzo poważnie traktuje Twoją prywatność, dlatego aplikacja nie gromadzi żadnych danych bez Twojej zgody. \nPolityka prywatności NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, kiedy wysyłasz raport o awarii aplikacji. + Projekt NewPipe bardzo poważnie traktuje Twoją prywatność, dlatego aplikacja nie gromadzi żadnych danych bez Twojej zgody. \nPolityka prywatności NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, gdy wysyłasz raport o awarii aplikacji. Niedostępna Ustawienia Szukaj @@ -47,8 +47,8 @@ Wybierz swój ulubiony motyw nocny — %1$s Ta opcja jest dostępna tylko wtedy, gdy %1$s jest wybrany jako motyw Możesz wybrać swój ulubiony motyw nocny poniżej - Pokazuj poradę „Przytrzymaj, aby dodać” - Pokaż wskazówkę po naciśnięciu tła lub wyskakującego przycisku „Szczegóły” w odtwarzaczu + Pokazuj poradę Przytrzymaj, aby dodać + Pokaż wskazówkę po naciśnięciu tła lub wyskakującego przycisku Szczegóły w odtwarzaczu Tryb tabletu Tryb widoku listy Napisy @@ -62,4 +62,89 @@ Siatka Karta Anuluj + Domyślna rozdzielczość + Domyślna rozdzielczość trybu okienkowego + Ograniczaj rozdzielczość podczas korzystania z danych mobilnych + Pokazuj wyższe rozdzielczości + Tylko niektóre urządzenia mogą odtwarzać wideo w 2K/4K + Domyślny format wideo + Domyślny format audio + Preferuj oryginalny dźwięk + Wybieraj oryginalną ścieżkę dźwiękową niezależnie od języka + Preferuj audiodeskrypcję + Wybieraj ścieżkę dźwiękową z opisami dla osób niedowidzących, jeśli jest dostępna + Najlepsza rozdzielczość + Bez limitu + Odtwarzacz + Używaj zewnętrznego odtwarzacza wideo + Usuwa dźwięk w niektórych rozdzielczościach + Używaj zewnętrznego odtwarzacza audio + Pokazuj opcję Odtwórz z Kodi + Wyświetlaj opcję odtwarzania wideo przez centrum multimedialne Kodi + Podgląd miniatury na pasku przewijania + Wysoka jakość (większy) + Niska jakość (mniejszy) + Nie pokazuj + Zachowanie + Preferowana akcja „otwórz” + Domyślna akcja podczas otwierania treści — %1$s + Pokaż informacje + Odtwarzacz wideo + Odtwarzacz w tle + Odtwarzacz w trybie okienkowym + Pobierz + Dodaj do playlisty + Dodaj do kolejki + Zawsze pytaj + Minimalizuj przy przełączaniu aplikacji + Akcja po przejściu do innej aplikacji z głównego odtwarzacza wideo — %1$s + Brak + Zminimalizuj do odtwarzacza w tle + Zminimalizuj do odtwarzacza w trybie okienkowym + Uruchamiaj główny odtwarzacz w trybie pełnoekranowym + Nie uruchamiaj wideo w miniodtwarzaczu, ale przełączaj się bezpośrednio na tryb pełnoekranowy, jeśli automatyczne obracanie jest zablokowane. Nadal możesz uzyskać dostęp do miniodtwarzacza, wychodząc z trybu pełnoekranowego + Automatyczne odtwarzanie + Rozpoczynaj odtwarzanie automatycznie — %1$s + Zawsze + Tylko przez Wi-Fi + Nigdy + Automatyczne kolejkowanie następnego strumienia + Gdy kończy się kolejka odtwarzania, dodaj do niej kolejną powiązaną pozycję + Wznawiaj odtwarzanie + Kontynuuj odtwarzanie po przerwaniu (np. po rozmowie telefonicznej) + Akcja gestu z lewej + Wybierz gest dla lewej strony ekranu odtwarzacza + Akcja gestu z prawej + Wybierz gest dla prawej strony ekranu odtwarzacza + Jasność + Głośność + Brak + Pamiętaj właściwości trybu okienkowego + Zapamiętaj ostatni rozmiar i pozycję trybu okienkowego + Używaj szybkiego, niedokładnego przewijania + Niedokładne przewijanie umożliwia szybsze przewijanie ze zmniejszoną dokładnością. Przewijanie o 5, 15 lub 25 sekund nie działa w tym przypadku + Wielkość skoku przy przewijaniu + Wielkość skoku przewijania została ustawiona na %1$d sekund ze względu na ograniczenia odtwarzacza ExoPlayer + Poproś o potwierdzenie przed wyczyszczeniem kolejki + Przejście z jednego odtwarzacza na inny może zastąpić kolejkę + Ignoruj zdarzenia sprzętowego przycisku multimedialnego + Przydatne, na przykład, jeśli używasz zestawu słuchawkowego z zepsutymi fizycznymi przyciskami + + %1$d sekunda + %1$d sekund + %1$d sekund + %1$d sekund + + Ustawienia ExoPlayera + Zarządzaj niektórymi ustawieniami ExoPlayera. Zmiany te wymagają ponownego uruchomienia odtwarzacza, aby zostały uwzględnione + Rozmiar interwału ładowania odtwarzania + Zmień rozmiar interwału ładowania zawartości progresywnych (aktualnie %1$s). Niższa wartość może przyspieszyć ich początkowe ładowanie + domyślny ExoPlayera + Używaj funkcji zapasowego dekodera ExoPlayera + Włącz tę opcję, jeśli masz problemy z inicjalizacją dekodera. Przywraca dekodery o niższym priorytecie, jeśli inicjalizacja podstawowych dekoderów się nie powiedzie. Może to spowodować słabszą wydajność odtwarzania niż podczas korzystania z podstawowych dekoderów + Wyłącz tunelowanie multimediów + Wyłącz tunelowanie multimediów, jeśli zaobserwowałeś(-aś) czarny ekran bądź brak płynności odtwarzania wideo. + Tunelowanie multimediów zostało domyślnie wyłączone na Twoim urządzeniu, ponieważ wiadomo, że model Twojego urządzenia go nie obsługuje + Zawsze używaj obejścia ustawienia powierzchni wyjścia wideo ExoPlayera + To obejście zwalnia i ponownie tworzy instancje kodeków wideo, gdy nastąpi zmiana powierzchni, zamiast bezpośrednio ustawiać powierzchnię dla kodeka. Używane już przez ExoPlayera na niektórych urządzeniach z tym problemem, ustawienie to ma wpływ tylko na Androida 6 i nowsze. \n \nWłączenie tej opcji może zapobiec błędom odtwarzania podczas przełączania obecnego odtwarzacza wideo lub przechodzenia na pełny ekran diff --git a/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml b/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml index 3f0d54f36..a93cbf605 100644 --- a/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -16,7 +16,7 @@ Site Visite o site do NewPipe para mais informações e novidades. Política de Privacidade do NewPipe - O projeto NewPipe leva a sua privacidade muito a sério. Portanto, o aplicativo não coleta nenhum dado sem o seu consentimento.\nA política de privacidade do NewPipe explica detalhadamente quais dados são enviados e armazenados ao enviar um relatório de erro. + O projeto NewPipe leva a sua privacidade muito a sério. Portanto, o aplicativo não coleta nenhum dado sem o seu consentimento.\nA política de privacidade do NewPipe explica detalhadamente quais dados são enviados e armazenados quando você envia um relatório de falha. Leia a política de privacidade Licença do NewPipe NewPipe é um software copyleft libre: você pode usá-lo, estudá-lo, compartilhá-lo e melhorá-lo à vontade. Especificamente, você pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (a seu critério) qualquer versão posterior. @@ -47,8 +47,8 @@ Selecione seu tema noturno favorito — %1$s Esta opção só está disponível se %1$s estiver selecionado como Tema Você pode selecionar seu tema noturno favorito abaixo - Mostrar dica \\"Segure para enfileirar\\" - Mostrar dica ao pressionar fundo ou botão pop-up no vídeo \\"Detalhes:\\" + Mostrar dica Segure para enfileirar + Mostrar dica ao pressionar fundo ou botão pop-up nos detalhes do vídeo: Modo tablet Modo de visualização de lista Legendas @@ -62,4 +62,88 @@ Grade Cartão Cancelar + Resolução padrão + Resolução padrão do pop-up + Limitar resolução ao usar dados móveis + Mostrar resoluções mais altas + Apenas alguns dispositivos podem reproduzir vídeos 2K/4K + Formato de vídeo padrão + Formato de áudio padrão + Preferir áudio original + Selecionar faixa de áudio original independentemente do idioma + Preferir áudio descritivo + Selecionar faixa de áudio com descrições para pessoas com deficiência visual, se disponível + Melhor resolução + Sem limite + Player + Usar player de vídeo externo + Remove áudio em algumas resoluções + Usar reprodutor de áudio externo + Mostrar opção Reproduzir com Kodi + Exibir uma opção para reproduzir um vídeo através do centro de mídia Kodi + Visualização em miniatura da barra de busca + Alta qualidade (maior) + Baixa qualidade (menor) + Não mostrar + Comportamento + Ação 'abrir' preferida + Ação padrão ao abrir conteúdo — %1$s + Mostrar informações + Player de vídeo + Player em segundo plano + Player pop-up + Download + Adicionar à playlist + Enfileirar + Sempre perguntar + Minimizar na troca de aplicativos + Ação ao mudar para outro aplicativo a partir do player de vídeo principal — %1$s + Nenhum + Minimizar para player em segundo plano + Minimizar para player pop-up + Iniciar player principal em tela cheia + Não iniciar vídeos no miniplayer, mas mude diretamente para o modo de tela inteira, se a rotação automática estiver bloqueada. Você ainda pode acessar o miniplayer saindo da tela inteira + Reprodução automática + Iniciar reprodução automaticamente — %1$s + Sempre + Somente no Wi-Fi + Nunca + Enfileirar automaticamente o próximo stream + Continuar encerrando a fila de reprodução (sem repetição) anexando um fluxo relacionado + Retomar reprodução + Continuar reproduzindo após interrupções (por exemplo, ligações) + Ação do gesto esquerdo + Escolha o gesto para a metade esquerda da tela do player + Ação do gesto direito + Escolha o gesto para a metade direita da tela do player + Brilho + Volume + Nenhum + Lembrar das propriedades do pop-up + Lembrar do último tamanho e posição do pop-up + Usar busca rápida não exata + A busca não exata permite ao player buscar posições mais rapidamente com precisão reduzida. Buscar por 5, 15 ou 25 segundos não funciona com isso + Duração da busca de avanço/retrocesso rápido + Devido a restrições do ExoPlayer, a duração da busca foi definida para %1$d segundos + Pedir confirmação antes de limpar uma fila + Mudar de um player para outro pode substituir sua fila + Ignorar eventos de botão de mídia de hardware + Útil, por exemplo, se você estiver usando um fone de ouvido com botões físicos quebrados + + %1$d segundo + %1$d segundos + %1$d segundos + + Configurações do ExoPlayer + Gerenciar algumas configurações do ExoPlayer. Essas mudanças exigem a reinicialização do player para entrarem em vigor + Tamanho do intervalo de carregamento de reprodução + Alterar tamanho do intervalo de carregamento em conteúdos progressivos (atualmente %1$s). Um valor mais baixo pode acelerar o carregamento inicial + Padrão do ExoPlayer + Usar recurso de fallback do decodificador do ExoPlayer + Habilite esta opção se você tiver problemas de inicialização do decodificador, que retornarão para decodificadores de prioridade mais baixa se a inicialização dos decodificadores primários falhar. Isso pode resultar em um desempenho de reprodução ruim do que ao usar decodificadores primários + Desabilitar o tunelamento de mídia + Desativa o tunelamento de mídia se você tiver uma tela preta ou interrupções na reprodução do vídeo. + O tunelamento de mídia foi desativado por padrão no seu dispositivo porque sabe-se que o modelo do seu dispositivo não é compatível. + Sempre usar solução alternativa de configuração de superfície de saída de vídeo do ExoPlayer + Esta solução alternativa libera e reinstancia codecs de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície diretamente para o codec. Já usada pelo ExoPlayer em alguns dispositivos com esse problema, essa configuração só tem efeito no Android 6 e superior\n\nAtivar esta opção pode evitar erros de reprodução ao mudar o player de vídeo atual ou mudar para tela cheia diff --git a/shared/src/commonMain/composeResources/values-ro/strings.xml b/shared/src/commonMain/composeResources/values-ro/strings.xml index 78ab89ef7..0a7455ade 100644 --- a/shared/src/commonMain/composeResources/values-ro/strings.xml +++ b/shared/src/commonMain/composeResources/values-ro/strings.xml @@ -4,11 +4,11 @@ Despre NewPipe Licențe terță-parte De %1$s sub %2$s - Despre & Întrebări Comune + Despre & Întrebări frecvente Licențe Streaming sursă-liberă pentru Android. Contribuie - Când îți vine idea de; traduceri, schimbări de design, curățare cod sau schimbări reale de cod - Ajutorul este mereu binevenit. Cu cât mai mult, cu cât mai bine! + Indiferent dacă ai idei legate de traduceri, modificări de design, curățarea codului sau modificări majore ale codului — ajutorul tău este întotdeauna binevenit. Cu cât se face mai mult, cu atât rezultatul este mai bun! Vezi pe GitHub Donează NewPipe este creat de voluntari ce își oferă timpul lor liber pentru ați oferi cea mai bună experiență. Oferă înapoi creatorilor pentru a face aplicația și mai bună. @@ -16,14 +16,14 @@ Site Web Vizitează site-ul NewPipe pentru mai multe informații si noutăți. Politica de Confidențialitate NewPipe - Proiectul NewPipe îți ia confidențialitatea foarte în serios. Din acest motiv aplicația nu colectează date fără aprobarea dvs.\nPolitica de confidențialitate a NewPipe explică în detaliu ce date sunt trimise și stocate când trimiți un raport de cădere (Crash). + Proiectul NewPipe acordă o importanță deosebită confidențialității datelor tale. Prin urmare, aplicația nu colectează nicio informație fără consimțământul tău.\nPolitica de confidențialitate a NewPipe explică în detaliu ce date sunt transmise și stocate atunci când trimiți un raport de eroare. Citește Politica de confidențialitate - Licența a NewPipe + Licența NewPipe NewPipe este o aplicație liberă: Poți folosi, studia, partaja, și a o face mai bună după propria voință. Poți redistribui și/sau modifica aplicația în termenii GNU GPL publicate de Free Software Foundation, toate dintre cele 3 versiuni, or (la opțiunea dvs.) orice versiune mai nouă. Citește licența Întrebări frecvente Dacă aveți probleme folosind aplicația, uitați-vă la răspunsurile celor mai comune întrebărilor puse! - Vezi în website + Vezi pe site-ul web Deschide în browser Gata Indisponibil @@ -34,8 +34,116 @@ Video și audio Descarcă Aparență - Istorie și cache + Istoric și cache Actualizări Copie de rezervă și Restabilire Depanare + Temă + Luminoasă + Întunecată + Neagră + Automată (tema dispozitivului) + Temă de noapte + Alege-ți tema de noapte preferată — %1$s + Această opțiune este disponibilă numai dacă %1$s este selectat ca temă + Mai jos poți selecta tema de noapte preferată + Afișează „Așteaptă” pentru a adăuga sfatul în coadă + Afișează sfatul atunci când apeși pe fundal sau pe butonul ferestrei pop-up din secțiunea „Detalii” a videoclipului: + Modul tabletă + Modul de afișare în listă + Subtitrări + Poziția filelor principale + Mută selectorul filei principale în partea de jos + Auto + Pornit + Oprit + Listă + Anulează + Afișează rezoluții mai mari + Formatul video implicit + Formatul audio implicit + Prefer sunetul original + Selectează pista audio originală, indiferent de limbă + Prefer sunetul descriptiv + Selectează o pistă audio cu descrieri pentru persoanele cu deficiențe de vedere, dacă este disponibilă + Fără limită + Elimină sunetul la anumite rezoluții + Afișează opțiunea „Redare cu Kodi” + Afișează o opțiune pentru redarea unui videoclip prin intermediul centrului media Kodi + Previzualizare miniatură în bara de căutare + Calitate înaltă (dimensiune mai mare) + Calitate scăzută (dimensiune mai mică) + Nu afișa + Comportament + Afișează informații + Întreabă întotdeauna + Minimizează la comutarea între aplicații + Redare automată + Pornește redarea automat — %1$s + Întotdeauna + Doar prin Wi-Fi + Niciodată + Continuați coada de redare finală (fără repetări) prin adăugarea unui flux asociat + Reia redarea + Continuă redarea după întreruperi (de exemplu, apeluri telefonice) + Acțiune gest la stânga + Alege un gest pentru jumătatea stângă a ecranului playerului + Acțiune gest la dreapta + Luminozitate + Volum + Niciun + Utilizează căutarea rapidă inexactă + Durata căutării cu derulare rapidă înainte/înapoi + Din cauza unor limitări ale ExoPlayer, durata de căutare a fost setată la %1$d secunde + Solicitați confirmarea înainte de a goli o coadă + Folositor, de exemplu, dacă folosești o cască cu butoane fizice defecte + Setări ExoPlayer + Gestionați anumite setări ale ExoPlayer. Pentru ca aceste modificări să intre în vigoare, este necesară repornirea playerului + Dimensiunea intervalului de încărcare la redare + Modificați durata intervalului de încărcare pentru conținutul progresiv (în prezent %1$s). O valoare mai mică poate accelera încărcarea inițială a acestuia + Setarea implicită pentru ExoPlayer + Utilizați funcția de rezervă a decodorului din ExoPlayer + Activați această opțiune dacă întâmpinați probleme la inițializarea decodoarelor; aceasta va recurge la decodoare cu prioritate mai mică în cazul în care inițializarea decodoarelor principale eșuează. Acest lucru poate duce la o performanță de redare inferioară față de cea obținută la utilizarea decodoarelor principale + Dezactivează tunelarea conținutului media + Dezactivați funcția de tunelare media dacă ecranul rămâne negru sau dacă redarea videoclipurilor se întrerupe. + Funcția de tunelare media a fost dezactivată în mod implicit pe dispozitivul dumneavoastră, deoarece se știe că modelul acesta nu o suportă. + Folosiți întotdeauna soluția alternativă pentru setarea suprafeței de ieșire video a ExoPlayer + Modificați dimensiunea textului subtitrărilor playerului și stilurile de fundal. Pentru ca modificările să intre în vigoare, este necesară repornirea aplicației + Rezoluția implicită + Rezoluția implicită a ferestrei pop-up + Limitați rezoluția atunci când utilizați datele mobile + Doar anumite dispozitive pot reda videoclipuri 2K/4K + Cea mai bună rezoluție + Player + Utilizați un player video extern + Utilizați un player audio extern + Acțiunea de „deschidere” preferată + Acțiunea implicită la deschiderea conținutului — %1$s + Player video + Player în fundal + Player în fereastră pop-up + Descărcare + Adaugă la lista de redare + Adăugare în coada de așteptare + Acțiune la trecerea la o altă aplicație din playerul video principal — %1$s + Niciuna + Minimizează playerul în fundal + Minimizează playerul în fereastră pop-up + Pornește playerul principal în modul ecran complet + Nu porniți videoclipurile în mini-player, ci treceți direct în modul ecran complet, dacă rotirea automată este blocată. Puteți accesa în continuare mini-playerul ieșind din modul ecran complet + Adăugare automată în coadă a fluxului următor + Alege un gest pentru jumătatea din dreapta a ecranului playerului + Rețineți proprietățile ferestrelor pop-up + Reține ultima dimensiune și poziție a ferestrei pop-up + Căutarea inexactă permite playerului să se deplaseze mai rapid la anumite poziții, cu o precizie redusă. Căutarea pentru 5, 15 sau 25 de secunde nu funcționează în acest caz + Trecerea de la un player la altul poate duce la resetarea cozii tale + Ignorați evenimentele generate de butoanele hardware de redare media + Această soluție alternativă eliberează și reinstanțiază codecurile video atunci când are loc o schimbare a suprafeței, în loc să seteze direct codecul pentru suprafața respectivă. Utilizată deja de ExoPlayer pe unele dispozitive care prezintă această problemă, această setare are efect doar pe Android 6 și versiuni ulterioare\n\nActivarea acestei opțiuni poate preveni apariția erorilor de redare la schimbarea playerului video curent sau la trecerea la modul ecran complet + Grilă + Cartelă + + %1$d secundă + %1$d secunde + %1$d secunde + diff --git a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml index ccb4ba734..163643d46 100644 --- a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -47,8 +47,8 @@ 选择喜爱的夜晚主题 —— %1$s 该选项仅在选择 %1$s 作为主题时可用 你可以在下面选择喜爱的夜晚主题 - 显示 \\"按住加入队列\\" 提示 - 在视频 \\"详情:\\" 中按住背景或弹窗时显示提示 + 显示“按住加入队列”提示 + 在视频详情中按住后台或弹窗按钮时显示提示: 平板模式 列表视图模式 字幕 @@ -62,4 +62,86 @@ 网格 卡片 取消 + 默认分辨率 + 默认弹窗分辨率 + 使用手机流量时限制分辨率 + 显示更高分辨率 + 仅一些设备能播放 2K/4K 视频 + 默认视频格式 + 默认音频格式 + 首选原始音频 + 不论何种语言都选择原始音轨 + 首选描述性视频 + 如可用,为视频障碍人士选择带描述信息的音轨 + 最佳分辨率 + 无限制 + 播放器 + 使用外部视频播放器 + 删除某些分辨率的音频 + 使用外部音频播放器 + 显示用 Kodi 播放选项 + 显示通过 Kodi 媒体中心播放视频的选项 + 进度条缩略图预览 + 高画质(更大) + 低画质(更小) + 不显示 + 行为 + 首选的“打开”动作 + 打开内容时的默认动作 — %1$s + 显示信息 + 视频播放器 + 后台播放器 + 弹窗播放器 + 下载 + 添加到播放列表 + 加入队列 + 始终询问 + 应用切换时最小化 + 从主视频播放器切换到其他应用时的动作 — %1$s + 无 + 最小化到后台播放器 + 最小化到弹窗播放器 + 全屏启动主播放器 + 如果锁定了自动旋转,不要在迷你播放器中启动视频,而是直接转向全屏模式。你仍可通过退出全屏访问迷你播放器 + 自动播放 + 自动开始播放 — %1$s + 始终 + 仅 Wi-Fi 连接 + 从不 + 自动将下一个音视频流加入队列 + 在(非重复)播放队列结束后通过附加相关音视频流来延续队列 + 继续播放 + 中断后继续播放(如通话) + 左半边手势操作 + 选择播放器屏幕左半边手势 + 右半边手势操作 + 选择播放器屏幕右半边手势 + 亮度 + 音量 + 无 + 记住弹窗属性 + 记住弹窗的最后尺寸和位置 + 使用快速非精确查找 + 非精确查找允许播放器降低精度更快地跳转到位置。不适用 5 秒、15 秒或 25 秒跳转 + 快进/快退跳转时长 + 由于 ExoPlayer 限制,跳转时长被设为 %1$d 秒 + 清空队列前请求确认 + 从一个播放器切换到另一个播放器可能替换你的队列 + 忽略硬件媒体按钮事件 + 在用物理按键坏掉的耳机等情况下有用 + + %1$d 秒 + + ExoPlayer 设置 + 管理一些 ExoPlayer 设置。这些更爱需要重启播放器才能生效 + 播放加载间隔时长 + 更改渐进式内容的加载间隔时长(当前 %1$s)。较低的值可能加速初始加载 + ExoPlayer 默认 + 使用 ExoPlayer 的解码器回退特性 + 如果有解码器初始化问题请启用该选项,启用后如果主解码器初始化失败会让播放器退回到较低优先级的解码器。这可能导致播放性能比使用主解码器时要差 + 禁用媒体隧道 + 如果遇到黑屏或视频播放卡顿,请禁用视频隧道。 + 媒体隧道在你的设备上默认禁用,因为已知你的设备型号不支持它。 + 始终使用 ExoPlayer 的视频输出操作台设置变通解决方法 + 这个变通解决办法在发生操作台变化时释放并重新初始化视频编解码器,而不是直接将操作台设为编解码器。ExoPlayer 已经在一些有这个问题的设备上使用该方法,该设置仅在 Android 6 及更高版本上有效。\n\n启用该选项可在切换当前视频播放器或切换至全屏时防止播放错误 From ab57bd483bcabb48c67ffe8519a80440e1367a14 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 14 Oct 2026 09:52:09 +0200 Subject: [PATCH 093/155] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegi?= =?UTF-8?q?an=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 78.1% (111 of 142 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.2% (141 of 142 strings) Translated using Weblate (Portuguese) Currently translated at 26.7% (38 of 142 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Co-authored-by: Fjuro Co-authored-by: Hosted Weblate Co-authored-by: J. Lavoie Co-authored-by: Marcel Alin Co-authored-by: martian94 Co-authored-by: ssantos Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nb/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt_PT/ Translation: NewPipe/compose --- app/src/main/res/values-cs/strings.xml | 92 ++++++------ app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 36 ++--- app/src/main/res/values-fi/strings.xml | 31 ++-- app/src/main/res/values-fr/strings.xml | 56 +++---- app/src/main/res/values-it/strings.xml | 14 +- app/src/main/res/values-nb-rNO/strings.xml | 112 +++++++------- app/src/main/res/values-pt-rPT/strings.xml | 128 ++++++++-------- app/src/main/res/values-pt/strings.xml | 138 +++++++++--------- app/src/main/res/values-ro/strings.xml | 10 +- .../values-nb-rNO/strings.xml | 114 ++++++++++++++- .../values-pt-rPT/strings.xml | 108 ++++++++++++++ .../composeResources/values-pt/strings.xml | 1 + 13 files changed, 528 insertions(+), 314 deletions(-) diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 3058f2ec2..861f908e7 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -11,8 +11,8 @@ Nastavení Mysleli jste „%1$s“\? Sdílet s - Použít externí přehrávač videí - Použít externí audio přehrávač + Použít externí videopřehrávač + Použít externí audiopřehrávač Sem bude ukládáno stažené audio Zvolte adresář pro stažené audio soubory Adresář pro stažené audio @@ -86,12 +86,12 @@ Otevřít ve vyskakovacím okně Toto oprávnění je vyžadováno \npro otevření ve vyskakovacím okně - Odstraňuje zvuk v některých rozlišeních - Zobrazovat vyšší rozlišení - Pouze některá zařízení dokáží přehrát 2K/4K videa + U některých rozlišení odstraní zvuk + Zobrazit vyšší rozlišení + Pouze některá zařízení dokáží přehrávat 2K/4K videa Výchozí formát videa - Pamatovat si vlastnosti vyskakovacího okna - Pamatovat si poslední velikost a pozici vyskakovacího okna + Zapamatovat si vlastnosti vyskakovacího okna + Zapamatovat si poslední velikost a pozici vyskakovacího okna Odebírat Odebíráno Odběr zrušen @@ -108,8 +108,8 @@ Hledané výrazy lokálně uchovávat Historie sledování Evidovat zhlédnutá videa - Obnovit přehrávání - Pokračovat v přehrávání po přerušení (např. hovor) + Pokračovat v přehrávání + Pokračovat v přehrávání po přerušení (např. telefonní hovory) Přehrávač Chování Historie a mezipaměť @@ -209,9 +209,9 @@ Žádný platný soubor ZIP Upozornění: Nelze importovat všechny soubory. Tímto se anuluje vaše aktuální nastavení. - Přehrávač videa + Videopřehrávač Přehrávač na pozadí - Přehrávač v okně + Vyskakovací přehrávač Získávám informace… Načítání požadovaného obsahu Stáhnout soubor streamu @@ -245,14 +245,14 @@ Monitoring úniku paměti může způsobit nereagování aplikace při heap dumpingu Nahlásit mimo-cyklické chyby Vynutit hlášení nedoručitelných výjimek Rx mimo životnost fragmentu nebo aktivity po odstranění - Použít rychlé nepřesné hledání - Nepřesné hledání umožní přehrávači posouvat se rychleji, ale se sníženou přesností. Posouvání po 5, 15 nebo 25 vteřinách s tímto nefunguje + Použít rychlé nepřesné posouvání + Nepřesné posouvání umožňuje přehrávači přesouvat se na pozice rychleji se sníženou přesností. Posun o 5, 15 nebo 25 sekund není s touto možností podporován Mezipaměť obrázků vymazána Vymazat metadata v mezipaměti Odstranit všechna data webových stránek v mezipaměti Mezipaměť metadat vymazána - Další stream automaticky vložit do fronty - Pokračovat konečnou (neopakující se) frontu playbacku připojením souvisejícího streamu + Automaticky přidat další stream do fronty + Pokračovat v končící (neopakující se) frontě přehrávání přidáním doporučeného streamu Soubor Neexistující složka Neexistující zdroj souboru/obsahu @@ -292,7 +292,7 @@ Výška tónu Odpojit (může způsobit zkreslení) Ke stažení nejsou dostupné žádné streamy - Preferovaná akce „otevření“ + Preferovaná akce „otevřít“ Výchozí chování při otevírání obsahu — %s Titulky Upravit velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace @@ -323,12 +323,12 @@ Přijmout Odmítnout Bez omezení - Omezit rozlišení při použití mobilních dat - Minimalizovat při přepínání aplikací + Omezit rozlišení při používání mobilních dat + Minimalizovat při přepnutí aplikace Akce při přepínání aplikací z hlavního přehrávače videa — %s Žádná - Minimalizovat přehrávač na pozadí - Minimalizovat přehrávač do vyskakovacího okna + Minimalizovat na přehrávač na pozadí + Minimalizovat na vyskakovací přehrávač Přestat odebírat Zvolit panel Aktualizace @@ -425,7 +425,7 @@ %s posluchačů Výchozí kiosek - Délka přetočení vpřed/zpět + Trvání rychlého přetočení vpřed/vzad Instance PeerTube Vybrat oblíbené instance PeerTube Vyhledat instance, které se vám líbí, na %s @@ -542,8 +542,8 @@ Nelze rozpoznat zadanou adresu URL. Otevřít pomocí jiné aplikace\? Automatické přehravání Fronta aktivního přehrávače bude smazána - Při přechodu z jednoho přehrávače do druhého může dojít k smazání fronty - Žádat potvrzení před vyklizením fronty + Přepnutí z jednoho přehrávače na jiný může nahradit vaši frontu + Zeptat se na potvrzení před vymazáním fronty Nic Bufferovat Promíchat @@ -559,7 +559,7 @@ Oříznout poměr stran miniatury na 1:1 Zobrazit úniky paměti Zařazeno do fronty - Zařadit do fronty + Přidat do fronty Vymazat cookies, které NewPipe uloží, po vyřešení reCAPTCHA Cookies reCAPTCHA byly vymazány Vymazat cookies reCAPTCHA @@ -600,8 +600,8 @@ Toto video je věkově omezeno. \nKvůli novým pravidlům YouTube ohledně věkově omezených videí nemůže NewPipe získat přístup na streamy videa, a tak je nemůže přehrát. Noční motiv - Vypněte media-tunelling, pokud během přehrávání zaznamenáte temnou obrazovku nebo zadrhávání. - Vypnout media-tunelling + Zakažte tunelování médií, pokud máte potíže s černou obrazovkou nebo sekáním při přehrávání videa. + Zakázat tunelování médií Přejít na website Interní Soukromé @@ -634,7 +634,7 @@ Nezobrazovat Nízká kvalita (menší) Vysoká kvalita (větší) - Náhled miniatur na vyhledávací liště + Náhledy na liště videa Komentáře jsou vypnuty Srdíčko od tvůrce Označit jako zhlédnuté @@ -650,7 +650,7 @@ Vzdálené návrhy vyhledávání Lokální návrhy vyhledávání - Pokud je vypnuté automatické otáčení, nespouštět video v mini přehrávači, ale přepnout se přímo do režimu celé obrazovky. Do mini přehrávače se lze i nadále dostat ukončením režimu celé obrazovky + Nespouštět videa v mini přehrávači, ale rovnou přepnout na celoobrazovkový režim, pokud je automatické otáčení vypnuté. Minipřehrávač můžete stále otevřít opuštěním celé obrazovky Další ve frontě Přidat do fronty (další) Tažením položky odstraníte @@ -675,7 +675,7 @@ Připnutý komentář Shodit přehrávač LeakCanary není dostupné - Výchozí ExoPlayer + Výchozí nastavení služby ExoPlayer Nastavit oznámení o právě přehrávaném streamu Oznámení o nových streamech Oznámit o nových streamech od vašich odběrů @@ -723,8 +723,8 @@ Kopírování do schránky se nezdařilo Zašedlé playlisty již obsahují tuto položku. Duplikát přidán %dkrát - Ignorovat události hardwarových tlačítek médií - Užitečné například v případě, že používáte sluchátka s rozbitými fyzickými tlačítky + Ignorovat hardwarová multimediální tlačítka + Užitečné například pokud používáte sluchátka s rozbitými fyzickými tlačítky Odstranit duplicity\? Zobrazit následující streamy Zobrazit/skrýt streamy @@ -736,21 +736,21 @@ Akce levého gesta Akce pravého gesta Hlasitost - Žádné - Vyberte gesto pro levou polovinu obrazovky přehrávače + Žádný + Vyberte si gesto pro levou polovinu obrazovky přehrávače Jas - Vyberte gesto pro pravou polovinu obrazovky přehrávače + Vyberte si gesto pro pravou polovinu obrazovky přehrávače Změna velikosti intervalu načítání progresivního obsahu (aktuálně %s). Nižší hodnota může urychlit jejich počáteční načítání - Upřednostňovat původní zvuk - Vybrat původní zvukovou stopu bez ohledu na jazyk - Upřednostňovat popisný zvuk - Vybrat zvukovou stopu s popisem pro zrakově postižené, pokud je k dispozici + Preferovat původní zvuk + Vybrat původní zvukovou stopu nezávisle na jazyce + Preferovat popisný zvuk + Vybrat zvukovou stopu s popisem pro zrakově postižené, pokud je dostupná Neznámá - Nastavení přehrávače ExoPlayer - Správa některých nastavení přehrávače ExoPlayer. Tyto změny vyžadují restartování přehrávače, aby se projevily - Použít funkci náhradního dekodéru přehrávače ExoPlayer - Tuto možnost povolte, pokud máte problémy s inicializací dekodéru. V případě selhání inicializace primárních dekodérů se přehrávač vrátí zpět k dekodérům s nižší prioritou. To může mít za následek nižší výkon přehrávání než při použití primárních dekodérů - Vždy použít nastavení povrchu výstupu videa v přehrávači ExoPlayer + Nastavení služby ExoPlayer + Správa některých nastavení služby ExoPlayer. Tyto změny vyžadují restart + Použít záložní funkci dekodéru ExoPlayer + Povolte tuto možnost, pokud máte potíže s inicializací dekodéru. Tato možnost použije dekodéry s nižší prioritou, pokud inicializace primárních dekodérů selže. Důsledkem může být horší výkon při přehrávání oproti použití primárních dekodérů + Vždy používat náhradu nastavení výstupního povrchu videa služby ExoPlayer %1$s %2$s původní dabovaná @@ -758,13 +758,11 @@ Zvuková stopa V tomto streamu by již měla být přítomna zvuková stopa Vyberte zvukovou stopu pro externí přehrávače - Toto obejití uvolní a znovu nainstaluje kodeky videa, když dojde ke změně povrchu, místo aby se povrch nastavil přímo na kodek. Toto nastavení, které již bylo použito v přehrávači ExoPlayer na některých zařízeních s tímto problémem, má vliv pouze na Android 6 a vyšší. -\n -\nPovolení této možnosti může zabránit chybám při přehrávání při přepnutí aktuálního přehrávače videa nebo při přepnutí na celou obrazovku + Tato náhrada uvolňuje a znovu instancuje video kodeky při změně povrchu, namísto přímého přiřazení kodeku k povrchu. Toto nastavení, které již ExoPlayer využívá na některých zařízeních s tímto problémem, má vliv pouze na systému Android 6 a vyšších.\n\nPovolení této možnosti může zabránit chybám při přehrávání při přepnutí aktuálního přehrávače videa nebo při přepnutí do režimu celé obrazovky Zvuk: %s Pozice hlavních karet Přesunout výběr hlavní karty dolů - Na vašem zařízení byl zakázán media tunelling, protože model vašeho zařízení jej nepodporuje. + Tunelování médií bylo na vašem zařízení ve výchozím nastavení zakázáno, protože jej váš model zařízení nepodporuje. Žádná videa Žádné živé přenosy Načítání metadat… diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 272c979e7..0c8b92951 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -107,7 +107,7 @@ Lizenzen Lizenz lesen © %1$s von %2$s unter %3$s - Über & FAQ + Über und FAQ Freies und schlankes Streaming für Android. NewPipes Lizenz Ob Ideen, Übersetzungen, Design-Änderungen, Code-Aufräumen oder richtig große Code-Änderungen — Hilfe ist immer willkommen. Je mehr geholfen wird, desto besser wird NewPipe! diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 458a67920..4b218525b 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -3,10 +3,10 @@ Δημοσιεύθηκε στις %1$s Δε βρέθηκε αναπαραγωγός ροής δεδομένων. Εγκατάσταση του VLC; Εγκατάσταση - Άκυρο - Άνοιγμα σε πρόγραμμα περιήγησης + Ακύρωση + Άνοιγμα στον περιηγητή Κοινοποίηση - Λήψη + Λήξη Αναζήτηση Ρυθμίσεις Μήπως εννοείτε \"%1$s\"; @@ -27,8 +27,8 @@ Ήχος Προεπιλεγμένη μορφή ήχου Θέμα - Σκοτεινό - Φωτεινό + Σκοτεινή + Φωτεινή Λήψη Εμφάνιση «Επόμενου» και «Σχετικών» βίντεο Δεν υποστηρίζεται η διεύθυνση URL @@ -63,7 +63,7 @@ Διαγραφή Σφάλμα Πατήστε για λεπτομέρειες - Λήψη + Κατεβάσματα Γράμματα και ψηφία Άδειες Ιστορικό @@ -205,17 +205,17 @@ Αντικαταστάτης χαρακτήρας Οι περισσότεροι ειδικοί χαρακτήρες Σχετικά με το NewPipe - Άδειες Τρίτων + Άδειες τρίτων κατασκευαστών © %1$s από %2$s υπό %3$s - Πληροφορίες & Συχνές Ερωτήσεις - Ανοιχτού κώδικα, ελαφριά εφαρμογή Android, για την αναπαραγωγή πολυμέσων από το διαδίκτυο. - Συνεισφέρετε + Πληροφορίες και συχνές ερωτήσεις + Ανοιχτού κώδικα, ελαφριά εφαρμογή Android, για την αναπαραγωγή πολυμεσων από το διαδίκτυο. + Συνεισφορά Αν έχετε ιδέες για μετάφραση, αλλαγή σχεδιασμού, εκκαθάριση ή ριζικές αλλαγές κώδικα της εφαρμογής, η βοήθεια σας είναι πάντα ευπρόσδεκτη. Όσο περισσότερη έχουμε, τόσο καλύτεροι γινόμαστε! Δείτε το στο GitHub - Δωρεά + Κάνε δωρεά Το NewPipe αναπτύσσεται από εθελοντές που δαπανούν τον ελεύθερο χρόνο τους για να σας προσφέρουν τη βέλτιστη δυνατή εμπειρία χρήστη. Ανταποδώστε το, για να βοηθήσετε τους προγραμματιστές του NewPipe να το κάνουν ακόμα καλύτερο, όσο απολαμβάνουν ένα φλιτζάνι καφέ. Προσφέρετε - Ιστότοπος + Ιστοτόπος Επισκευτείτε τον ιστότοπο του NewPipe για περισσότερες πληροφορίες και νέα. Πολιτική ιδιωτικού απόρρητου του NewPipe Το NewPipe παίρνει πολύ σοβαρά την ιδιωτικότητα σας. Έτσι, η εφαρμογή αυτή δεν συλλέγει δεδομένα από εσάς χωρίς τη συγκατάθεσή σας. @@ -346,7 +346,7 @@ Προβολή λίστας Λίστα Πλέγμα - Αυτόματα + Αυτόματο Μια νέα έκδοση του NewPipe είναι διαθέσιμη! Ολοκληρώθηκε Εκκρεμεί @@ -455,7 +455,7 @@ Αναπαραγωγή ουράς Δεν υπάρχουν σελιδοδείκτες λίστας αναπαραγωγής ακόμα Επιλέξτε μια λίστα αναπαραγωγής - Τέλος + Ολοκλήρωση Πατήστε «Τέλος» όταν επιλυθεί ∞ βίντεο 100+ βίντεο @@ -539,7 +539,7 @@ Εμφάνιση διαρροών μνήμης Κατάργηση σίγασης Προστέθηκε στην ουρά - Προσθήκη στην ουρά + Προσθήκη σε ουρά Πιο αγαπημένα Παρακαλούμε ελέγξτε αν το πρόβλημα σας έχει ήδη αναφερθεί. Οι διπλές αναφορές μας στερούν το χρόνο που θα μπορούσαμε να διαθέσουμε για την επίλυση του προβλήματος. Εκκαθάριση των cookies που αποθηκεύει η εφαρμογή όταν επιλύετε ένα reCAPTCHA @@ -591,7 +591,7 @@ Νυχτερινό θέμα Εμφάνιση λεπτομερειών καναλιού Απενεργοποιήστε το media tunneling, αν παρατηρείτε μαύρη οθόνη ή διακοπές κατά την αναπαραγωγή βίντεο. - Απενεργοποίηση media tunneling + Διατυπή σήραγγα των μέσων μαζικής ενημέρωσης Εσωτερικό Ιδιωτικό Εκτός λίστας @@ -622,7 +622,7 @@ Ενεργό Κατάσταση tablet Τα σχόλια είναι απενεργοποιημένα - Απόκρυψη + Μην εμφανίζεις Χαμηλή ποιότητα (μικρότερο) Υψηλή ποιότητα (μεγαλύτερο) Προεπισκόπηση στην μπάρα αναζήτησης @@ -725,7 +725,7 @@ Επιλέξτε χειρονομία για το δεξί μισό της οθόνης του προγράμματος αναπαραγωγής Ενέργεια δεξιάς χειρονομίας Φωτεινότητα - Ένταση + Όγκος Καμία Προτίμηση πρωτότυπου ήχου Επιλογή του πρωτότυπου κομματιού ήχου ανεξάρτητα από τη γλώσσα diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index ee470a3cc..f5736c949 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -9,7 +9,7 @@ Avaa ponnahdusikkunatilassa Jaa Lataus - Haku + Hae Asetukset Tarkoititko ”%1$s”\? Jaa @@ -43,7 +43,7 @@ Oletusääniformaatti Oletusvideoformaatti Teema - Kirkas + Vaalea Tumma Musta Muista ponnahdusikkunan ominaisuudet @@ -63,7 +63,7 @@ Käyttäytyminen Video ja ääni Historia ja välimuisti - Ulkoasu + Ulkonäkö Toistaa taustalla Toistetaan ponnahdusikkunatilassa Sisältö @@ -134,19 +134,19 @@ \nponnahdusikkunatilan käyttämiseksi reCAPTCHA Haaste reCAPTCHA-haaste pyydetty - Lataus + Lataukset Sallitut merkit tiedostonimissä Kielletyt merkit korvataan tällä arvolla Korvaava merkki Kirjaimet ja numerot Suurin osa erikoismerkeistä - Tietoja NewPipe - Kolmannen osapuolen Lisenssit - Tietoja & UKK + Tietoja NewPipestä + Kolmannen osapuolen lisenssit + Tietoja ja UKK Lisenssit Vapaata ja kevyttä suoratoistoa Androidilla. Näytä GitHub:ssa - NewPipe:n Lisenssi + NewPipen lisenssi Olkoon sinulla ideoita; käännöksistä, designmuutoksista, koodin siivoamisesta tai raskaista koodimuutoksista—apu on aina tervetullutta. Mitä enemmän saadaan tehtyä, sen paremmaksi sovellus tulee! Lue lisenssi Osallistu @@ -183,8 +183,8 @@ Lahjoita NewPipe on vapaaehtoisten vapaa-ajallaan kehittämä tuoden sinulle parhaan mahdollisen käyttäjäkokemuksen. Nyt on aika auttaa kehittäjiä tekemään NewPipesta vielä parempi heidän nauttiessaan kupin kahvia. Anna takaisin - Websivu - Käy verkkosivuillamme saadaksesi lisää tietoa ja uusimmat uutiset NewPipe:stä. + Verkkosivusto + Käy verkkosivuillamme saadaksesi lisää tietoa ja uusimmat uutiset NewPipestä. Suoratoistosoitinta ei löytynyt (voit asentaa VLC:n toistaaksesi). Lataa suoratoistotiedosto Näytä lisätietoja @@ -198,7 +198,7 @@ Metatiedot poistettu Jatka päättyvää (ei uudelleentoistettavaa) toistojonoa lisäämällä siihen aiheeseen liittyvä suoratoistosisältö Sisällön oletusmaa - Virheenkorjaus + Vianjäljitys Kanavat Soittolistat Ääniraidat @@ -235,12 +235,11 @@ Nimeä uudelleen 1 poistettu. NewPipen tietosuojakäytäntö - NewPipe ottaa yksityisyytesi tosissaan. Siksi se ei kerää sinulta mitään tietoja ilman lupaasi. -\nNewPipen tietosuojakäytännössä selitetään tarkasti mitä tietoja lähetetään tai tallennetaan virheraportin yhteydessä. + NewPipe ottaa yksityisyytesi tosissaan. Siksi se ei kerää sinulta mitään tietoja ilman lupaasi.\nNewPipen tietosuojakäytännössä selitetään tarkasti mitä tietoja lähetetään tai tallennetaan virheraportin yhteydessä. Lue tietosuojakäytäntö Lisää ehdotettu suoratoistosisältö automaattisesti soittolistaan Suoratoistosisältöä ei saatavilla ladattavaksi - NewPipe on vapaata ohjelmistoa. Voit käyttää, opiskella, jakaa ja parantaa sitä mielesi mukaan. Tarkemmin sanottuna voit jakaa sitä edelleen ja/tai muokata sitä Free Software Foundationin julkaiseman GNU General Public Licensen, version 3 tai uudemman, ehdoilla. + NewPipe on vapaata ohjelmistoa. Voit käyttää, opiskella, jakaa ja parantaa sitä mielesi mukaan. Tarkemmin sanottuna voit jakaa sitä edelleen tai muokata sitä Free Software Foundationin julkaiseman GNU General Public Licensen, version 3 tai uudemman, ehdoilla. Viimeksi toistettu Eniten toistetut Vienti valmis @@ -574,7 +573,7 @@ Lataus on alkanut Voit valita suosikkiyöteemasi alta Valitse suosikki yöteemasi — %s - Automaattinen (laitteen teema) + Automaattinen (laite) Radio Esitellyt Tämä sisältö on saatavilla vain maksaneille käyttäjillä, joten NewPipe ei voi suoratoistaa tai ladata sitä. @@ -726,7 +725,7 @@ Vaadittu verkkoyhteys Suorita uusien streamien tarkistaminen Hae kanavavälilehdet - Usein Kysytyt Kysymykset + Usein kysytyt kysymykset Käytät uusinta NewPipen versiota Avatarit Ota tämä vaihtoehto käyttöön, jos sinulla on dekooderin alustusongelmia, jotka liittyvät alemman prioriteetin dekooderiin, jos ensisijaisen dekooderin alustus epäonnistuu. Tämä voi heikentää toiston suorituskykyä kuin käytettäessä ensisijaisia dekoodeja diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b631684de..6d49fa2f7 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -1,7 +1,7 @@ Annuler - Définition par défaut + Résolution par défaut Vouliez-vous dire « %1$s » \? Télécharger Dossier de téléchargement vidéo @@ -91,24 +91,24 @@ \nutiliser le mode flottant Arrière-plan Flottant - Définition par défaut de la fenêtre flottante - Afficher des définitions plus élevées - Seuls certains appareils peuvent lire des vidéos 2K/4K + Résolution par défaut du pop-up + Afficher les résolutions plus élevées + Seuls certains appareils peuvent lire les vidéos 2K/4K Format vidéo par défaut Mémoriser les propriétés de la fenêtre flottante Mémoriser les dernières taille et position de la fenêtre flottante Effacer - Le son peut être absent à certaines définitions + Retire le son à certaines résolutions Suggestions de recherche Sélectionner les suggestions à afficher lors d’une recherche - Meilleure définition + Meilleure résolution S’abonner Abonné Désabonné de la chaîne Abonnements Téléchargement Licences de tiers - À propos & FAQ + À propos et FAQ Licences Streaming libre et léger sur Android. Consulter sur GitHub @@ -202,7 +202,7 @@ Aucun flux audio trouvé Lecteur vidéo Lecteur en arrière-plan - Lecteur flottant + Lecteur contextuel Obtention des infos… Chargement du contenu demandé Importer la base de données @@ -214,7 +214,7 @@ Fichier ZIP non valide Avertissement : impossible d’importer tous les fichiers. Cela effacera vos paramètres actuels. - Afficher les informations + Afficher les infos Playlists enregistrées Ajouter à Glisser pour réordonner @@ -251,7 +251,7 @@ Le nom du fichier ne peut pas être vide Une erreur est survenue : %1$s Télécharger le flux - Ajout automatique du flux suivant à la file de lecture + Ajouter le stream suivant automatiquement Continue la file de lecture (non répétitive) en ajoutant un flux lié Corriger Remplir @@ -290,7 +290,7 @@ Contrôles de vitesse de lecture Cadence Détacher (peut causer des déformations) - Ouvrir de préférence avec + Action « ouvrir » préférée Action par défaut lors de l’ouverture de contenu — %s Aucun flux disponible au téléchargement Légendes @@ -315,8 +315,8 @@ \nLa politique de confidentialité de NewPipe explique en détail quelles données sont envoyées et stockées lorsque vous envoyez un rapport de plantage. Afin de se conformer au Règlement Général sur la Protection des Données (RGPD), nous attirons ici votre attention sur la politique de confidentialité de NewPipe. Veuillez la lire attentivement. \nVous devez l’accepter pour nous envoyer le rapport de bogue. - Aucune limite - Limiter la définition lors de l’utilisation des données mobiles + Sans limite + Résolution limite en utilisant les données mobiles Chaînes Playlists Morceaux @@ -324,11 +324,11 @@ Accélérer pendant les silences Graduation Réinitialiser - Minimiser lors du changement d’application + Réduire la fenêtre lors du changement d\'application Action lors du basculement à une autre application depuis le lecteur vidéo principal — %s Aucune - Minimiser vers le lecteur en arrière-plan - Réduire vers le lecteur flottant + Réduire le lecteur en arrière-plan + Réduire en fenêtre contextuelle Se désabonner Sélectionner un onglet Mises à jour @@ -562,7 +562,7 @@ Recadrer la miniature au format 1:1 Afficher les fuites de mémoire Ajouté à la file - Ajouter à la file + Ajouter à la file d\'attente Effacer les cookies que NewPipe garde lorsque vous résolvez un reCAPTCHA Les cookies reCAPTCHA ont été effacés Effacer les cookies reCAPTCHA @@ -625,8 +625,8 @@ Impossible de charger le flux \'%s\'. Erreur lors du chargement du flux Il vous sera demandé où enregistrer chaque téléchargement - Off - On + Désactivé + Activé Mode tablette Le compte de l’auteur a été résilié. \nNewPipe ne sera plus en mesure de charger ce flux à l’avenir. @@ -635,7 +635,7 @@ Le mode flux rapide ne fournit pas plus d’info à ce sujet. Les commentaires sont désactivés Ne pas afficher - Faible qualité (plus petit) + Basse qualité (plus petit) Haute qualité (plus grand) Prévisualisation de la barre de progression sur la miniature Marquer comme visionné @@ -653,7 +653,7 @@ %s téléchargements terminés Balayez un élément pour le supprimer - Ne pas lancer les vidéos dans le mini lecteur mais directement en plein écran si la rotation automatique est verrouillée. Vous pouvez toujours accéder au mini-lecteur en quittant le mode plein écran + Ne lancez pas les vidéos dans le mini-lecteur, mais passez directement en mode plein écran si la rotation automatique est verrouillée. Vous pouvez toujours accéder au mini-lecteur en quittant le mode plein écran Lancer le lecteur principal en plein écran Placer en suivant dans la file Placé en suivant dans la file @@ -736,21 +736,21 @@ Afficher/Cacher les flux Enlever la miniature permanente Choisir le geste pour la moitié gauche de l’écran du lecteur - Action du geste vers la gauche + Action geste à gauche Choisir le geste pour la moitié droite de l’écran du lecteur Volume - Aucune + Aucun Action du geste vers la droite - Luminosité + Clarté Modifie la taille de l\'intervalle de chargement (actuellement %s). Une valeur plus faible peut accélérer le chargement initial des vidéos - Préférence pour l\'audio original - Sélectionner la piste audio originale quelle que soit la langue + Préférer l\'audio original + Sélectionner la piste audio originale peu importe la langue Préférer l\'audio descriptif Audio : %s Piste audio Une piste audio doit déjà être présente dans ce flux Inconnue - Paramètres d’ExoPlayer + Paramètres ExoPlayer Gérez certains paramètres d\'ExoPlayer. Ces modifications nécessitent un redémarrage du lecteur pour être prises en compte Utiliser la fonctionnalité de repli du décodeur d\'ExoPlayer Toujours utiliser la solution de contournement de définition de surface de sortie vidéo d\'ExoPlayer @@ -761,7 +761,7 @@ Cette solution de contournement libère et ré-instancie les codecs vidéo lorsqu\'un changement de surface se produit, au lieu de définir la surface du codec directement. Déjà utilisé par ExoPlayer sur certains appareils présentant ce problème, ce paramètre n\'a d\'effet que sur Android 6 et les versions ultérieures. \n \nL\'activation de cette option peut éviter les erreurs de lecture lors du changement de lecteur vidéo ou du passage en mode plein écran - Sélectionner une piste audio avec des descriptions pour les personnes malvoyantes si disponible + Sélectionner une piste audio comportant des descriptions destinées aux personnes malvoyantes, si disponible Sélectionner la piste audio pour les lecteurs externes Activez cette option si vous rencontrez des problèmes d\'initialisation des décodeurs, ce qui permet de revenir à des décodeurs moins prioritaires si l\'initialisation des décodeurs primaires échoue. Les performances de lecture peuvent être moins bonnes que lors de l\'utilisation des décodeurs primaires Déplacer le sélecteur d\'onglets principal vers le bas diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 338ce0d04..872c466ca 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -133,7 +133,7 @@ La maggior parte dei caratteri speciali Cronologia Cronologia - Lettore multimediale + Lettore Comportamento Cronologia e cache Rifai @@ -201,7 +201,7 @@ Nessun flusso video trovato Nessun flusso audio trovato Lettore video - Riproduzione in sottofondo + Riproduttore in sottofondo Lettore popup Raccolta informazioni in corso… Caricamento del contenuto richiesto @@ -215,7 +215,7 @@ Attenzione: Impossibile importare tutti i file. Questa operazione sostituirà le tue impostazioni attuali. Scarica il video - Mostra informazioni + Mostra info Playlist salvate Aggiungi a Trascina per riordinare @@ -224,7 +224,7 @@ Rinomina Ultima riproduzione I più riprodotti - Chiedi ogni volta + Chiedi sempre Nuova playlist Rinomina Nome @@ -322,7 +322,7 @@ Reset Comportamento al cambio di app Azione da eseguire cambiando app dal lettore video principale — %s - Nessuna + Nessuno Riproduci in sottofondo Passa in modalità popup Canali @@ -628,8 +628,8 @@ A partire da Android 10 è supportato solo il Framework di accesso all\'archiviazione È necessario specificare la destinazione di ogni dowload Non è impostata alcuna cartella per i file scaricati, scegliere quella predefinita - Off - On + Disattivo + Attivo Modalità tablet Non mostrare Qualità bassa (più piccola) diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 7d25bf847..e6fb51348 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -19,16 +19,16 @@ Nedlastingsmappe for lyd Nedlastede lydfiler lagres her Velg nedlastingsmappe for lydfiler - Forvalgt oppløsning + Standard oppløsning Spill av med Kodi Installer manglende Kode-app\? Vis \"Spill av med Kodi\"-valg - Vis valg for avspilling via Kodi mediasenter + Vis valg om å spille av video via Kodi mediasenter Lyd - Forvalgt lydformat + Standard lydformat Tema - Mørk - Lys + Mørkt + Lyst Last ned Vis «Neste» og «Lignende» -videoer Nettadressen støttes ikke @@ -81,10 +81,10 @@ Definer en nedlastingsmappe senere i innstillingene reCAPTCHA-oppgave Åpne i oppsprettsmodus - Forvalgt oppsprettsoppløsning + Standard sprettopp-oppløsning Vis høyere oppløsninger - Det er bare noen enheter som kan spille 2K-/4K-videoer - Forvalgt videoformat + Bare noen enheter er i stand til å spille av 2K/4K-videoer + Standard videoformat Svart Spiller av i oppsprettsmodus Alle @@ -92,7 +92,7 @@ Denne tilgangen trengs for \nåpning i oppsprettsmodus reCAPTCHA-oppgave forespurt - Fjerner lyd ved noen oppløsninger + Fjerner lyd på noen oppløsninger Abonner Abonnert Kanalabonnent oppsagt @@ -102,8 +102,8 @@ Hva er nytt Bakgrunn Oppsprett - Husk oppsprettsegenskaper - Husk siste størrelse og posisjon for oppsprettsvinduet + Husk sprettopp-egenskaper + Husk siste størrelse og posisjon på sprettopp Søkeforslag Vis søkeforslag ved søk Søkehistorikk @@ -123,14 +123,14 @@ Om NewPipe Tredjepartslisenser © %1$s av %2$s lisensiert %3$s - Om og Ofte stilte spørsmål + Om og ofte stilte spørsmål Lisenser - Fri lett strømming på Android. - Fortsett avspilling - Fortsett å spille etter avbrytelser (f.eks. telefonsamtaler) + Fri lettvektsstrømming på Android. + Gjenoppta avspilling + Fortsett avspilling etter avbrytelser (for eksempel telefonanrop) Avspiller Oppførsel - Historikk og mellomlagring + Logg og mellomlager Angre Ingen resultater Bare ufisk her @@ -149,10 +149,10 @@ Én video %s videoer - Vis på GitHub - NewPipe sin lisens - Hvorvidt du har idéer vedrørende oversettelser, designendringer, koderenskning, eller tunge kodeendringer—hjelp er alltids kjærkommen. Desto mer som gjøres, desto bedre blir det! - Les lisensen + Se på GitHub + NewPipes lisens + Uansett om du har idéer om: oversettelse, designendringer, kodeforbedring, eller virkelig tunge kodeendringer så er hjelp alltid velkommen. Jo mer som blir gjort, jo bedre blir det! + Les lisens Bidra Historikk Historikk @@ -180,9 +180,9 @@ På vei opp Start avspilling i bakgrunnen Start avspilling i et oppsprett - Doner - NewPipe utvikles av frivillige som bruker sin fritid til å gi deg den beste brukeropplevelsen. Gi tilbake for å hjelpe utviklere å gjøre NewPipe enda bedre, mens de nyter en varm kopp kaffe. - Bidra + Donér + NewPipe utvikles av bidragsytere som bruker fritiden sin på å gi deg den beste brukeropplevelsen. Gi tilbake til miljøet for å hjelpe utviklerne med å gjøre NewPipe enda bedre mens de nyter en kopp kaffe. + Gi tilbake Nettside Besøk NewPipe-nettsiden for mer info og nyheter. Forvalgt innholdsland @@ -199,7 +199,7 @@ Fant ingen lydstrømmer Videoavspiller Bakgrunnsavspiller - Oppsprettsavspiller + Sprettopp-avspiller Henter informasjon… Laster forespurt innhold Importer database @@ -221,11 +221,11 @@ Gi nytt navn Sist spilt Mest spilt - Alltid spør + Spør alltid Ny spilleliste Gi nytt navn Navn - Legg til i spilleliste + Legg til spilleliste Sett som miniatyrbilde for spilleliste Bokmerk spilleliste Fjern bokmerke @@ -237,7 +237,7 @@ Tilpass Fyll Forstørr - Bruk rask unøyaktig spoling + Bruk raskt unøyaktig søk Feilsøking Fil Ingen slik mappe @@ -257,9 +257,9 @@ Tøm hurtiglagret metadata Fjern all hurtiglagret nettsidedata Metadatahurtiglager tømt - Sett neste strøm i kø automatisk + Legg neste strøm i kø automatisk Ingen strømmer tilgjengelige for nedlasting - Foretrukket åpningshandling + Foretrekt \"åpne\"-handling Forvalgt handling ved åpning av innhold — %s din-ID, soundcloud.com/dinid Husk at denne handlingen kan belaste nettverket tungt. @@ -277,8 +277,8 @@ Slett hele søkehistorikken\? Søkehistorikken er slettet Ett element slettet. - Undertekster - Endre spillerens undertekststørrelse og bakgrunnsstiler. Krever omstart av appen for å tre i kraft + Undertekst + Modifiser avspillingsundertekststørrelse og bakgrunnsstiler. Krever restart av app for å tre i kraft NewPipe er copyleft fri programvare: Du kan bruke, studere og forbedre den etter egen vilje. Spesifikt kan du redistribuere og/eller modifisere den i henhold til vilkårene gitt i GNU General Public-lisensen, som er publisert av Free Software Foundation, enten versjon 3 av lisensen, eller (etter eget ønske) enhver senere versjon. Ønsker du også å importere innstillinger? Kunne ikke importere abonnementer @@ -304,21 +304,20 @@ Rapporter feil utenfor livssyklusen Tving rapportering av uleverbare Rx-unntak utenom fragment eller aktivitetslevetid etter forkastelse Avhekt (kan forårsake forvrenging) - NewPipes personvernspraksis - NewPipe-prosjektet tar ditt personvern veldig alvorlig. Derfor samler ikke appen inn data uten ditt samtykke. -\nNewPipes personvernspraksis forklarer i detalj hvilken data som sendes og lagres når du sender en krasjrapport. - Les personvernspraksis + NewPipes personvernerklæring + NewPipe-prosjektet tar personvernet ditt veldig seriøst. Derfor samler ikke appen inn noe data uten ditt samtykke.\nNewPipes personvernerklæring forklarer i detalj hvilke data som sendes og lagres når du sender en kræsjrapport. + Les personvernerklæring For å overholde EUs personvernforordning (GDPR), vil vi rette oppmerksomheten din mot NewPipe sin personvernerklæring. Vennligst les den nøye. \nDu må godta den, for å sende oss feilrapporten. Godta Avslå - Ubegrenset + Ingen begrensning Begrens oppløsning når mobildata brukes - Minimer ved appbytte + Minimer på appbytte Handling ved bytting til annen app fra hovedspiller — %s Ingen - Minimer til bakgrunnsspiller - Minimer til oppsprettsspiller + Minimer til bakgrunnsavspiller + Minimer til sprettopp-avspiller Kanaler Spillelister Spor @@ -346,7 +345,7 @@ Listevisningsmodus Liste Rutenett - Automatisk + Auto Ny NewPipe-versjon er tilgjengelig! Fullført pauset @@ -376,7 +375,7 @@ Nyttig ved veksling til mobildata, selv om noen nedlastinger ikke kan settes på pause Vis kommentarer Skru av for å skjule kommentarer - Spill av automatisk + Autoavspill Ingen kommentarer Kunne ikke laste inn kommentarer Lukk @@ -437,7 +436,7 @@ Autogenerert (fant ingen opplaster) gjenoppretter Kan ikke gjenopprette denne nedlastingen - Hurtigframoverspoling/-tilbakespolingsvarighet + Rask frem- og tilbakespolingssøkevarighet Gi tillatelse til å vise over andre apper Programspråk Systemforvalg @@ -549,7 +548,7 @@ Ingenting Vis minnelekkasjer Satt i kø - Sett i kø + Legg i kø Tøm reCAPTCHA-kaker reCAPTCHA-kaker har blitt slettet Tøm kaker som NewPipe lagrer når du løser en reCAPTCHA @@ -582,13 +581,13 @@ Dette er et spor fra SoundCloud Go+, ihvertfall i ditt land, så det kan ikke strømmes eller lastes ned av NewPipe. Innholdet er ikke tilgjengelig i din region. Nedlastingen har startet - Du kan velge ditt favorittnattema nedenfor + Du kan velge ditt favoritt-nattema nedenfor Velg ditt favorittnattema — %s Automatisk (enhetstema) Radio Framhevet Løs - Nattdrakt + Nattmodus Vis kanaldetaljer Skru av media-tunnelering hvis du opplever svart skjerm eller videohakking Skru av media-tunnelering @@ -608,7 +607,7 @@ Ingen nedlastingsmappe er satt ennå, velg en standard nedlastingsmappe nå Av På - Nettbrett-modus + Nettbrettmodus Åpne nettside Intern Privat @@ -640,7 +639,7 @@ Ikke start videoer i minispilleren, men bytt til fullskjermsmodus direkte dersom auto-rotering er låst. Du har fremdeles tilgang til minispilleren ved å avslutte fullskjermsvisningen Hjertemerket av skaperen Dra elementer for å fjerne dem - Start hovedspiller i fullskjerm + Start hovedavspiller i fullskjermmodus Still i kø neste I kø neste Se etter oppdateringer @@ -667,7 +666,7 @@ Intervallstørrelse for avspillingsinnlasting Endre størrelsen på lasteintervallet på progressivt innhold (for øyeblikket %s). En lavere verdi kan øke hastigheten på den første videoinnlastingen. Endringer krever omstart av spilleren Spillervarsel - Varsler + Varslinger Nye strømmer Varsler om nye strømmer for abonnementer @@ -689,7 +688,7 @@ Ukjent format Ukjent kvalitet Ofte stilte spørsmål - Vis på nettsiden + Se på nettside Start sjekk etter nye strømmer Varsel om nye strømmer Hyppighet for sjekk @@ -700,7 +699,7 @@ Ingen lydstrømmer er tilgjengelige for eksterne spillere Sorter Velg alle - Hvis du har problemer med å bruke appen, så bør du sjekke ut disse svarene fra generelle spørsmål! + Hvis du har problemer med å bruke appen, sørg for å sjekke ut disse svarene på vanlige spørsmål! Skru av vedvarende miniatyrbilde Dette valget er kun tilgjengelig dersom %s er valgt som tema Klarte ikke å kopiere til utklippstavlen @@ -722,7 +721,7 @@ Kommende Venstre håndvendingshandling Høyre håndvendingshandling - Lydstyrke + Volum Fjern duplikater\? Vis/skjul strømmer Delvis sett @@ -740,18 +739,18 @@ Neste strøm Underkanalavatarer Åpne avspillingskø - Velg opprinnelig lydspor uavhengig av språk + Velg det originale lydsporet uavhengig av språket Ikke last inn bilder Høy kvalitet Om Del spilleliste Album Gjenta - Velg et lydspor med beskrivelser for synshemmede hvis tilgjengelig + Velg et lydspor med beskrivelser for mennesker med nedsatt synsevne om tilgjengelig Middels kvalitet - Foretrekk beskrivende lyd + Foretrekk deskriptiv lyd Opplasteravatarer - Foretrekk opprinnelig lyd + Foretrekk original lyd Lyd: %s Spillelister Lydspor @@ -770,7 +769,7 @@ %s svar Flytt hovedfanevelgeren til bunnen - Hovedfaneposisjon + Hovedfanerposisjon Videoer Ukjent Direkte @@ -790,4 +789,5 @@ Bruk ExoPlayers dekodings-tilbakefall Håndter noen ExoPlayer-innstillinger. Disse endringeren krever omstart av avspilleren. Hvilke faner som vises på kanalsidene + Sikkerhetskopi og gjenopprett diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index bed536d37..f0c82f40e 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -10,13 +10,13 @@ Processos Os carateres inválidos são substituídos por este valor Descarregar - Remove o áudio em algumas resoluções + Remove áudio em algumas resoluções Predefinição do sistema - Minimizar ao trocar de aplicação + Minimizar na troca da app Ativar som Iniciar reprodução num popup suaID, soundcloud.com/suaID - Resolução padrão para janela popup + Resolução padrão do pop-up Aviso: não foi possível importar todos os ficheiros. Já existe uma descarga em curso com este nome Ver no GitHub @@ -49,7 +49,7 @@ Deseja limpar o histórico de descargas ou eliminar todos os ficheiros descarregados? Histórico e cache - Continuar reprodução após interrupções (ex. chamadas) + Continuar a reproduzir após interrupções (por exemplo, ligações) Descarregar ficheiro de vídeo +100 vídeos Ajustar @@ -64,7 +64,7 @@ Este conteúdo ainda não é suportado pelo NewPipe. \n \nEsperamos que seja suportado numa versão futura. - Nenhuma + Nenhum Escolha a pasta para colocar os ficheiros de vídeo Deseja apagar este grupo\? Não foi possível encontrar o servidor @@ -90,9 +90,9 @@ Subscrever Artistas Não foi possível ligar ao servidor - Mostrar uma opção para reproduzir o vídeo no Kodi - Modo de exibição - A pesquisa inexata permite que esta seja mais rápida, mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente + Exibir uma opção para reproduzir um vídeo através do centro de média Kodi + Modo de visualização de lista + A busca não exata permite ao player buscar posições mais rapidamente com precisão reduzida. Buscar por 5, 15 ou 25 segundos não funciona com isto Permitir sobreposição a outras aplicações Exportar para Sobre o NewPipe @@ -136,7 +136,7 @@ Reprodução em segundo plano Mostrar resoluções mais altas Sem subscritores - Utilizar reprodutor de áudio externo + Usar reprodutor de áudio externo Será que queria dizer \"%1$s\"\? Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão Enfileirar @@ -177,12 +177,12 @@ \n5. Clique no botão \"Descarregar\" após aparecer \n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado \n7. [Se a importação do .zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído - Ativar reprodutor em segundo plano + Minimizar para reprodutor em segundo plano Desafio reCAPTCHA solicitado Reprodução automática Instância já existe O NewPipe é desenvolvido por voluntários que passam o seu tempo livre a trazer-lhe a melhor experiência de utilizador. Retribua para ajudar os programadores a fazer o NewPipe ainda melhor enquanto tomam uma chávena de café. - Continuar (sem repetição) a fila de reprodução anexando um vídeo relacionado + Continuar a encerrar a fila de reprodução (sem repetição) a anexar um fluxo relacionado Sempre Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. \nTem que aceitar esta política para nos poder enviar o seu relatório. @@ -201,7 +201,7 @@ Licenças de terceiros Gerar nome único Ação a executar ao trocar para outra aplicação a partir do menu principal - %s - Utilizar reprodutor de vídeo externo + Usar player de vídeo externo O quê:\nPedido:\nIdioma do conteúdo:\nPaís do conteúdo\nIdioma da aplicação\nServiço:\nHora GMT:\nPacote:\nVersão:\nSO Versão: Caso tenha ideias; tradução, alterações de design, limpeza de código ou alterações realmente pesadas de código, a ajuda é sempre bem-vinda. Quanto mais for feito, melhor será! Limpar dados @@ -237,7 +237,7 @@ Remover todo o histórico de pesquisas\? Reportar por e-mail Escolher separador - Grelha + Grade Exportado Escolha a pasta para colocar os ficheiros de áudio Atualização NewPipe disponível! @@ -261,7 +261,7 @@ Os reprodutores externos não suportam este tipo de hiperligações Mudar nome \'Storage Access Framework\' permite transferências para um cartão SD externo - Duração da pesquisa de avanço/recuo rápido + Duração da busca de avanço/retrocesso rápido Ficheiro movido ou eliminado Última reprodução Visite o site do NewPipe para mais informações e novidades. @@ -290,7 +290,7 @@ Histórico de vídeos apagado Não tem um reprodutor de vídeo. Instalar o VLC\? Desative para ocultar comentários - Limitar resolução se em dados móveis + Limitar resolução ao usar dados móveis Separadores mostrados na página principal Definições de áudio Eliminar @@ -299,7 +299,7 @@ Reprodutor Depuração Digite o URL da instância - Ação de \'Abrir\' preferida + Ação \'abrir\' preferida Vídeo e áudio Letras e dígitos A monitorização de memória pode tornar a aplicação instável @@ -351,7 +351,7 @@ %d horas %d horas - Adicionar o próximo vídeo à fila automaticamente + Enfileirar automaticamente o próximo stream Defina as suas instâncias favoritas PeerTube Exportar histórico, subscrições, listas de reprodução e definições Melhor resolução @@ -367,7 +367,7 @@ Local Aplicação terminou em erro Deseja remover este item do histórico de pesquisas\? - Continuar reprodução + Retomar reprodução NewPipe é um software copyleft libre: pode usá-lo, estudá-lo, partilhá-lo e melhorá-lo à vontade. Especificamente, pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (ao seu critério) qualquer versão posterior. ∞ vídeos A exportar… @@ -379,7 +379,7 @@ Alternar serviço atualmente selecionado: Remover Comentários (em inglês): - Reprodutor de vídeo + Player de vídeo Não foi possível estabelecer uma ligação segura Listas de reprodução Iniciar @@ -402,7 +402,7 @@ Histórico de pesquisa removido Limpar histórico de pesquisas Erro - Lembrar propriedades do popup + Lembrar das propriedades do pop-up Os ficheiros de vídeo descarregados serão guardados aqui Mudar para principal Esta permissão é necessária @@ -433,7 +433,7 @@ Site Subscrições Retribuir - Formato padrão de áudio + Formato de áudio padrão O ficheiro não existe ou não tem permissões para ler e/ou escrever O nome do grupo está vazio Partilhar com @@ -449,20 +449,20 @@ Ficheiro eliminado Ativar modo rápido Miniatura do avatar do canal - Reprodutor \'popup\' + Player pop-up Disponível em alguns serviços, é geralmente muito mais rápido, mas pode devolver uma quantidade limitada de itens e muitas vezes informações incompletas (por exemplo, sem duração, tipo de item, sem estado ativo) Posições de reprodução removidas Perguntar para onde transferir - Mostrar informação + Mostrar informações Limpar histórico de visualizações Não é possível guardar no cartão SD. Repor pasta de descargas\? Soma de controlo Restaurar última posição de reprodução - Ativar reprodutor \'popup\' + Minimizar para reprodutor pop-up Se possível, obter de uma fonte dedicada Selecionar subscrições Adicionado à lista de reprodução - Formato padrão de vídeo + Formato de vídeo padrão Mostrar dica \"Toque longo para enfileirar\" Escolha uma instância Limpar todos os dados da página web @@ -482,9 +482,9 @@ Sem resultados Desativado Tendências - Perguntar sempre + Sempre perguntar Ligação expirada - Apenas alguns dispositivos conseguem reproduzir vídeos em 2K/4K + Apenas alguns dispositivos podem reproduzir vídeos 2K/4K Aparência Doar Verifique se o seu erro já foi reportado. A criação de erros em duplicado tira-nos tempo que pode ser utilizado para corrigir os erros. @@ -495,10 +495,10 @@ Contagem de subscrições indisponível Ação padrão ao abrir o conteúdo — %s Repor - Utilizar pesquisa rápida + Usar busca rápida não exata Está prestes a substituir a configuração atual. Mudar para popup - Adicionar à lista de reprodução + Adicionar à playlist Reproduzir no modo poppup Acha que a fonte demora muito tempo a carregar\? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). \n @@ -518,9 +518,9 @@ Exportar base de dados Mostrar apenas subscrições não agrupadas Não foi possível reproduzir este vídeo - Reprodutor em segundo plano + Player em segundo plano Mostrar erro - Modificar escala de legendas e estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações + Modifique a escala do texto da legenda do player e os estilos de fundo. Requer reinicialização da app para entrar em vigor Ação recusada pelo sistema Músicas Adicionar instância @@ -535,15 +535,15 @@ Concluído Desativar modo rápido Nunca - Apenas em Wi-Fi + Somente no Wi-Fi Iniciar reprodução automaticamente — %s Reproduzir fila URL não reconhecido. Abrir com outra aplicação\? Enfileiramento automático A fila do reprodutor ativo será substituída - Mudar de um reprodutor para outro pode substituir a sua fila + Mudar de um player para outro pode substituir a sua fila Pedir confirmação antes de limpar uma fila - Lembrar último tamanho e posição do popup + Lembrar do último tamanho e posição do pop-up Nada A carregar Baralhar @@ -559,7 +559,7 @@ Cortar miniatura na proporção 1:1 Mostrar \'leaks\' de memória Colocado na fila - Colocar na fila + Enfileirar Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA Os cookies reCAPTCHA foram limpos Limpar cookies reCAPTCHA @@ -595,15 +595,15 @@ Destaques Resolver Descarga iniciada - Pode escolher o seu tema escuro favorito abaixo + Pode selecionar o seu tema noturno favorito abaixo Escolha o seu tema escuro favorito — %s - Automático (Tema do dispositivo) - Tema escuro + Automático (tema do dispositivo) + Tema noturno Mostrar detalhes do canal - Desactive o túnel multimédia se tiver um ecrã preto ou gaguejo na reprodução de vídeo. - Desativar túnel multimédia - Desligado - Ligado + Desativa o tunelamento de média se tiver um ecrã preto ou interrupções na reprodução do vídeo. + Desativar o tunelamento de média + Não + Sim Modo tablet Abrir site de web Entusiasmado pelo criador @@ -634,7 +634,7 @@ Não mostrar Baixa qualidade (menor) Alta qualidade (maior) - Pré-visualização da miniatura da barra de pesquisa + Visualização em miniatura da barra de busca Ainda não foi definida uma pasta de descarregamento, escolha agora a pasta de descarregamento padrão Comentários estão desativados Marcar como visto @@ -651,8 +651,8 @@ %s Transferências concluídas Deslizar itens para removê-los - Não iniciar vídeos no reprodutor mini, mas ir diretamente ao ecrã completo se a rotação automática estiver bloqueada. Ainda pode aceder o reprodutor mini se sair do modo de ecrã completo - Iniciar reprodutor principal em ecrã completo + Não iniciar vídeos no minireprodutor, mas mudar diretamente para o modo de ecrã inteiro, se a rotação automática estiver bloqueada. Ainda pode aceder o minireprodutor a sair do ecrã inteiro + Iniciar reprodutor principal em ecrã cheio Enfileirado o próximo Pôr na fila o próximo A processar… Pode demorar um momento @@ -675,7 +675,7 @@ \nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework Comentário fixado LeakCanary não está disponível - Predefinido do ExoPlayer + Padrão do ExoPlayer Notificações A carregar detalhes do vídeo… Verificar se há novos vídeos @@ -708,7 +708,7 @@ Formato desconhecido Qualidade desconhecida Selecione a qualidade para reprodutores externos - Tamanho do intervalo de carregamento da reprodução + Tamanho do intervalo de carregamento de reprodução Perguntas frequentes Se tem problemas a usar a app, verifique estas respostas para perguntas comuns! Ver no site @@ -723,8 +723,8 @@ Cartão As listas de reprodução acinzentadas já contêm este item. Duplicar adicionado %d vez(es) - Ignorar eventos com botões físicos - Útil por exemplo se estiver a utilizar auscultadores com botões físicos danificados + Ignorar eventos de botão de média de hardware + Útil, por exemplo, se usar auscultadores com botões físicos quebrados Remover duplicados Mostrar os seguintes vídeos Mostrar/ocultar vídeos @@ -733,8 +733,8 @@ Proximamente Remover duplicados\? Quer remover todos os vídeos duplicados nesta lista de reprodução\? - Ação do gesto para a esquerda - Ação do gesto para a direita + Ação do gesto esquerdo + Ação do gesto direito Brilho Volume Nenhum @@ -742,29 +742,27 @@ Escolha o gesto para a metade direita do ecrã do reprodutor Áudio: %s Faixa de áudio - Ative esta opção se tiver problemas de inicialização do descodificador, que retorna codificadores de baixa prioridade se o descodificador primário falhar. Isto pode resultar num desempenho inferior de reprodução - Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer - Esta solução alternativa liberta e re-instancia os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior -\n -\nA activação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro + Ative esta opção se tiver problemas de inicialização do decodificador, que retornarão para decodificadores de prioridade mais baixa se a inicialização dos decodificadores primários falhar. Isto pode resultar num desempenho de reprodução ruim do que ao usar decodificadores primários + Sempre usar solução alternativa de configuração de superfície de saída de vídeo do ExoPlayer + Esta solução alternativa libera e reinstancia codecs de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície diretamente para o codec. Já usada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior\n\nAtivar esta opção pode evitar erros de reprodução ao mudar o player de vídeo atual ou mudar para ecrã cheio original dobrado descritivo Altera o tamanho do intervalo de carregamento progressivo (o atual é %s). Um valor menor pode acelerar o carregamento inicial do vídeo - Dar preferência ao áudio original - Selecionar o áudio original independentemente do idioma - Dar preferência ao áudio descritivo - Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível + Preferir áudio original + Selecionar faixa de áudio original independentemente do idioma + Preferir áudio descritivo + Selecionar faixa de áudio com descrições para pessoas com deficiência visual, se disponível Já deve existir uma faixa de áudio nesta transmissão Selecionar faixa de áudio para reprodutores externos Desconhecida - Configurações ExoPlayer - Gere algumas configurações de ExoPlayer. É necessário reiniciar o reprodutor para aplicar as alterações - Utilizar a função de fallback do descodificador do ExoPlayer + Configurações do ExoPlayer + Gerir algumas configurações do ExoPlayer. Estas mudanças exigem a reinicialização do reprodutor para entrarem em vigor + Usar recurso de fallback do decodificador do ExoPlayer %1$s %2$s - Mova o seletor da guia principal para a parte inferior + Mover seletor da guia principal para baixo Posição das guias principais - O túnel multimédia foi desativado por predefinição no seu dispositivo porque se sabe que o modelo do dispositivo não o suporta. + O tunelamento de média foi desativado por padrão no seu dispositivo porque sabe-se que o modelo do seu dispositivo não é compatível. Nenhum vídeo em direto Nenhum vídeo Qualidade da imagem diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 40821530e..d6713d426 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -11,8 +11,8 @@ Configurações Será que queria dizer \"%1$s\"\? Partilhar com - Utilizar reprodutor de vídeo externo - Utilizar reprodutor de áudio externo + Usar player de vídeo externo + Usar reprodutor de áudio externo Pasta para os ficheiros de vídeo Os ficheiros de vídeo descarregados serão guardados aqui Escolha a pasta para guardar os ficheiros de vídeo @@ -20,9 +20,9 @@ Reproduzir no Kodi Instalar Kore\? Mostrar opção \"Reproduzir no Kodi\" - Mostrar opção para reproduzir o vídeo no Kodi + Exibir uma opção para reproduzir um vídeo através do centro de média Kodi Áudio - Formato padrão de áudio + Formato de áudio padrão Descarregar Mostrar vídeos \'Seguintes\' e \'Semelhantes\' URL não suportada @@ -87,17 +87,17 @@ Desafio reCAPTCHA Desafio reCAPTCHA solicitado Reproduzir no modo poppup - Formato padrão de vídeo + Formato de vídeo padrão Desativado - Resolução padrão para janela popup + Resolução padrão do pop-up Mostrar resoluções mais altas - Apenas alguns dispositivos conseguem reproduzir vídeos em 2K/4K + Apenas alguns dispositivos podem reproduzir vídeos 2K/4K Popup - Lembrar propriedades do popup + Lembrar das propriedades do pop-up Limpar Segundo plano - Remove o áudio em algumas resoluções - Lembrar último tamanho e posição do popup + Remove áudio em algumas resoluções + Lembrar do último tamanho e posição do pop-up Sugestões de pesquisa Escolha as sugestões a mostrar ao pesquisar Melhor resolução @@ -123,8 +123,8 @@ Guardar termos de pesquisa localmente Histórico de visualizações Manter histórico dos vídeos visualizados - Continuar reprodução - Continuar reprodução após interrupções (ex. chamadas) + Retomar reprodução + Continuar a reproduzir após interrupções (por exemplo, ligações) Reprodutor Comportamento Histórico e cache @@ -178,7 +178,7 @@ Definições de áudio Iniciar reprodução em segundo plano Iniciar reprodução em popup - Mostrar informação + Mostrar informações Listas de reprodução favoritas Sempre Apenas uma vez @@ -198,8 +198,8 @@ Reprodutor de vídeo não encontrado (pode instalar VLC para o efeito). Descarregar ficheiro Adicionar a - Utilizar pesquisa rápida - Este tipo de pesquisa é mais rápida mas reduz a precisão. Procurar por 5, 15 ou 25 segundos não funciona corretamente + Usar busca rápida não exata + A busca não exata permite ao player buscar posições mais rapidamente com precisão reduzida. Buscar por 5, 15 ou 25 segundos não funciona com isto Cache de imagens limpa País padrão para conteúdo Depuração @@ -229,15 +229,15 @@ Ficheiro Última reprodução Mais reproduzido - Reprodutor de vídeo - Reprodutor em segundo plano - Reprodutor \'popup\' - Perguntar sempre + Player de vídeo + Player em segundo plano + Player pop-up + Sempre perguntar A obter informação… A carregar conteúdo solicitado Nova lista de reprodução Mudar nome - Adicionar à lista de reprodução + Adicionar à playlist Guardar lista de reprodução como favorita Remover marcador Eliminar esta lista de reprodução\? @@ -276,7 +276,7 @@ Controlos para velocidade de reprodução Ritmo Limpar histórico de visualizações - Continuar (sem repetição) a fila de reprodução anexando um vídeo relacionado + Continuar a encerrar a fila de reprodução (sem repetição) a anexar um fluxo relacionado Mostrar dica \"Toque longo para colocar na fila\" Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup Canais @@ -297,16 +297,16 @@ O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe dados sem o seu consentimento. \nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro. Leia a política de privacidade - Adicionar o próximo vídeo à fila automaticamente + Enfileirar automaticamente o próximo stream NewPipe é um software copyleft libre: pode usá-lo, estudá-lo, partilhá-lo e melhorá-lo à vontade. Especificamente, pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (ao seu critério) qualquer versão posterior. Também deseja importar as definições\? Toque longo para colocar na fila - Ação de \'Abrir\' preferida + Ação \'abrir\' preferida Ação padrão ao abrir o conteúdo — %s Definir como miniatura da lista de reprodução Ajustar Preencher - Alterar escala das legendas e do estilo de fundo. Tem que reiniciar a aplicação para aplicar as alterações + Modifique a escala do texto da legenda do player e os estilos de fundo. Requer reinicialização da app para entrar em vigor A monitorização de memória pode tornar a aplicação instável Reportar erros \'out-of-lifecycle\' Forçar reporte de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após eliminação @@ -323,12 +323,12 @@ Aceitar Recusar Sem limite - Limitar resolução se em dados móveis - Minimizar ao trocar de aplicação + Limitar resolução ao usar dados móveis + Minimizar na troca da app Ação a executar ao trocar para outra aplicação a partir do menu principal - %s - Nenhuma - Ativar reprodutor em segundo plano - Ativar reprodutor \'popup\' + Nenhum + Minimizar para reprodutor em segundo plano + Minimizar para reprodutor pop-up Cancelar subscrição Escolher separador Atualizações @@ -344,9 +344,9 @@ Separadores mostrados na página principal Atualizações Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão - Modo de exibição + Modo de visualização de lista Lista - Grelha + Grade Automático Atualização NewPipe disponível! Terminada @@ -425,7 +425,7 @@ %s ouvintes %s ouvintes - Duração de avanço/recuo rápido + Duração da busca de avanço/retrocesso rápido Instâncias PeerTube Defina as suas instâncias PeerTube preferidas Encontre as instâncias que gosta em %s @@ -549,17 +549,17 @@ URL não reconhecida. Abrir com outra aplicação? Colocar na fila automaticamente Baralhar - Apenas em Wi-Fi + Somente no Wi-Fi Nada - Mudar de um reprodutor para outro pode substituir a sua fila - Pedir confirmação antes de limpar a fila + Mudar de um player para outro pode substituir a sua fila + Pedir confirmação antes de limpar uma fila Edite cada ação de notificação abaixo, tocando na mesma. Seleccione até três delas para serem mostradas na notificação compacta, utilizando as caixas de verificação à direita. Pode selecionar, no máximo, três ações para mostrar na notificação compacta! Repetir Quinto botão de ação Mostrar \'leaks\' de memória Colocado na fila - Colocar na fila + Enfileirar Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA Os cookies reCAPTCHA foram limpos Limpar cookies reCAPTCHA @@ -596,12 +596,12 @@ Resolver Escolha o seu tema escuro favorito — %s Descarga iniciada - Pode escolher o seu tema escuro favorito abaixo - Automático (Tema do dispositivo) - Tema escuro + Pode selecionar o seu tema noturno favorito abaixo + Automático (tema do dispositivo) + Tema noturno Mostrar detalhes do canal - Desative o túnel multimédia se tiver um ecrã preto ou paragens na reprodução de vídeos. - Desativar túnel multimédia + Desativa o tunelamento de média se tiver um ecrã preto ou interrupções na reprodução do vídeo. + Desativar o tunelamento de média Sempre que descarregar um ficheiro, terá que indicar o local para o guardar Ainda não definiu uma pasta para as descargas. Escolha agora a pasta a utilizar Conta encerrada @@ -612,10 +612,10 @@ Não foi possível carregar a fonte para \'%s\'. Erro ao carregar a fonte A partir do Android 10, apenas é compatível o \'Storage Access Framework\' - Pré-visualização da miniatura na barra de pesquisa + Visualização em miniatura da barra de busca Marcar como visto - Desligado - Ligado + Não + Sim Modo tablet Abrir site Adorado pelo criador @@ -651,8 +651,8 @@ %s descargas concluídas Deslize nos itens para os remover - Não iniciar vídeos em mini-reprodutor e ativar ecrã completo, se a rotação automática estiver bloqueada. Pode aceder ao mini-reprodutor se sair do modo de ecrã completo. - Iniciar reprodutor principal em ecrã completo + Não iniciar vídeos no minireprodutor, mas mudar diretamente para o modo de ecrã inteiro, se a rotação automática estiver bloqueada. Ainda pode aceder o minireprodutor a sair do ecrã inteiro + Iniciar reprodutor principal em ecrã cheio Seguinte colocado na fila Colocar seguinte na fila A processar… Pode levar algum tempo @@ -674,7 +674,7 @@ Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. \nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework Comentário afixado LeakCanary não disponível - Predefinição ExoPlayer + Padrão do ExoPlayer Notificação do reprodutor Configurar notificação da reprodução do vídeo atual Notificações @@ -707,7 +707,7 @@ Formato desconhecido Qualidade desconhecida O vídeo selecionado não é suportado por reprodutores externos - Tamanho do intervalo de carregamento da reprodução + Tamanho do intervalo de carregamento de reprodução Perguntas frequentes Ver no site Se tem problemas a usar a app, verifique estas respostas para perguntas comuns! @@ -722,8 +722,8 @@ Cartão As listas de reprodução acinzentadas já contêm este item. Duplicado adicionado %d vez(es) - Ignorar botões físicos - Útil, por exemplo, se estiver a utilizar auscultadores com botões físicos danificados + Ignorar eventos de botão de média de hardware + Útil, por exemplo, se usar auscultadores com botões físicos quebrados Remover duplicados Remover duplicados\? Mostrar/ocultar vídeos @@ -732,38 +732,36 @@ Completamente visto Mostrar vídeos seguintes Parcialmente visto - Ação para o gesto à esquerda - Ação para o gesto à direita + Ação do gesto esquerdo + Ação do gesto direito Brilho Volume - Nada - Escolha o gesto para a parte esquerda do ecrã - Escolha o gesto para a parte direita do ecrã - Seleciona o áudio com descrição para pessoas com dificuldades de visão, se disponível - Esta solução alternativa liberta os codificadores de vídeo quando ocorre uma alteração da superfície, em vez de definir diretamente a superfície para o codificador. Já utilizada pelo ExoPlayer em alguns dispositivos com este problema, esta definição só tem efeito no Android 6 e superior -\n -\nA ativação desta opção pode evitar erros de reprodução ao mudar o leitor de vídeo atual ou ao mudar para ecrã inteiro + Nenhum + Escolha o gesto para a metade esquerda do ecrã do reprodutor + Escolha o gesto para a metade direita do ecrã do reprodutor + Selecionar faixa de áudio com descrições para pessoas com deficiência visual, se disponível + Esta solução alternativa libera e reinstancia codecs de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície diretamente para o codec. Já usada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior\n\nAtivar esta opção pode evitar erros de reprodução ao mudar o player de vídeo atual ou mudar para ecrã cheio Altera o tamanho do intervalo de carregamento progressivo (atualmente %s). Um valor menor pode acelerar o carregamento inicial do conteúdo - Dar preferência ao áudio original - Seleciona o áudio original, independentemente do idioma - Dar preferência ao áudio descritivo + Preferir áudio original + Selecionar faixa de áudio original independentemente do idioma + Preferir áudio descritivo Áudio: %s Faixa de áudio Já deve existir uma faixa de áudio neste vídeo Selecione a faixa de áudio para reprodutores externos Desconhecida - Definições ExoPlayer - Gere algumas definições ExoPlayer. Tem que reiniciar o reprodutor para aplicar as alterações - Utilizar descodificador se recurso do ExoPlayer - Ative esta opção se tiver problemas de inicialização do descodificador, que retorna codificadores de baixa prioridade se o descodificador primário falhar. Isto pode resultar num desempenho inferior de reprodução - Usar sempre a configuração de saída alternativa de vídeo do ExoPlayer + Configurações do ExoPlayer + Gerir algumas configurações do ExoPlayer. Estas mudanças exigem a reinicialização do reprodutor para entrarem em vigor + Usar recurso de fallback do decodificador do ExoPlayer + Ative esta opção se tiver problemas de inicialização do decodificador, que retornarão para decodificadores de prioridade mais baixa se a inicialização dos decodificadores primários falhar. Isto pode resultar num desempenho de reprodução ruim do que ao usar decodificadores primários + Sempre usar solução alternativa de configuração de superfície de saída de vídeo do ExoPlayer %1$s %2$s original dobrado descritivo - Mova o seletor do separador principal para a parte inferior - Posição dos separadores principais - O túnel multimédia foi desativado no seu dispositivo porque o seu dispositivo não tem suporte à opção. + Mover seletor da guia principal para baixo + Posição das guias principais + O tunelamento de média foi desativado por padrão no seu dispositivo porque sabe-se que o modelo do seu dispositivo não é compatível. Nenhum vídeo em direto Nenhum vídeo A carregar metadados… diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index c50f4e73a..31e837458 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -151,7 +151,7 @@ © %1$s de %2$s sub %3$s Despre & Întrebări frecvente Licențe - Streaming sursă-liberă pentru Android. + Streaming gratuit și ușor pe Android. Vezi pe GitHub Licența NewPipe Indiferent dacă ai idei legate de traduceri, modificări de design, curățarea codului sau modificări majore ale codului — ajutorul tău este întotdeauna binevenit. Cu cât se face mai mult, cu atât rezultatul este mai bun! @@ -408,8 +408,8 @@ Niciun abonament selectat Selectați abonamente - Se procesează feedul … - Se încarcă feedul … + Se procesează fluxul… + Se încarcă fluxul… Neîncărcat: %d Ultima actualizare a fluxului: %s Grupuri de canale @@ -508,7 +508,7 @@ Minimizează playerul în fundal Niciuna Acțiune la trecerea la altă aplicație de la playerul video principal - %s - Minimizează la comutarea între aplicații + Minimizează la trecerea dintre aplicații Afișați o notificare pentru a solicita actualizarea aplicației atunci când este disponibilă o nouă versiune Actualizări Fără limită @@ -732,7 +732,7 @@ Filele canalului Volum Utilizați funcția de rezervă a decodorului din ExoPlayer - Niciun + Niciunul Se încarcă metadata… Schimbați orientarea ecranului Gestionați anumite setări ale ExoPlayer. Pentru ca aceste modificări să intre în vigoare, este necesară repornirea playerului diff --git a/shared/src/commonMain/composeResources/values-nb-rNO/strings.xml b/shared/src/commonMain/composeResources/values-nb-rNO/strings.xml index 55344e519..8ebaabb1f 100644 --- a/shared/src/commonMain/composeResources/values-nb-rNO/strings.xml +++ b/shared/src/commonMain/composeResources/values-nb-rNO/strings.xml @@ -1,3 +1,115 @@ - \ No newline at end of file + Tilbake + Om NewPipe + Tredjepartslisenser + Av %1$s under %2$s + Om og ofte stilte spørsmål + Lisenser + Fri lettvektsstrømming på Android. + Bidra + Uansett om du har idéer om: oversettelse, designendringer, kodeforbedring, eller virkelig tunge kodeendringer så er hjelp alltid velkommen. Jo mer som blir gjort, jo bedre blir det! + Se på GitHub + Donér + NewPipe utvikles av bidragsytere som bruker fritiden sin på å gi deg den beste brukeropplevelsen. Gi tilbake til miljøet for å hjelpe utviklerne med å gjøre NewPipe enda bedre mens de nyter en kopp kaffe. + Gi tilbake + Nettside + Besøk NewPipe-nettsiden for mer info og nyheter. + NewPipes personvernerklæring + NewPipe-prosjektet tar personvernet ditt veldig seriøst. Derfor samler ikke appen inn noe data uten ditt samtykke.\nNewPipes personvernerklæring forklarer i detalj hvilke data som sendes og lagres når du sender en kræsjrapport. + Les personvernerklæring + NewPipes lisens + Les lisens + Ofte stilte spørsmål + Hvis du har problemer med å bruke appen, sørg for å sjekke ut disse svarene på vanlige spørsmål! + Se på nettside + Åpne i nettleser + Ferdig + Ikke tilgjengelig + Innstillinger + Søk + Innhold + Varslinger + Video og lyd + Last ned + Utseende + Logg og mellomlager + Oppdateringer + Sikkerhetskopi og gjenopprett + Tema + Lyst + Mørkt + Svart + Automatisk (enhetstema) + Nattmodus + Velg favorittemaet ditt — %1$s + Dette valget er kun tilgjengelig om %1$s er valgt som Tema + Du kan velge ditt favoritt-nattema nedenfor + Nettbrettmodus + Listevisningsmodus + Undertekst + Modifiser avspillingsundertekststørrelse og bakgrunnsstiler. Krever restart av app for å tre i kraft + Hovedfanerposisjon + Flytt hovedfanevelgeren til bunnen + Auto + På + Av + Liste + Rutenett + Kort + Avbryt + Standard oppløsning + Standard sprettopp-oppløsning + Begrens oppløsning når mobildata brukes + Vis høyere oppløsninger + Bare noen enheter er i stand til å spille av 2K/4K-videoer + Standard videoformat + Standard lydformat + Foretrekk original lyd + Velg det originale lydsporet uavhengig av språket + Foretrekk deskriptiv lyd + Velg et lydspor med beskrivelser for mennesker med nedsatt synsevne om tilgjengelig + Beste oppløsning + Ingen begrensning + Avspiller + Bruk ekstern videoavspiller + Fjerner lyd på noen oppløsninger + Bruk ekstern lydavspiller + Vis Spill av med Kodi valg + Vis valg om å spille av video via Kodi mediasenter + Høy kvalitet (større) + Lav kvalitet (mindre) + Ikke vis + Oppførsel + Foretrekt "åpne"-handling + Standard handling når innhold åpnes — %1$s + Vis info + Videoavspiller + Bakgrunnsavspiller + Sprettopp-avspiller + Last ned + Legg til spilleliste + Legg i kø + Spør alltid + Minimer på appbytte + Ingen + Minimer til bakgrunnsavspiller + Minimer til sprettopp-avspiller + Start hovedavspiller i fullskjermmodus + Autoavspill + Start avspilling automatisk — %1$s + Alltid + Kun på Wi-Fi + Aldri + Legg neste strøm i kø automatisk + Gjenoppta avspilling + Fortsett avspilling etter avbrytelser (for eksempel telefonanrop) + Lysstyrke + Volum + Ingen + Husk sprettopp-egenskaper + Husk siste størrelse og posisjon på sprettopp + Bruk raskt unøyaktig søk + Rask frem- og tilbakespolingssøkevarighet + På grunn av ExoPlayer-begrensninger ble søkevarigheten satt til %1$d sekunder + diff --git a/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml b/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml index 5a0e18a71..93b1a310d 100644 --- a/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml @@ -38,4 +38,112 @@ Atualizações Backup e restauração Depuração + Tema + Claro + Escuro + Preto + Automático (tema do dispositivo) + Tema noturno + Selecione o seu tema noturno favorito — %1$s + Esta opção só está disponível se %1$s estiver selecionado como Tema + Pode selecionar o seu tema noturno favorito abaixo + Mostrar dica Segure para enfileirar + Mostrar dica ao pressionar no fundo ou botão pop-up nos pormenores do vídeo: + Modo tablet + Modo de visualização de lista + Legendas + Modifique a escala do texto da legenda do player e os estilos de fundo. Requer reinicialização da app para entrar em vigor + Posição das guias principais + Mover seletor da guia principal para baixo + Automático + Sim + Não + Lista + Grade + Cartão + Cancelar + Resolução padrão + Resolução padrão do pop-up + Limitar resolução ao usar dados móveis + Mostrar resoluções mais altas + Apenas alguns dispositivos podem reproduzir vídeos 2K/4K + Formato de vídeo padrão + Formato de áudio padrão + Preferir áudio original + Selecionar faixa de áudio original independentemente do idioma + Preferir áudio descritivo + Selecionar faixa de áudio com descrições para pessoas com deficiência visual, se disponível + Melhor resolução + Sem limite + Usar player de vídeo externo + Remove áudio em algumas resoluções + Usar reprodutor de áudio externo + Mostrar opção Reproduzir com Kodi + Exibir uma opção para reproduzir um vídeo através do centro de média Kodi + Visualização em miniatura da barra de busca + Alta qualidade (maior) + Baixa qualidade (menor) + Não mostrar + Comportamento + Ação 'abrir' preferida + Ação padrão ao abrir conteúdo — %1$s + Mostrar informações + Player de vídeo + Player em segundo plano + Player pop-up + Descarregar + Adicionar à playlist + Enfileirar + Sempre perguntar + Minimizar na troca da app + Ação ao mudar para outra app a partir do reprodutor de vídeo principal — %1$s + Nenhum + Minimizar para reprodutor em segundo plano + Minimizar para reprodutor pop-up + Iniciar reprodutor principal em ecrã cheio + Não iniciar vídeos no minireprodutor, mas mudar diretamente para o modo de ecrã inteiro, se a rotação automática estiver bloqueada. Ainda pode aceder o minireprodutor a sair do ecrã inteiro + Reprodução automática + Iniciar reprodução automaticamente — %1$s + Sempre + Somente no Wi-Fi + Nunca + Enfileirar automaticamente o próximo stream + Continuar a encerrar a fila de reprodução (sem repetição) a anexar um fluxo relacionado + Retomar reprodução + Continuar a reproduzir após interrupções (por exemplo, ligações) + Ação do gesto esquerdo + Escolha o gesto para a metade esquerda do ecrã do reprodutor + Ação do gesto direito + Escolha o gesto para a metade direita do ecrã do reprodutor + Brilho + Volume + Nenhum + Lembrar das propriedades do pop-up + Lembrar do último tamanho e posição do pop-up + Usar busca rápida não exata + A busca não exata permite ao player buscar posições mais rapidamente com precisão reduzida. Buscar por 5, 15 ou 25 segundos não funciona com isto + Duração da busca de avanço/retrocesso rápido + Devido a restrições do ExoPlayer, a duração da busca foi definida para %1$d segundos + Pedir confirmação antes de limpar uma fila + Mudar de um player para outro pode substituir a sua fila + Ignorar eventos de botão de média de hardware + Útil, por exemplo, se usar auscultadores com botões físicos quebrados + + %1$d segundo + %1$d segundos + %1$d segundos + + Configurações do ExoPlayer + Gerir algumas configurações do ExoPlayer. Estas mudanças exigem a reinicialização do reprodutor para entrarem em vigor + Tamanho do intervalo de carregamento de reprodução + Alterar tamanho do intervalo de carregamento em conteúdos progressivos (atualmente %1$s). Um valor mais baixo pode acelerar o carregamento inicial + Padrão do ExoPlayer + Usar recurso de fallback do decodificador do ExoPlayer + Ative esta opção se tiver problemas de inicialização do decodificador, que retornarão para decodificadores de prioridade mais baixa se a inicialização dos decodificadores primários falhar. Isto pode resultar num desempenho de reprodução ruim do que ao usar decodificadores primários + Desativar o tunelamento de média + Desativa o tunelamento de média se tiver um ecrã preto ou interrupções na reprodução do vídeo. + O tunelamento de média foi desativado por padrão no seu dispositivo porque sabe-se que o modelo do seu dispositivo não é compatível. + Sempre usar solução alternativa de configuração de superfície de saída de vídeo do ExoPlayer + Esta solução alternativa libera e reinstancia codecs de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície diretamente para o codec. Já usada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior\n\nAtivar esta opção pode evitar erros de reprodução ao mudar o player de vídeo atual ou mudar para ecrã cheio + Reprodutor diff --git a/shared/src/commonMain/composeResources/values-pt/strings.xml b/shared/src/commonMain/composeResources/values-pt/strings.xml index 5a0e18a71..52e90ed88 100644 --- a/shared/src/commonMain/composeResources/values-pt/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt/strings.xml @@ -38,4 +38,5 @@ Atualizações Backup e restauração Depuração + Reprodutor From 78b0b58504d58def1c3ebe65b8653d90e4f089ad Mon Sep 17 00:00:00 2001 From: tobigr Date: Sun, 15 Feb 2026 14:52:16 +0100 Subject: [PATCH 094/155] Add workflow to react on missing or ignored templates The workflow creates a comment on the issue or PR that has a missing or ignored template asking the author to use the template properly. --- .github/workflows/template-label.yml | 61 ++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 .github/workflows/template-label.yml diff --git a/.github/workflows/template-label.yml b/.github/workflows/template-label.yml new file mode 100644 index 000000000..52056a572 --- /dev/null +++ b/.github/workflows/template-label.yml @@ -0,0 +1,61 @@ +name: Template label comment + +on: + issues: + types: [labeled] + pull_request: + types: [labeled] + +permissions: + issues: write + pull-requests: write + +jobs: + comment_on_label: + name: Comment on labeled issue/PR + if: ${{ github.event.label.name == 'template-ignored' || github.event.label.name == 'template-missing' }} + runs-on: ubuntu-latest + steps: + - name: Get PR template + if: ${{ github.event.pull_request && github.event.label.name == 'template-missing' }} + run: | + set -euo pipefail + { + echo 'PR_TEMPLATE<> $GITHUB_ENV + + - name: Post comment + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const label = context.payload.label && context.payload.label.name; + if (!label) return; + const isPR = !!context.payload.pull_request; + const number = isPR ? context.payload.pull_request.number : context.payload.issue.number; + + let body = ''; + if (label === 'template-ignored') { + body = 'Please fill in the template completely or at least as much as possible. The team needs more detailed information.'; + } else if (label === 'template-missing') { + const kind = isPR ? 'PR' : 'issue'; + let template; + if (isPR) { + template = '

Raw template\n```\n' + process.env.PR_TEMPLATE + '\n```\n
'; + } else { + template = '[Bug report template](https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/bug_report.yml), [Feature request template](https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/feature_request.yml)'; + } + body = `Thank you for creating this ${kind}. Please edit your description and add the template with the information: ${template}`; + } else { + return; + } + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: number, + body + }); + From 40202dcdca4cffaad0581ba322f0e56b1bb7de26 Mon Sep 17 00:00:00 2001 From: tobigr Date: Thu, 19 Feb 2026 12:24:40 +0100 Subject: [PATCH 095/155] Extract JS script into single file --- .github/workflows/template-label.js | 34 +++++++++++++++++++++++++++ .github/workflows/template-label.yml | 35 +++++----------------------- 2 files changed, 40 insertions(+), 29 deletions(-) create mode 100644 .github/workflows/template-label.js diff --git a/.github/workflows/template-label.js b/.github/workflows/template-label.js new file mode 100644 index 000000000..51a2028a3 --- /dev/null +++ b/.github/workflows/template-label.js @@ -0,0 +1,34 @@ +/* + * Script for commenting on issues/PRs when the template is missing or ignored + */ +module.exports = async ({github, context}) => { + + const label = context.payload.label && context.payload.label.name; + if (!label) return; + const isPR = !!context.payload.pull_request; + const number = isPR ? context.payload.pull_request.number : context.payload.issue.number; + + let body = ''; + if (label === 'template-ignored') { + body = 'Please fill in the template completely or at least as much as possible. The team needs more detailed information.'; + } else if (label === 'template-missing') { + const kind = isPR ? 'PR' : 'issue'; + let template; + if (isPR) { + template = '
Raw template\n```\n' + process.env.PR_TEMPLATE + '\n```\n
'; + } else { + template = '[Bug report template](https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/bug_report.yml), [Feature request template](https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/feature_request.yml)'; + } + body = `Thank you for creating this ${kind}. Please edit your description and add the template with the information: ${template}`; + } else { + return; + } + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: number, + body + }); + +} \ No newline at end of file diff --git a/.github/workflows/template-label.yml b/.github/workflows/template-label.yml index 52056a572..ee3f4c646 100644 --- a/.github/workflows/template-label.yml +++ b/.github/workflows/template-label.yml @@ -16,6 +16,8 @@ jobs: if: ${{ github.event.label.name == 'template-ignored' || github.event.label.name == 'template-missing' }} runs-on: ubuntu-latest steps: + - uses: actions/checkout@v6 + - name: Get PR template if: ${{ github.event.pull_request && github.event.label.name == 'template-missing' }} run: | @@ -27,35 +29,10 @@ jobs: } >> $GITHUB_ENV - name: Post comment - uses: actions/github-script@v6 + uses: actions/github-script@v8 + timeout-minutes: 2 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - const label = context.payload.label && context.payload.label.name; - if (!label) return; - const isPR = !!context.payload.pull_request; - const number = isPR ? context.payload.pull_request.number : context.payload.issue.number; - - let body = ''; - if (label === 'template-ignored') { - body = 'Please fill in the template completely or at least as much as possible. The team needs more detailed information.'; - } else if (label === 'template-missing') { - const kind = isPR ? 'PR' : 'issue'; - let template; - if (isPR) { - template = '
Raw template\n```\n' + process.env.PR_TEMPLATE + '\n```\n
'; - } else { - template = '[Bug report template](https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/bug_report.yml), [Feature request template](https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/feature_request.yml)'; - } - body = `Thank you for creating this ${kind}. Please edit your description and add the template with the information: ${template}`; - } else { - return; - } - - await github.rest.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: number, - body - }); - + const script = require('.github/workflows/template-label.js'); + await script({github, context}); From 9fb507397e894acdd5b78c77b9d1f013748378b8 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 12 Oct 2026 10:37:23 +0200 Subject: [PATCH 096/155] Provide template directly in comment Implement a small yml template to md renderer. The specification can be found in the GitHub docs: https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms.md --- .github/workflows/template-label.js | 103 ++++++++++++++++++++++++--- .github/workflows/template-label.yml | 5 +- 2 files changed, 97 insertions(+), 11 deletions(-) diff --git a/.github/workflows/template-label.js b/.github/workflows/template-label.js index 51a2028a3..6a23dbc85 100644 --- a/.github/workflows/template-label.js +++ b/.github/workflows/template-label.js @@ -1,3 +1,4 @@ +const yaml = require('js-yaml'); /* * Script for commenting on issues/PRs when the template is missing or ignored */ @@ -8,19 +9,29 @@ module.exports = async ({github, context}) => { const isPR = !!context.payload.pull_request; const number = isPR ? context.payload.pull_request.number : context.payload.issue.number; + let templateInfo; + if (isPR) { + templateInfo = await fetchTemplateAndGenerateComment('Raw template', 'https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/PULL_REQUEST_TEMPLATE.md', false); + } else { + const templates = { + 'bug report': 'https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/bug_report.yml', + 'feature request': 'https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/feature_request.yml' + }; + + const templateParts = await Promise.all(Object.entries(templates).map(async ([templateName, url]) => { + return await fetchTemplateAndGenerateComment(templateName, url, true); + })); + + templateInfo = templateParts.join('\n\n'); + } + let body = ''; if (label === 'template-ignored') { - body = 'Please fill in the template completely or at least as much as possible. The team needs more detailed information.'; + body = 'Please fill in the template completely or at least as much as possible. The team needs more detailed information. Here is the template, in case you deleted parts of it:\n\n' + templateInfo; } else if (label === 'template-missing') { - const kind = isPR ? 'PR' : 'issue'; - let template; - if (isPR) { - template = '
Raw template\n```\n' + process.env.PR_TEMPLATE + '\n```\n
'; - } else { - template = '[Bug report template](https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/bug_report.yml), [Feature request template](https://raw.githubusercontent.com/TeamNewPipe/NewPipe/refs/heads/dev/.github/ISSUE_TEMPLATE/feature_request.yml)'; - } - body = `Thank you for creating this ${kind}. Please edit your description and add the template with the information: ${template}`; + body = `Thank you for creating this ${isPR ? 'PR' : 'issue'}. Please edit your description and fill in the correct template with the required information:\n\n${templateInfo}`; } else { + // should never happen, but just in case return; } @@ -31,4 +42,76 @@ module.exports = async ({github, context}) => { body }); -} \ No newline at end of file +} + +async function fetchTemplateAndGenerateComment(templateName, url, extractBody) { + const response = await fetch(url); + if (!response.ok) { + console.log(`Failed to fetch ${url}: ${response.status} ${response.statusText}`); + return `
${templateName}\nView template
`; + } + let template = await response.text(); + + if (extractBody) { + const issueTemplate = yaml.load(template); + template = renderIssueForm(issueTemplate.body || []); + } + + const codeFence = '\n```\n'; + return `
${templateName}\n${codeFence}${template}${codeFence}
`; +} + +/** + * Renders the body of a YAML issue template into a Markdown string. + * @see https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms.md + * @param body + * @returns string the Markdown representation of the issue form body + */ +function renderIssueForm(body) { + return body.map(renderFormElement).filter(Boolean).join('\n\n').trim(); +} + +function renderFormElement(element) { + const attributes = element.attributes || {}; + switch (element.type) { + case 'markdown': + return attributes.value || ''; + case 'input': + case 'textarea': + case 'upload': + return renderTextElement(attributes); + case 'dropdown': + return renderDropdown(attributes); + case 'checkboxes': + return renderCheckboxes(attributes); + default: + return ''; + } +} + +function renderTextElement(attributes) { + const heading = attributes.label ? `### ${attributes.label}` : ''; + const description = attributes.description ? `` : ''; + const value = attributes.value || attributes.placeholder || ''; + return [heading, description, value].filter(Boolean).join('\n\n'); +} + +function renderDropdown(attributes) { + const options = (attributes.options || []).map(option => `- ${option}`).join('\n'); + return [ + attributes.label && `### ${attributes.label}`, + attributes.description && ``, + options + ].filter(Boolean).join('\n\n'); +} + +function renderCheckboxes(attributes) { + const options = (attributes.options || []) + .map(option => `- [ ] ${option.label || option}`) + .join('\n'); + return [ + attributes.label && `### ${attributes.label}`, + attributes.description && ``, + options + ].filter(Boolean).join('\n\n'); +} diff --git a/.github/workflows/template-label.yml b/.github/workflows/template-label.yml index ee3f4c646..55c15e00c 100644 --- a/.github/workflows/template-label.yml +++ b/.github/workflows/template-label.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - + - name: Get PR template if: ${{ github.event.pull_request && github.event.label.name == 'template-missing' }} run: | @@ -28,6 +28,9 @@ jobs: echo EOF } >> $GITHUB_ENV + - name: Install js-yaml + run: npm install --no-save --ignore-scripts js-yaml@4.1.0 + - name: Post comment uses: actions/github-script@v8 timeout-minutes: 2 From a34f25d6e08000e4dd9b92f6f6851d2a58128803 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 12 Oct 2026 11:09:41 +0200 Subject: [PATCH 097/155] Add workflow to check that PRs have a linked issue that the author is assigned to --- .github/workflows/linked-issue-check.js | 69 ++++++++++++++++++++++++ .github/workflows/linked-issue-check.yml | 25 +++++++++ 2 files changed, 94 insertions(+) create mode 100644 .github/workflows/linked-issue-check.js create mode 100644 .github/workflows/linked-issue-check.yml diff --git a/.github/workflows/linked-issue-check.js b/.github/workflows/linked-issue-check.js new file mode 100644 index 000000000..205dc30d3 --- /dev/null +++ b/.github/workflows/linked-issue-check.js @@ -0,0 +1,69 @@ +module.exports = async ({github, context}) => { + const pullRequest = context.payload.pull_request; + const query = `query($owner: String!, $repo: String!, $number: Int!) { + repository(owner: $owner, name: $repo) { + pullRequest(number: $number) { + author { + login + } + closingIssuesReferences(first: 100) { + nodes { + number + repository { + nameWithOwner + } + assignees(first: 10) { + nodes { + login + } + } + } + } + } + } + }`; + + const result = await github.graphql(query, { + owner: context.repo.owner, + repo: context.repo.repo, + number: pullRequest.number + }); + const linkedIssues = result.repository.pullRequest.closingIssuesReferences.nodes; + const authorLogin = result.repository.pullRequest.author.login; + const authorIsAssigned = linkedIssues.some(issue => + issue.assignees.nodes.some(assignee => assignee.login === authorLogin) + ); + + console.log( + `Found ${linkedIssues.length} linked issue(s); ` + + `the PR author ${authorLogin} is assigned to at least one: ${authorIsAssigned}` + ); + + if (authorIsAssigned) { + return; + } + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + labels: ['template-ignored'] + }); + + let body; + if (linkedIssues.length === 0) { + body = 'Please link this PR to an existing issue you are assigned to. Assignees are expected to discuss the details of the PR beforehand. This PR will be closed if it is not linked to an issue.'; + } else { + body = 'Please link this PR to an existing issue you are assigned to. This PR might be closed if the details of this PR were not agreed upon beforehand.'; + } + + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pullRequest.number, + body: body + }); + + return false; + +}; diff --git a/.github/workflows/linked-issue-check.yml b/.github/workflows/linked-issue-check.yml new file mode 100644 index 000000000..570d48254 --- /dev/null +++ b/.github/workflows/linked-issue-check.yml @@ -0,0 +1,25 @@ +name: Check linked issue + +on: + pull_request_target: + types: [opened] + +permissions: + contents: read + issues: write + pull-requests: write + +jobs: + check-linked-issue: + name: Check linked issue and assignee + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Check linked issues + uses: actions/github-script@v8 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const script = require('.github/workflows/linked-issue-check.js'); + await script({github, context}); From d714c93aeb317d20dcb2fe3d2f6e9d89502cb676 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 12 Oct 2026 11:10:40 +0200 Subject: [PATCH 098/155] Automatically close PRs that have the labels 'template ignored' or 'tempalte missing' after two weeks without a response by the author --- .github/workflows/no-response.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index b3495135f..e4ca81c1f 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -17,8 +17,18 @@ jobs: noResponse: runs-on: ubuntu-latest steps: - - uses: lee-dohm/no-response@v0.5.0 + - uses: tcely/no-response@v0.2.2 with: token: ${{ github.token }} daysUntilClose: 14 responseRequiredLabel: waiting for author + - uses: tcely/no-response@v0.2.2 + with: + token: ${{ github.token }} + daysUntilClose: 14 + responseRequiredLabel: template missing + - uses: tcely/no-response@v0.2.2 + with: + token: ${{ github.token }} + daysUntilClose: 14 + responseRequiredLabel: template ignored From 8e7ca5e770d03e067bdb9ca1466dafb731b1dcba Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 14 Oct 2026 12:12:48 +0200 Subject: [PATCH 099/155] Add SPDX License headers --- .github/workflows/linked-issue-check.js | 5 +++++ .github/workflows/linked-issue-check.yml | 3 +++ .github/workflows/no-response.yml | 3 +++ .github/workflows/template-label.js | 10 +++++++++- .github/workflows/template-label.yml | 4 ++++ 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linked-issue-check.js b/.github/workflows/linked-issue-check.js index 205dc30d3..bdef75d4a 100644 --- a/.github/workflows/linked-issue-check.js +++ b/.github/workflows/linked-issue-check.js @@ -1,3 +1,8 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + module.exports = async ({github, context}) => { const pullRequest = context.payload.pull_request; const query = `query($owner: String!, $repo: String!, $number: Int!) { diff --git a/.github/workflows/linked-issue-check.yml b/.github/workflows/linked-issue-check.yml index 570d48254..0bbfdff9a 100644 --- a/.github/workflows/linked-issue-check.yml +++ b/.github/workflows/linked-issue-check.yml @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2026 NewPipe e.V. +# SPDX-License-Identifier: GPL-3.0-or-later + name: Check linked issue on: diff --git a/.github/workflows/no-response.yml b/.github/workflows/no-response.yml index e4ca81c1f..6b5715f93 100644 --- a/.github/workflows/no-response.yml +++ b/.github/workflows/no-response.yml @@ -1,3 +1,6 @@ +# SPDX-FileCopyrightText: 2026 NewPipe e.V. +# SPDX-License-Identifier: GPL-3.0-or-later + name: No Response # Both `issue_comment` and `scheduled` event types are required for this Action diff --git a/.github/workflows/template-label.js b/.github/workflows/template-label.js index 6a23dbc85..d26cff2f7 100644 --- a/.github/workflows/template-label.js +++ b/.github/workflows/template-label.js @@ -1,7 +1,15 @@ -const yaml = require('js-yaml'); +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + /* * Script for commenting on issues/PRs when the template is missing or ignored + * to encourage proper use of the templates. */ + +const yaml = require('js-yaml'); + module.exports = async ({github, context}) => { const label = context.payload.label && context.payload.label.name; diff --git a/.github/workflows/template-label.yml b/.github/workflows/template-label.yml index 55c15e00c..e1c751dde 100644 --- a/.github/workflows/template-label.yml +++ b/.github/workflows/template-label.yml @@ -1,3 +1,7 @@ +# SPDX-FileCopyrightText: 2021-2022 NewPipe contributors +# SPDX-FileCopyrightText: 2026 NewPipe e.V. +# SPDX-License-Identifier: GPL-3.0-or-later + name: Template label comment on: From 8bc3b8afd467180efabff4cc31df22c84ed50b0c Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 14 Oct 2026 12:14:39 +0200 Subject: [PATCH 100/155] Do not require team members to link issues --- .github/workflows/linked-issue-check.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/linked-issue-check.yml b/.github/workflows/linked-issue-check.yml index 0bbfdff9a..d5fdb5755 100644 --- a/.github/workflows/linked-issue-check.yml +++ b/.github/workflows/linked-issue-check.yml @@ -15,6 +15,9 @@ permissions: jobs: check-linked-issue: name: Check linked issue and assignee + if: >- + github.event.pull_request.author_association != 'MEMBER' && + github.event.pull_request.author_association != 'OWNER' runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 From 6f6b5fb9961c525c046f197636eaf587110e93ab Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 14 Oct 2026 12:22:36 +0200 Subject: [PATCH 101/155] [Contribution guidelines] Clarify that PRs not having prior discussion and an issue assignement might be closed --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c97e37cdd..be942395e 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -49,7 +49,7 @@ You'll see *exactly* what is sent, be able to add **your comments**, and then se ### Before starting development -* If you want to help out with an existing bug report or feature request, **leave a comment** on that issue saying you want to try your hand at it. +* If you want to help out with an existing bug report or feature request, **leave a comment** on that issue saying you want to try your hand at it. Please wait for a response from the maintainers before starting development. This prevents multiple people from working on the same issue at the same time, which can lead to wasted effort and frustration. PRs that do not reference an existing issue which is **assigned** to you might be closed without further explanation. * If there is no existing issue for what you want to work on, **open a new one** describing the changes you are planning to introduce. This gives the team and the community a chance to give **feedback** before you spend time on something that is already in development, should be done differently, or should be avoided completely. * Please show **intention to maintain your features** and code after you contribute a PR. Unmaintained code is a hassle for core developers. If you do not intend to maintain features you plan to contribute, please rethink your submission, or clearly state that in the PR description. * Create PRs that cover only **one specific issue/solution/bug**. Do not create PRs that are huge monoliths and could have been split into multiple independent contributions. From 7f18496d94d0e58ab12d1675a2f19eeb5e5c853a Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Thu, 8 Oct 2026 10:56:38 -0700 Subject: [PATCH 102/155] add debug preference keys --- .../net/newpipe/app/platform/DebugActions.kt | 2 ++ .../app/preferences/DebugPreferences.kt | 22 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/preferences/DebugPreferences.kt diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt b/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt new file mode 100644 index 000000000..38452c7f0 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt @@ -0,0 +1,2 @@ +package net.newpipe.app.platform + diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DebugPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DebugPreferences.kt new file mode 100644 index 000000000..e528e8176 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DebugPreferences.kt @@ -0,0 +1,22 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.preferences + +/** + * Preference keys and defaults for the Debug settings screen. + * + */ +object DebugPreferences { + const val KEY_ALLOW_HEAP_DUMPING = "allow_heap_dumping_key" + const val KEY_ALLOW_DISPOSED_EXCEPTIONS = "allow_disposed_exceptions_key" + const val KEY_SHOW_ORIGINAL_TIME_AGO = "show_original_time_ago_key" + const val KEY_SHOW_CRASH_THE_PLAYER = "show_crash_the_player_key" + + const val DEFAULT_ALLOW_HEAP_DUMPING = false + const val DEFAULT_ALLOW_DISPOSED_EXCEPTIONS = false + const val DEFAULT_SHOW_ORIGINAL_TIME_AGO = false + const val DEFAULT_SHOW_CRASH_THE_PLAYER = false +} \ No newline at end of file From 4fc372035a3e70f38d0905dbb671dc4054d735a9 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Thu, 8 Oct 2026 11:04:36 -0700 Subject: [PATCH 103/155] add platform and compose debug actions --- .../newpipe/settings/ComposeDebugActions.kt | 53 +++++++++++++++++++ .../app/platform/AndroidDebugActions.kt | 44 +++++++++++++++ .../net/newpipe/app/platform/DebugActions.kt | 45 ++++++++++++++++ .../newpipe/app/platform/IOSDebugActions.kt | 14 +++++ .../newpipe/app/platform/JVMDebugActions.kt | 15 ++++++ 5 files changed, 171 insertions(+) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt create mode 100644 shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDebugActions.kt create mode 100644 shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSDebugActions.kt create mode 100644 shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMDebugActions.kt diff --git a/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt b/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt new file mode 100644 index 000000000..7c415e4ef --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt @@ -0,0 +1,53 @@ +package org.schabi.newpipe.settings + +import android.content.Context +import android.content.Intent +import net.newpipe.app.platform.DebugActions +import org.schabi.newpipe.error.ErrorInfo +import org.schabi.newpipe.error.ErrorUtil +import org.schabi.newpipe.error.UserAction +import org.schabi.newpipe.local.feed.notifications.NotificationWorker + +/** + * Host-side implementation of the debug actions used by the Compose debug settings screen. + */ +@Suppress("unused") +class ComposeDebugActions(private val context: Context) : DebugActions { + + private val leakCanary = loadLeakCanary() + + override val isLeakCanaryAvailable: Boolean + get() = leakCanary != null + + override fun showMemoryLeaks() { + // The injected context is the application context, so the activity needs its own task. + leakCanary?.newLeakDisplayActivityIntent + ?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + ?.let(context::startActivity) + } + + override fun checkNewStreams() = NotificationWorker.runNow(context) + + override fun createErrorNotification() = ErrorUtil.createNotification(context, dummyErrorInfo()) + + override fun reportDummyError() = ErrorUtil.openActivity(context, dummyErrorInfo()) + + private fun dummyErrorInfo() = ErrorInfo(RuntimeException(DUMMY), UserAction.UI_ERROR, DUMMY) + + /** + * LeakCanary only ships in debug builds, so it is reached through the build-variant dependent + * bridge the legacy debug settings fragment already defines. + * + * TODO: move [DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI] out of the fragment when + * the legacy debug settings fragment is deleted. + */ + private fun loadLeakCanary(): DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI? = runCatching { + Class.forName(DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI.IMPL_CLASS) + .getDeclaredConstructor() + .newInstance() as DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI + }.getOrNull() + + private companion object { + const val DUMMY = "Dummy" + } +} diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDebugActions.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDebugActions.kt new file mode 100644 index 000000000..9bc3d24c1 --- /dev/null +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDebugActions.kt @@ -0,0 +1,44 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import android.content.Context +import co.touchlab.kermit.Logger +import org.koin.core.annotation.Singleton + +/** + * Forwards every debug action to a bridge supplied by the host app. + * + */ +@Singleton(binds = [DebugActions::class]) +class AndroidDebugActions(context: Context) : DebugActions { + + private val host: DebugActions = loadHost(context) + + override val isLeakCanaryAvailable: Boolean + get() = host.isLeakCanaryAvailable + + override fun showMemoryLeaks() = host.showMemoryLeaks() + + override fun checkNewStreams() = host.checkNewStreams() + + override fun createErrorNotification() = host.createErrorNotification() + + override fun reportDummyError() = host.reportDummyError() + + private fun loadHost(context: Context): DebugActions = runCatching { + Class.forName(HOST_CLASS) + .getDeclaredConstructor(Context::class.java) + .newInstance(context) as DebugActions + }.getOrElse { error -> + Logger.w(messageString = "No host debug actions found, falling back to no-op", throwable = error) + NoOpDebugActions + } + + private companion object { + const val HOST_CLASS = "org.schabi.newpipe.settings.ComposeDebugActions" + } +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt b/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt index 38452c7f0..8f4e01739 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt @@ -1,2 +1,47 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + package net.newpipe.app.platform +import co.touchlab.kermit.Logger + +/** + * Platform-specific actions triggered from the Debug settings screen. + * + */ +interface DebugActions { + /** Whether the running build ships LeakCanary; its two rows are disabled when it does not. */ + val isLeakCanaryAvailable: Boolean + + /** Opens the LeakCanary leak list. */ + fun showMemoryLeaks() + + /** Runs the new-stream notification check now, instead of waiting for its schedule. */ + fun checkNewStreams() + + /** Posts a dummy error notification, to verify error reporting end to end. */ + fun createErrorNotification() + + /** Opens the error report screen for a dummy error. */ + fun reportDummyError() +} + +/** + * Fallback for platforms with no debug tooling to drive, and for Android builds that ship without + * the host-side bridge. + */ +internal object NoOpDebugActions : DebugActions { + override val isLeakCanaryAvailable = false + + override fun showMemoryLeaks() = logUnsupported("showMemoryLeaks") + + override fun checkNewStreams() = logUnsupported("checkNewStreams") + + override fun createErrorNotification() = logUnsupported("createErrorNotification") + + override fun reportDummyError() = logUnsupported("reportDummyError") + + private fun logUnsupported(action: String) = Logger.w(messageString = "Debug action '$action' is unsupported on this platform") +} diff --git a/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSDebugActions.kt b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSDebugActions.kt new file mode 100644 index 000000000..4912cd7a7 --- /dev/null +++ b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSDebugActions.kt @@ -0,0 +1,14 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import org.koin.core.annotation.Singleton + +/** + * iOS has no debug tooling to drive yet, and the Debug category is hidden there anyway + */ +@Singleton(binds = [DebugActions::class]) +class IOSDebugActions : DebugActions by NoOpDebugActions diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMDebugActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMDebugActions.kt new file mode 100644 index 000000000..4dc7efe55 --- /dev/null +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMDebugActions.kt @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import org.koin.core.annotation.Singleton + +/** + * Desktop has no debug tooling to drive yet + */ + +@Singleton(binds = [DebugActions::class]) +class JVMDebugActions : DebugActions by NoOpDebugActions From aae7631949110950f011b3278cbf86f75bebf788 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Thu, 8 Oct 2026 11:24:14 -0700 Subject: [PATCH 104/155] add debug settings ui and viewmodel --- .../composeResources/values/strings.xml | 18 +- .../newpipe/app/composable/PreferenceRow.kt | 9 +- .../screen/settings/DebigSettingsScreen.kt | 204 ++++++++++++++++++ .../settings/DebugSettingsViewModel.kt | 60 ++++++ 4 files changed, 289 insertions(+), 2 deletions(-) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebigSettingsScreen.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DebugSettingsViewModel.kt diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml index 637d82f64..c7fcfe638 100644 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ b/shared/src/commonMain/composeResources/values/strings.xml @@ -165,5 +165,21 @@ Always use ExoPlayer's video output surface setting workaround This workaround releases and re-instantiates video codecs when a surface change occurs, instead of setting the surface to the codec directly. Already used by ExoPlayer on some devices with this issue, this setting has only an effect on Android 6 and higher\n\nEnabling this option may prevent playback errors when switching the current video player or switching to fullscreen - + + LeakCanary + Memory leak monitoring may cause the app to become unresponsive when heap dumping + LeakCanary is not available + Show memory leaks + 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 + Show "Crash the player" + Shows a crash option when using the player + Run check for new streams + Crash the app + Show an error snackbar + Create an error notification + Sorry, something went wrong. + Report diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceRow.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceRow.kt index dbec1f8e3..7fa4695db 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceRow.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/PreferenceRow.kt @@ -11,6 +11,7 @@ import androidx.compose.material3.ListItem import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewWrapper @@ -21,6 +22,8 @@ import newpipe.shared.generated.resources.settings_category_video_audio_title import org.jetbrains.compose.resources.painterResource import org.jetbrains.compose.resources.stringResource +private const val DISABLED_ALPHA = 0.38f + /** * A row that mirrors the standard AndroidX preference item * @@ -28,6 +31,7 @@ import org.jetbrains.compose.resources.stringResource * @param modifier Modifier applied to the row * @param icon Leading icon painter; null hides the leading slot * @param summary Optional secondary line under the title + * @param enabled Whether the row can be clicked * @param onClick Action executed when the row is tapped */ @Composable @@ -36,10 +40,13 @@ fun PreferenceRow( modifier: Modifier = Modifier, icon: Painter? = null, summary: String? = null, + enabled: Boolean = true, onClick: () -> Unit = {} ) { ListItem( - modifier = modifier.clickable(onClick = onClick), + modifier = modifier + .alpha(if (enabled) 1f else DISABLED_ALPHA) + .clickable(enabled = enabled, onClick = onClick), headlineContent = { Text(text = title) }, supportingContent = summary?.let { text -> { Text(text = text) } }, leadingContent = icon?.let { painter -> diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebigSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebigSettingsScreen.kt new file mode 100644 index 000000000..b3bbf18e6 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebigSettingsScreen.kt @@ -0,0 +1,204 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.screen.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.SnackbarResult +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.launch +import net.newpipe.app.composable.PreferenceRow +import net.newpipe.app.composable.SwitchPreference +import net.newpipe.app.composable.TopAppBar +import net.newpipe.app.navigation.Navigator +import net.newpipe.app.platform.DebugActions +import net.newpipe.app.preferences.DebugPreferences.DEFAULT_ALLOW_DISPOSED_EXCEPTIONS +import net.newpipe.app.preferences.DebugPreferences.DEFAULT_ALLOW_HEAP_DUMPING +import net.newpipe.app.preferences.DebugPreferences.DEFAULT_SHOW_CRASH_THE_PLAYER +import net.newpipe.app.preferences.DebugPreferences.DEFAULT_SHOW_ORIGINAL_TIME_AGO +import net.newpipe.app.preview.ThemePreviewProvider +import net.newpipe.app.viewmodel.settings.DebugSettingsViewModel +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.check_new_streams +import newpipe.shared.generated.resources.crash_the_app +import newpipe.shared.generated.resources.create_error_notification +import newpipe.shared.generated.resources.enable_disposed_exceptions_summary +import newpipe.shared.generated.resources.enable_disposed_exceptions_title +import newpipe.shared.generated.resources.enable_leak_canary_summary +import newpipe.shared.generated.resources.error_snackbar_action +import newpipe.shared.generated.resources.error_snackbar_message +import newpipe.shared.generated.resources.leak_canary_not_available +import newpipe.shared.generated.resources.leakcanary +import newpipe.shared.generated.resources.settings_category_debug_title +import newpipe.shared.generated.resources.show_crash_the_player_summary +import newpipe.shared.generated.resources.show_crash_the_player_title +import newpipe.shared.generated.resources.show_error_snackbar +import newpipe.shared.generated.resources.show_memory_leaks +import newpipe.shared.generated.resources.show_original_time_ago_summary +import newpipe.shared.generated.resources.show_original_time_ago_title +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel + +private const val DUMMY = "Dummy" + +@Composable +fun DebugSettingsScreen( + navigator: Navigator = koinInject(), + viewModel: DebugSettingsViewModel = koinViewModel(), + debugActions: DebugActions = koinInject() +) { + val allowHeapDumping by viewModel.allowHeapDumping.collectAsStateWithLifecycle() + val allowDisposedExceptions by viewModel.allowDisposedExceptions + .collectAsStateWithLifecycle() + val showOriginalTimeAgo by viewModel.showOriginalTimeAgo.collectAsStateWithLifecycle() + val showCrashThePlayer by viewModel.showCrashThePlayer.collectAsStateWithLifecycle() + val leakCanaryAvailable = remember { debugActions.isLeakCanaryAvailable } + + DebugSettingsScreenContent( + allowHeapDumping = allowHeapDumping, + allowDisposedExceptions = allowDisposedExceptions, + showOriginalTimeAgo = showOriginalTimeAgo, + showCrashThePlayer = showCrashThePlayer, + leakCanaryAvailable = leakCanaryAvailable, + onAllowHeapDumpingChange = viewModel::setAllowHeapDumping, + onAllowDisposedExceptionsChange = viewModel::setAllowDisposedExceptions, + onShowOriginalTimeAgoChange = viewModel::setShowOriginalTimeAgo, + onShowCrashThePlayerChange = viewModel::setShowCrashThePlayer, + onShowMemoryLeaks = debugActions::showMemoryLeaks, + onCheckNewStreams = debugActions::checkNewStreams, + onCrashTheApp = { throw RuntimeException(DUMMY) }, + onReportDummyError = debugActions::reportDummyError, + onCreateErrorNotification = debugActions::createErrorNotification, + onNavigateUp = { navigator.navigateUp() } + ) +} + +@Composable +fun DebugSettingsScreenContent( + allowHeapDumping: Boolean = DEFAULT_ALLOW_HEAP_DUMPING, + allowDisposedExceptions: Boolean = DEFAULT_ALLOW_DISPOSED_EXCEPTIONS, + showOriginalTimeAgo: Boolean = DEFAULT_SHOW_ORIGINAL_TIME_AGO, + showCrashThePlayer: Boolean = DEFAULT_SHOW_CRASH_THE_PLAYER, + leakCanaryAvailable: Boolean = true, + onAllowHeapDumpingChange: (Boolean) -> Unit = {}, + onAllowDisposedExceptionsChange: (Boolean) -> Unit = {}, + onShowOriginalTimeAgoChange: (Boolean) -> Unit = {}, + onShowCrashThePlayerChange: (Boolean) -> Unit = {}, + onShowMemoryLeaks: () -> Unit = {}, + onCheckNewStreams: () -> Unit = {}, + onCrashTheApp: () -> Unit = {}, + onReportDummyError: () -> Unit = {}, + onCreateErrorNotification: () -> Unit = {}, + onNavigateUp: () -> Unit = {} +) { + val scope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } + + val heapDumpingSummary = stringResource(Res.string.enable_leak_canary_summary) + val notAvailableSummary = stringResource(Res.string.leak_canary_not_available) + val errorMessage = stringResource(Res.string.error_snackbar_message) + val reportLabel = stringResource(Res.string.error_snackbar_action) + + Scaffold( + topBar = { + TopAppBar( + title = stringResource(Res.string.settings_category_debug_title), + onNavigateUp = onNavigateUp + ) + }, + snackbarHost = { SnackbarHost(snackbarHostState) } + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(top = paddingValues.calculateTopPadding()) + .verticalScroll(rememberScrollState()) + .padding(WindowInsets.navigationBars.asPaddingValues()) + ) { + SwitchPreference( + title = stringResource(Res.string.leakcanary), + summary = if (leakCanaryAvailable) heapDumpingSummary else notAvailableSummary, + checked = allowHeapDumping, + onCheckedChange = onAllowHeapDumpingChange, + enabled = leakCanaryAvailable + ) + PreferenceRow( + title = stringResource(Res.string.show_memory_leaks), + summary = if (leakCanaryAvailable) null else notAvailableSummary, + enabled = leakCanaryAvailable, + onClick = onShowMemoryLeaks + ) + SwitchPreference( + title = stringResource(Res.string.enable_disposed_exceptions_title), + summary = stringResource(Res.string.enable_disposed_exceptions_summary), + checked = allowDisposedExceptions, + onCheckedChange = onAllowDisposedExceptionsChange + ) + SwitchPreference( + title = stringResource(Res.string.show_original_time_ago_title), + summary = stringResource(Res.string.show_original_time_ago_summary), + checked = showOriginalTimeAgo, + onCheckedChange = onShowOriginalTimeAgoChange + ) + SwitchPreference( + title = stringResource(Res.string.show_crash_the_player_title), + summary = stringResource(Res.string.show_crash_the_player_summary), + checked = showCrashThePlayer, + onCheckedChange = onShowCrashThePlayerChange + ) + PreferenceRow( + title = stringResource(Res.string.check_new_streams), + onClick = onCheckNewStreams + ) + PreferenceRow( + title = stringResource(Res.string.crash_the_app), + onClick = onCrashTheApp + ) + PreferenceRow( + title = stringResource(Res.string.show_error_snackbar), + onClick = { + scope.launch { + val result = snackbarHostState.showSnackbar( + message = errorMessage, + actionLabel = reportLabel + ) + if (result == SnackbarResult.ActionPerformed) { + onReportDummyError() + } + } + } + ) + PreferenceRow( + title = stringResource(Res.string.create_error_notification), + onClick = onCreateErrorNotification + ) + } + } +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun DebugSettingsScreenPreview() { + DebugSettingsScreenContent() +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DebugSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DebugSettingsViewModel.kt new file mode 100644 index 000000000..271996d3c --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DebugSettingsViewModel.kt @@ -0,0 +1,60 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.viewmodel.settings + +import androidx.lifecycle.ViewModel +import com.russhwolf.settings.Settings +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import net.newpipe.app.preferences.DebugPreferences.DEFAULT_ALLOW_DISPOSED_EXCEPTIONS +import net.newpipe.app.preferences.DebugPreferences.DEFAULT_ALLOW_HEAP_DUMPING +import net.newpipe.app.preferences.DebugPreferences.DEFAULT_SHOW_CRASH_THE_PLAYER +import net.newpipe.app.preferences.DebugPreferences.DEFAULT_SHOW_ORIGINAL_TIME_AGO +import net.newpipe.app.preferences.DebugPreferences.KEY_ALLOW_DISPOSED_EXCEPTIONS +import net.newpipe.app.preferences.DebugPreferences.KEY_ALLOW_HEAP_DUMPING +import net.newpipe.app.preferences.DebugPreferences.KEY_SHOW_CRASH_THE_PLAYER +import net.newpipe.app.preferences.DebugPreferences.KEY_SHOW_ORIGINAL_TIME_AGO +import org.koin.core.annotation.KoinViewModel + +@KoinViewModel +class DebugSettingsViewModel(private val settings: Settings) : ViewModel() { + + val allowHeapDumping: StateFlow + field = booleanFlow(KEY_ALLOW_HEAP_DUMPING, DEFAULT_ALLOW_HEAP_DUMPING) + + val allowDisposedExceptions: StateFlow + field = booleanFlow(KEY_ALLOW_DISPOSED_EXCEPTIONS, DEFAULT_ALLOW_DISPOSED_EXCEPTIONS) + + val showOriginalTimeAgo: StateFlow + field = booleanFlow(KEY_SHOW_ORIGINAL_TIME_AGO, DEFAULT_SHOW_ORIGINAL_TIME_AGO) + + val showCrashThePlayer: StateFlow + field = booleanFlow(KEY_SHOW_CRASH_THE_PLAYER, DEFAULT_SHOW_CRASH_THE_PLAYER) + + /** + * LeakCanary reads this flag once, when the app starts, so the change only takes effect after + * a restart. + */ + fun setAllowHeapDumping(value: Boolean) = allowHeapDumping + .persist(KEY_ALLOW_HEAP_DUMPING, value) + + fun setAllowDisposedExceptions(value: Boolean) = allowDisposedExceptions + .persist(KEY_ALLOW_DISPOSED_EXCEPTIONS, value) + + fun setShowOriginalTimeAgo(value: Boolean) = showOriginalTimeAgo + .persist(KEY_SHOW_ORIGINAL_TIME_AGO, value) + + fun setShowCrashThePlayer(value: Boolean) = showCrashThePlayer + .persist(KEY_SHOW_CRASH_THE_PLAYER, value) + + private fun booleanFlow(key: String, defaultValue: Boolean) = + MutableStateFlow(settings.getBoolean(key, defaultValue)) + + private fun MutableStateFlow.persist(key: String, newValue: Boolean) { + settings.putBoolean(key, newValue) + value = newValue + } +} From c025a552d0d41c0025c1a4f2340adef60c3bec84 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Thu, 8 Oct 2026 11:24:53 -0700 Subject: [PATCH 105/155] --amend --- .../settings/{DebigSettingsScreen.kt => DebugSettingsScreen.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/{DebigSettingsScreen.kt => DebugSettingsScreen.kt} (100%) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebigSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreen.kt similarity index 100% rename from shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebigSettingsScreen.kt rename to shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreen.kt From b0ee727297b9676a66283d814572db038ba596bc Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Thu, 8 Oct 2026 11:30:04 -0700 Subject: [PATCH 106/155] setup settings debug navigation --- .../kotlin/net/newpipe/app/navigation/Destination.kt | 3 +++ .../kotlin/net/newpipe/app/navigation/NavModule.kt | 5 +++++ .../net/newpipe/app/screen/settings/SettingsHomeScreen.kt | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt index f7a33b8f8..47868c170 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt @@ -14,6 +14,9 @@ import kotlinx.serialization.Serializable @Serializable sealed interface Destination : NavKey { + @Serializable + data object DebugSettings : Destination + @Serializable data object PlayerSettings : Destination diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt index 267befd74..da9648b88 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt @@ -9,6 +9,7 @@ import androidx.compose.runtime.mutableStateListOf import co.touchlab.kermit.Logger import net.newpipe.app.screen.about.AboutScreen import net.newpipe.app.screen.settings.AppearanceSettingsScreen +import net.newpipe.app.screen.settings.DebugSettingsScreen import net.newpipe.app.screen.settings.PlayerSettingsScreen import net.newpipe.app.screen.settings.SettingsHomeScreen import net.newpipe.app.screen.settings.VideoAudioSettingsScreen @@ -47,6 +48,10 @@ fun navModule() = module { navigation { PlayerSettingsScreen() } + + navigation { + DebugSettingsScreen() + } } /** diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt index 8385bce60..7df1903f4 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt @@ -60,6 +60,10 @@ fun SettingsHomeScreen( Destination.VideoAudioSettings ) + SettingsCategoryType.DEBUG -> navigator.navigateTo( + Destination.DebugSettings + ) + // TODO: wire remaining sub-screens as they are migrated else -> Unit } From 040f454568a2ff9b8b8cbd7eb3708c26c426f2b1 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 9 Oct 2026 03:31:26 -0700 Subject: [PATCH 107/155] add debug settings test --- .../newpipe/settings/ComposeDebugActions.kt | 7 -- .../net/newpipe/app/platform/DebugActions.kt | 3 +- .../app/composable/PreferenceRowTest.kt | 13 +++ .../settings/DebugSettingsScreenTest.kt | 96 +++++++++++++++++++ 4 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreenTest.kt diff --git a/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt b/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt index 7c415e4ef..14177e67a 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt @@ -34,13 +34,6 @@ class ComposeDebugActions(private val context: Context) : DebugActions { private fun dummyErrorInfo() = ErrorInfo(RuntimeException(DUMMY), UserAction.UI_ERROR, DUMMY) - /** - * LeakCanary only ships in debug builds, so it is reached through the build-variant dependent - * bridge the legacy debug settings fragment already defines. - * - * TODO: move [DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI] out of the fragment when - * the legacy debug settings fragment is deleted. - */ private fun loadLeakCanary(): DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI? = runCatching { Class.forName(DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI.IMPL_CLASS) .getDeclaredConstructor() diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt b/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt index 8f4e01739..1c3fcec52 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/platform/DebugActions.kt @@ -43,5 +43,6 @@ internal object NoOpDebugActions : DebugActions { override fun reportDummyError() = logUnsupported("reportDummyError") - private fun logUnsupported(action: String) = Logger.w(messageString = "Debug action '$action' is unsupported on this platform") + private fun logUnsupported(action: String) = + Logger.w(messageString = "Debug action '$action' is unsupported on this platform") } diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/composable/PreferenceRowTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/composable/PreferenceRowTest.kt index 0746d7ad6..930545fe9 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/composable/PreferenceRowTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/composable/PreferenceRowTest.kt @@ -11,6 +11,7 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.v2.runComposeUiTest import kotlin.test.Test +import kotlin.test.assertFalse import kotlin.test.assertTrue @OptIn(ExperimentalTestApi::class) @@ -45,4 +46,16 @@ class PreferenceRowTest { onNodeWithText(title).assertIsDisplayed() onNodeWithText(summary).assertIsDisplayed() } + + @Test + fun disabledRowDoesNotFire() = runComposeUiTest { + val title = "Test title" + var fired = false + setContent { + PreferenceRow(title = title, enabled = false, onClick = { fired = true }) + } + + onNodeWithText(title).performClick() + assertFalse(fired) + } } diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreenTest.kt new file mode 100644 index 000000000..5cf313f79 --- /dev/null +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreenTest.kt @@ -0,0 +1,96 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.screen.settings + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.v2.runComposeUiTest +import com.russhwolf.settings.MapSettings +import com.russhwolf.settings.Settings +import kotlin.test.Test +import kotlin.test.assertFalse +import kotlin.test.assertTrue +import net.newpipe.app.extensions.withKoin +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.check_new_streams +import newpipe.shared.generated.resources.enable_leak_canary_summary +import newpipe.shared.generated.resources.leak_canary_not_available +import newpipe.shared.generated.resources.leakcanary +import newpipe.shared.generated.resources.settings_category_debug_title +import newpipe.shared.generated.resources.show_memory_leaks +import org.jetbrains.compose.resources.getString +import org.koin.dsl.module + +@OptIn(ExperimentalTestApi::class) +class DebugSettingsScreenTest { + + private val emptySettings = module { + single { MapSettings() } + } + + @Test + fun rendersTitleAndLeakCanaryRow() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { DebugSettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.settings_category_debug_title)) + .assertIsDisplayed() + onNodeWithText(getString(Res.string.leakcanary)).assertIsDisplayed() + } + ) + } + + @Test + fun leakCanaryRowsExplainWhyTheyAreDisabled() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { DebugSettingsScreenContent(leakCanaryAvailable = false) }, + onContent = { + onNodeWithText(getString(Res.string.leak_canary_not_available)) + .assertIsDisplayed() + onNodeWithText(getString(Res.string.enable_leak_canary_summary)) + .assertDoesNotExist() + } + ) + } + + @Test + fun memoryLeaksRowDoesNotFireWhenLeakCanaryIsMissing() = runComposeUiTest { + var clicked = false + withKoin( + modules = listOf(emptySettings), + content = { + DebugSettingsScreenContent( + leakCanaryAvailable = false, + onShowMemoryLeaks = { clicked = true } + ) + }, + onContent = { + onNodeWithText(getString(Res.string.show_memory_leaks)).performClick() + assertFalse(clicked) + } + ) + } + + @Test + fun checkNewStreamsRowFiresItsAction() = runComposeUiTest { + var clicked = false + withKoin( + modules = listOf(emptySettings), + content = { DebugSettingsScreenContent(onCheckNewStreams = { clicked = true }) }, + onContent = { + onNodeWithText(getString(Res.string.check_new_streams)) + .performScrollTo() + .performClick() + assertTrue(clicked) + } + ) + } +} From 31b7fb70d30d13c6253cbcce5a4374a3d41040c5 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Sat, 10 Oct 2026 00:09:35 -0700 Subject: [PATCH 108/155] code refactor # Conflicts: # gradle/libs.versions.toml --- app/build.gradle.kts | 1 + .../newpipe/settings/ComposeDebugActions.kt | 13 +++++- gradle/libs.versions.toml | 40 ++++++++++--------- .../app/composable/SwitchPreference.kt | 31 ++++++++++---- .../app/preferences/DebugPreferences.kt | 2 +- .../screen/settings/DebugSettingsScreen.kt | 7 +++- 6 files changed, 62 insertions(+), 32 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9f5d4038f..d9e1e1b8c 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -226,6 +226,7 @@ dependencies { // Checkstyle checkstyle(libs.puppycrawl.checkstyle) + debugImplementation(libs.leakcanary) ktlint(libs.pinterest.ktlint) // AndroidX diff --git a/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt b/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt index 14177e67a..bfc0c9d8d 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/ComposeDebugActions.kt @@ -1,3 +1,8 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + package org.schabi.newpipe.settings import android.content.Context @@ -32,7 +37,11 @@ class ComposeDebugActions(private val context: Context) : DebugActions { override fun reportDummyError() = ErrorUtil.openActivity(context, dummyErrorInfo()) - private fun dummyErrorInfo() = ErrorInfo(RuntimeException(DUMMY), UserAction.UI_ERROR, DUMMY) + private fun dummyErrorInfo() = ErrorInfo( + RuntimeException(DUMMY_EXCEPTION_TEXT), + UserAction.UI_ERROR, + DUMMY_EXCEPTION_TEXT + ) private fun loadLeakCanary(): DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI? = runCatching { Class.forName(DebugSettingsFragment.DebugSettingsBVDLeakCanaryAPI.IMPL_CLASS) @@ -41,6 +50,6 @@ class ComposeDebugActions(private val context: Context) : DebugActions { }.getOrNull() private companion object { - const val DUMMY = "Dummy" + const val DUMMY_EXCEPTION_TEXT = "Dummy" } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9c07145c1..e7a795d2d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,10 +4,10 @@ # [versions] -about-libraries = "15.2.0" -acra = "5.14.2" +about-libraries = "15.1.1" +acra = "5.13.1" activity = "1.13.0" -agp = "9.4.1" +agp = "9.3.1" appcompat = "1.8.0" assertj = "3.27.7" autoservice-google = "1.1.1" @@ -16,27 +16,27 @@ bridge = "v2.0.2" browser = "1.10.0" cardview = "1.0.0" checkstyle = "13.8.0" # See https://github.com/checkstyle/checkstyle/issues/21175 -coil = "3.6.3" -compose = "1.12.1" +coil = "3.5.0" +compose = "1.12.0" constraintlayout = "2.2.2" -core = "1.19.1" +core = "1.19.0" coroutines = "1.11.0" desugar = "2.1.5" documentfile = "1.1.0" espresso = "3.7.0" exoplayer = "2.19.1" -fragment = "1.9.1" +fragment = "1.9.0" groupie = "2.10.1" -jsoup = "1.23.2" +jsoup = "1.23.1" junit = "4.13.2" junit-ext = "1.3.0" -kermit = "2.2.0" +kermit = "2.1.0" koin = "4.2.2" -koin-plugin = "1.2.1" -kotlin = "2.4.21" +koin-plugin = "1.1.0" +kotlin = "2.4.10" kotlinx-coroutines-rx3 = "1.11.0" kotlinx-serialization-json = "1.11.0" -ksp = "2.3.12" +ksp = "2.3.11" ktlint = "1.8.0" leakcanary = "2.14" lifecycle = "2.11.0" @@ -45,21 +45,21 @@ markwon = "4.6.2" material = "1.11.0" # TODO: update to newer version after bug is fixed. See https://github.com/TeamNewPipe/NewPipe/pull/13018 material3 = "1.11.0-alpha07" media = "1.7.1" -mockitoCore = "5.24.0" -multiplatform = "1.12.1" -navigation3 = "1.1.2" +mockitoCore = "5.23.0" +multiplatform = "1.11.1" +navigation3 = "1.1.1" okhttp = "5.5.0" phoenix = "3.0.0" preference = "1.2.1" prettytime = "5.0.8.Final" recyclerview = "1.4.0" -room = "2.8.5" # Needs migration to 3.x, may as well be moved to shared +room = "2.8.4" runner = "1.7.0" rxandroid = "3.0.2" rxbinding = "4.0.0" rxjava = "3.1.12" settings = "1.3.0" -sonarqube = "7.5.0.8588" +sonarqube = "7.4.0.8496" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" swiperefreshlayout = "1.2.0" @@ -73,10 +73,11 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "3313901108f0f52df68c28a04d88c2891f9c400b" +teamnewpipe-newpipe-extractor = "65cabc2ba5216ee871ace4a9963c08bdbf5d5dc0" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 -work = "2.11.2" # New versions require minSdk 24 +work = "2.11.2" +leakcanaryVersion = "1.0.0" [libraries] acra-core = { module = "ch.acra:acra-core", version.ref = "acra" } @@ -171,6 +172,7 @@ squareup-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhtt squareup-okhttp-brotli = { module = "com.squareup.okhttp3:okhttp-brotli", version.ref = "okhttp" } touchlab-kermit = { module = "co.touchlab:kermit", version.ref = "kermit" } zacsweers-autoservice-compiler = { module = "dev.zacsweers.autoservice:auto-service-ksp", version.ref = "autoservice-zacsweers" } +leakcanary = { group = "com.android.tools.studio.leakcanary", name = "leakcanary", version.ref = "leakcanaryVersion" } [plugins] about-libraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "about-libraries" } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt index 51c851fde..f252567f3 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt @@ -5,19 +5,25 @@ package net.newpipe.app.composable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.selection.toggleable import androidx.compose.material3.ListItem import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.semantics.Role +import androidx.compose.ui.semantics.semantics import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.compose.ui.unit.dp import net.newpipe.app.preview.ThemePreviewProvider private const val DISABLED_ALPHA = 0.38f +private val TRAILING_CONTENT_END_PADDING = 16.dp /** * A preference row with a trailing switch, mirroring AndroidX SwitchPreferenceCompat. @@ -38,7 +44,7 @@ fun SwitchPreference( summary: String? = null, enabled: Boolean = true ) { - ListItem( + Row( modifier = modifier .alpha(if (enabled) 1f else DISABLED_ALPHA) .toggleable( @@ -46,13 +52,22 @@ fun SwitchPreference( enabled = enabled, role = Role.Switch, onValueChange = onCheckedChange - ), - headlineContent = { Text(text = title) }, - supportingContent = summary?.let { text -> { Text(text = text) } }, - trailingContent = { - Switch(checked = checked, onCheckedChange = null, enabled = enabled) - } - ) + ) + .semantics(mergeDescendants = true) {}, + verticalAlignment = Alignment.CenterVertically + ) { + ListItem( + modifier = Modifier.weight(1f), + headlineContent = { Text(text = title) }, + supportingContent = summary?.let { text -> { Text(text = text) } } + ) + Switch( + modifier = Modifier.padding(end = TRAILING_CONTENT_END_PADDING), + checked = checked, + onCheckedChange = null, + enabled = enabled + ) + } } @PreviewWrapper(ThemePreviewProvider::class) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DebugPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DebugPreferences.kt index e528e8176..545915721 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DebugPreferences.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DebugPreferences.kt @@ -19,4 +19,4 @@ object DebugPreferences { const val DEFAULT_ALLOW_DISPOSED_EXCEPTIONS = false const val DEFAULT_SHOW_ORIGINAL_TIME_AGO = false const val DEFAULT_SHOW_CRASH_THE_PLAYER = false -} \ No newline at end of file +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreen.kt index b3bbf18e6..c7666832c 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreen.kt @@ -8,6 +8,7 @@ package net.newpipe.app.screen.settings import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding @@ -21,6 +22,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewWrapper @@ -59,7 +61,7 @@ import org.jetbrains.compose.resources.stringResource import org.koin.compose.koinInject import org.koin.compose.viewmodel.koinViewModel -private const val DUMMY = "Dummy" +private const val DUMMY_EXCEPTION_TEXT = "Dummy" @Composable fun DebugSettingsScreen( @@ -86,7 +88,7 @@ fun DebugSettingsScreen( onShowCrashThePlayerChange = viewModel::setShowCrashThePlayer, onShowMemoryLeaks = debugActions::showMemoryLeaks, onCheckNewStreams = debugActions::checkNewStreams, - onCrashTheApp = { throw RuntimeException(DUMMY) }, + onCrashTheApp = { throw RuntimeException(DUMMY_EXCEPTION_TEXT) }, onReportDummyError = debugActions::reportDummyError, onCreateErrorNotification = debugActions::createErrorNotification, onNavigateUp = { navigator.navigateUp() } @@ -134,6 +136,7 @@ fun DebugSettingsScreenContent( .padding(top = paddingValues.calculateTopPadding()) .verticalScroll(rememberScrollState()) .padding(WindowInsets.navigationBars.asPaddingValues()) + .fillMaxHeight(), ) { SwitchPreference( title = stringResource(Res.string.leakcanary), From 32eb85d0fb09ef9022421751fd96bee564b9223b Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Sat, 17 Oct 2026 12:51:07 -0700 Subject: [PATCH 109/155] fix ci issues --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e7a795d2d..07a80eb7a 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,6 +39,7 @@ kotlinx-serialization-json = "1.11.0" ksp = "2.3.11" ktlint = "1.8.0" leakcanary = "2.14" +leakcanaryVersion = "1.0.0" lifecycle = "2.11.0" localbroadcastmanager = "1.1.0" markwon = "4.6.2" @@ -77,7 +78,6 @@ teamnewpipe-newpipe-extractor = "65cabc2ba5216ee871ace4a9963c08bdbf5d5dc0" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" -leakcanaryVersion = "1.0.0" [libraries] acra-core = { module = "ch.acra:acra-core", version.ref = "acra" } @@ -149,6 +149,7 @@ koin-compose-viewmodel = { module = "io.insert-koin:koin-compose-viewmodel", ver kotlin-test-core = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlinx-coroutines-rx3 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-rx3", version.ref = "kotlinx-coroutines-rx3" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" } +leakcanary = { group = "com.android.tools.studio.leakcanary", name = "leakcanary", version.ref = "leakcanaryVersion" } lisawray-groupie-core = { module = "com.github.lisawray.groupie:groupie", version.ref = "groupie" } lisawray-groupie-viewbinding = { module = "com.github.lisawray.groupie:groupie-viewbinding", version.ref = "groupie" } livefront-bridge = { module = "com.github.livefront:bridge", version.ref = "bridge" } @@ -172,7 +173,6 @@ squareup-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhtt squareup-okhttp-brotli = { module = "com.squareup.okhttp3:okhttp-brotli", version.ref = "okhttp" } touchlab-kermit = { module = "co.touchlab:kermit", version.ref = "kermit" } zacsweers-autoservice-compiler = { module = "dev.zacsweers.autoservice:auto-service-ksp", version.ref = "autoservice-zacsweers" } -leakcanary = { group = "com.android.tools.studio.leakcanary", name = "leakcanary", version.ref = "leakcanaryVersion" } [plugins] about-libraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "about-libraries" } From 204f33ea4a5d222ea79a8dbab305ac8dea5d9d08 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Sat, 17 Oct 2026 20:58:17 -0700 Subject: [PATCH 110/155] add download preferences --- .../app/preferences/DownloadPreferences.kt | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/preferences/DownloadPreferences.kt diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DownloadPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DownloadPreferences.kt new file mode 100644 index 000000000..f3df088d9 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/DownloadPreferences.kt @@ -0,0 +1,48 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.preferences + +/** + * Preference keys, values, and defaults for the Download settings screen. + * + */ +object DownloadPreferences { + const val KEY_STORAGE_ASK = "downloads_storage_ask" + const val KEY_STORAGE_USE_SAF = "storage_use_saf" + const val KEY_DOWNLOAD_FOLDER_VIDEO = "download_path" + const val KEY_DOWNLOAD_FOLDER_AUDIO = "download_path_audio" + const val KEY_FILE_CHARSET = "file_rename_charset" + const val KEY_REPLACEMENT_CHARACTER = "file_replacement_character" + const val KEY_MAXIMUM_RETRIES = "downloads_max_retry" + const val KEY_PAUSE_ON_METERED_NETWORK = "cross_network_downloads" + const val KEY_LIMIT_QUEUE = "downloads_queue_limit" + + const val CHARSET_LETTERS_AND_DIGITS = "CHARSET_LETTERS_AND_DIGITS" + const val CHARSET_MOST_SPECIAL = "CHARSET_MOST_SPECIAL" + + const val DEFAULT_STORAGE_ASK = false + const val DEFAULT_STORAGE_USE_SAF = true + + const val DEFAULT_DOWNLOAD_FOLDER = "" + const val DEFAULT_FILE_CHARSET = CHARSET_MOST_SPECIAL + const val DEFAULT_REPLACEMENT_CHARACTER = "_" + const val DEFAULT_MAXIMUM_RETRIES = "3" + const val DEFAULT_PAUSE_ON_METERED_NETWORK = false + const val DEFAULT_LIMIT_QUEUE = true + + val FILE_CHARSETS = listOf(CHARSET_LETTERS_AND_DIGITS, CHARSET_MOST_SPECIAL) + + const val MAXIMUM_RETRIES_NONE = "0" + + val MAXIMUM_RETRY_COUNTS = listOf( + MAXIMUM_RETRIES_NONE, "1", "2", "3", "4", "5", "7", "10", "15" + ) + + fun normalizedMaximumRetries(storedValue: String): String = when (storedValue.toIntOrNull()) { + null -> MAXIMUM_RETRIES_NONE + else -> storedValue + } +} From 7b723828cd6b070318169d2aa678e960977877f2 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Sun, 18 Oct 2026 01:57:50 -0700 Subject: [PATCH 111/155] add download storage actions --- .../settings/ComposeDownloadStorage.kt | 59 +++++++++ .../platform/AndroidDownloadStorageActions.kt | 117 ++++++++++++++++++ .../app/platform/DownloadStorageHost.kt | 21 ++++ .../app/platform/DownloadStorageActions.kt | 43 +++++++ .../app/platform/IOSDownloadStorageActions.kt | 26 ++++ .../app/platform/JVMDownloadStorageActions.kt | 26 ++++ 6 files changed, 292 insertions(+) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/ComposeDownloadStorage.kt create mode 100644 shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt create mode 100644 shared/src/androidMain/kotlin/net/newpipe/app/platform/DownloadStorageHost.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/platform/DownloadStorageActions.kt create mode 100644 shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSDownloadStorageActions.kt create mode 100644 shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMDownloadStorageActions.kt diff --git a/app/src/main/java/org/schabi/newpipe/settings/ComposeDownloadStorage.kt b/app/src/main/java/org/schabi/newpipe/settings/ComposeDownloadStorage.kt new file mode 100644 index 000000000..b9d1ad87f --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/ComposeDownloadStorage.kt @@ -0,0 +1,59 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package org.schabi.newpipe.settings + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.util.Log +import com.nononsenseapps.filepicker.Utils +import java.io.IOException +import net.newpipe.app.platform.DownloadFolderError +import net.newpipe.app.platform.DownloadStorageHost +import net.newpipe.app.platform.FolderPickResult +import org.schabi.newpipe.streams.io.StoredDirectoryHelper +import org.schabi.newpipe.util.FilePickerActivityHelper + +/** + * Host-side storage handling for the Compose download settings screen + */ +class ComposeDownloadStorage(private val context: Context) : DownloadStorageHost { + + override val useStorageAccessFramework: Boolean + get() = NewPipeSettings.useStorageAccessFramework(context) + + override fun createFolderPickerIntent(): Intent = StoredDirectoryHelper.getPicker(context) + + override fun acquireFolder(folder: Uri): FolderPickResult { + if (FilePickerActivityHelper.isOwnFileUri(context, folder)) { + val target = Utils.getFileForUri(folder) + return when { + target.canWrite() -> FolderPickResult.Picked(Uri.fromFile(target).toString()) + else -> FolderPickResult.Failed(DownloadFolderError.EXTERNAL_STORAGE_UNAVAILABLE) + } + } + + return try { + context.grantUriPermission( + context.packageName, + folder, + StoredDirectoryHelper.PERMISSION_FLAGS + ) + if (!StoredDirectoryHelper(context, folder, null).canWrite()) { + throw IOException("No write permissions on $folder") + } + Log.i(TAG, "Acquiring tree success from $folder") + FolderPickResult.Picked(folder.toString()) + } catch (error: IOException) { + Log.e(TAG, "Error acquiring tree from $folder", error) + FolderPickResult.Failed(DownloadFolderError.NOT_WRITABLE) + } + } + + private companion object { + const val TAG = "ComposeDownloadStorage" + } +} diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt new file mode 100644 index 000000000..b7b59d476 --- /dev/null +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt @@ -0,0 +1,117 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.ContentResolver +import android.content.Context +import android.net.Uri +import android.os.Build +import android.os.Environment +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberUpdatedState +import androidx.core.net.toUri +import co.touchlab.kermit.Logger +import java.io.File +import org.koin.core.annotation.Singleton + +@Singleton(binds = [DownloadStorageActions::class]) +class AndroidDownloadStorageActions(context: Context) : DownloadStorageActions { + + private val host: DownloadStorageHost? = loadHost(context) + + override val isAvailable: Boolean + get() = host != null + + override val useStorageAccessFramework: Boolean + get() = host?.useStorageAccessFramework ?: true + + override val isStorageAccessFrameworkConfigurable: Boolean + get() = Build.VERSION.SDK_INT < Build.VERSION_CODES.Q + + override fun defaultDownloadFolders() = DownloadFolders( + video = newPipeFolderIn(Environment.DIRECTORY_MOVIES), + audio = newPipeFolderIn(Environment.DIRECTORY_MUSIC) + ) + + override fun displayFolder(storedValue: String): String? { + val folder = storedValue.toUri() + if (folder == Uri.EMPTY) { + return null + } + // Plain file paths read better without their scheme; SAF trees have no readable path. + return when (folder.scheme) { + ContentResolver.SCHEME_FILE -> folder.path + else -> folder.toString() + } + } + + @Composable + override fun rememberFolderPicker(onResult: (FolderPickResult) -> Unit): () -> Unit { + // The screen passes a fresh lambda on every recomposition, so read it through a state + // holder instead of capturing the first one inside remember below. + val currentOnResult by rememberUpdatedState(onResult) + + val launcher = rememberLauncherForActivityResult(StartActivityForResult()) { result -> + if (result.resultCode != Activity.RESULT_OK) { + // The user backed out of the picker; the legacy screen stays silent too. + return@rememberLauncherForActivityResult + } + val folder = result.data?.data + val bridge = host + currentOnResult( + when { + folder == null || bridge == null -> + FolderPickResult.Failed(DownloadFolderError.INVALID_DIRECTORY) + + else -> bridge.acquireFolder(folder) + } + ) + } + + return remember(launcher) { + { + val bridge = host + if (bridge != null) { + try { + launcher.launch(bridge.createFolderPickerIntent()) + } catch (exception: ActivityNotFoundException) { + Logger.w( + messageString = "Unable to launch the download folder picker", + throwable = exception + ) + currentOnResult( + FolderPickResult.Failed(DownloadFolderError.NO_FILE_MANAGER) + ) + } + } + } + } + } + + private fun newPipeFolderIn(directoryName: String): String = File(File(Environment.getExternalStorageDirectory(), directoryName), NEWPIPE_FOLDER) + .toURI() + .toString() + + private fun loadHost(context: Context): DownloadStorageHost? = runCatching { + Class.forName(HOST_CLASS) + .getDeclaredConstructor(Context::class.java) + .newInstance(context) as DownloadStorageHost + }.getOrElse { error -> + Logger.w(messageString = "No host download storage found", throwable = error) + null + } + + private companion object { + const val HOST_CLASS = "org.schabi.newpipe.settings.ComposeDownloadStorage" + const val NEWPIPE_FOLDER = "NewPipe" + } +} diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/DownloadStorageHost.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/DownloadStorageHost.kt new file mode 100644 index 000000000..c30db5454 --- /dev/null +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/DownloadStorageHost.kt @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import android.content.Intent +import android.net.Uri + +/** + * Hooks into the storage helpers that still live in the current Android app + */ +interface DownloadStorageHost { + + val useStorageAccessFramework: Boolean + + fun createFolderPickerIntent(): Intent + + fun acquireFolder(folder: Uri): FolderPickResult +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/platform/DownloadStorageActions.kt b/shared/src/commonMain/kotlin/net/newpipe/app/platform/DownloadStorageActions.kt new file mode 100644 index 000000000..b7aa92515 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/platform/DownloadStorageActions.kt @@ -0,0 +1,43 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import androidx.compose.runtime.Composable + +data class DownloadFolders(val video: String, val audio: String) + +enum class DownloadFolderError { + NO_FILE_MANAGER, + INVALID_DIRECTORY, + NOT_WRITABLE, + EXTERNAL_STORAGE_UNAVAILABLE +} + +sealed interface FolderPickResult { + + data class Picked(val folder: String) : FolderPickResult + + data class Failed(val error: DownloadFolderError) : FolderPickResult +} + +/** + * Platform-specific storage handling for the Download settings screen. + */ +interface DownloadStorageActions { + + val isAvailable: Boolean + + val useStorageAccessFramework: Boolean + + val isStorageAccessFrameworkConfigurable: Boolean + + fun defaultDownloadFolders(): DownloadFolders + + fun displayFolder(storedValue: String): String? + + @Composable + fun rememberFolderPicker(onResult: (FolderPickResult) -> Unit): () -> Unit +} diff --git a/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSDownloadStorageActions.kt b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSDownloadStorageActions.kt new file mode 100644 index 000000000..96bc373a3 --- /dev/null +++ b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSDownloadStorageActions.kt @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import androidx.compose.runtime.Composable +import org.koin.core.annotation.Singleton + +@Singleton(binds = [DownloadStorageActions::class]) +class IOSDownloadStorageActions : DownloadStorageActions { + + override val isAvailable = false + + override val useStorageAccessFramework = false + + override val isStorageAccessFrameworkConfigurable = false + + override fun defaultDownloadFolders() = DownloadFolders(video = "", audio = "") + + override fun displayFolder(storedValue: String): String? = storedValue.ifEmpty { null } + + @Composable + override fun rememberFolderPicker(onResult: (FolderPickResult) -> Unit): () -> Unit = {} +} diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMDownloadStorageActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMDownloadStorageActions.kt new file mode 100644 index 000000000..c3c48aa62 --- /dev/null +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMDownloadStorageActions.kt @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import androidx.compose.runtime.Composable +import org.koin.core.annotation.Singleton + +@Singleton(binds = [DownloadStorageActions::class]) +class JVMDownloadStorageActions : DownloadStorageActions { + + override val isAvailable = false + + override val useStorageAccessFramework = false + + override val isStorageAccessFrameworkConfigurable = false + + override fun defaultDownloadFolders() = DownloadFolders(video = "", audio = "") + + override fun displayFolder(storedValue: String): String? = storedValue.ifEmpty { null } + + @Composable + override fun rememberFolderPicker(onResult: (FolderPickResult) -> Unit): () -> Unit = {} +} From 1dd61e70036c2679a65f607c6cda2e04dc0d617a Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Sun, 18 Oct 2026 02:45:45 -0700 Subject: [PATCH 112/155] add download settings ui --- .../composeResources/values/strings.xml | 35 ++ .../app/composable/EditTextPreference.kt | 115 ++++++ .../screen/settings/DownloadSettingsScreen.kt | 349 ++++++++++++++++++ .../settings/DownloadSettingsViewModel.kt | 120 ++++++ 4 files changed, 619 insertions(+) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/composable/EditTextPreference.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DownloadSettingsViewModel.kt diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml index c7fcfe638..014417a0e 100644 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ b/shared/src/commonMain/composeResources/values/strings.xml @@ -182,4 +182,39 @@ Create an error notification Sorry, something went wrong. Report + + + OK + Ask where to download + You will be asked where to save each download.\nEnable the system folder picker (SAF) if you want to download to an external SD card + You will be asked where to save each download + Use system folder picker (SAF) + The 'Storage Access Framework' allows downloads to an external SD card + Starting from Android 10 only 'Storage Access Framework' is supported + Video download folder + Downloaded video files are stored here + Audio download folder + Downloaded audio files are stored here + Allowed characters in filenames + Letters and digits + Most special characters + Replacement character + Invalid characters are replaced with this value + Maximum retries + Maximum number of attempts before canceling the download + Interrupt on metered networks + Useful when switching to mobile data, although some downloads cannot be suspended + Limit download queue + One download will run at the same time + + + Error + No such folder + Please define a download folder later in settings + External storage unavailable + Downloading to external SD card not possible. Reset download folder location? + No app on your device can open this + No appropriate file manager was found for this action.\nPlease install a file manager or try to disable '%1$s' in the download settings + No appropriate file manager was found for this action.\nPlease install a Storage Access Framework compatible file manager + diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/EditTextPreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/EditTextPreference.kt new file mode 100644 index 000000000..a1c5e2ee5 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/EditTextPreference.kt @@ -0,0 +1,115 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.composable + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.text.input.TextFieldLineLimits +import androidx.compose.foundation.text.input.rememberTextFieldState +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.ListItem +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.focus.FocusRequester +import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import net.newpipe.app.preview.ThemePreviewProvider +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.cancel +import newpipe.shared.generated.resources.ok +import org.jetbrains.compose.resources.stringResource + +private const val DISABLED_ALPHA = 0.38f + +/** + * A preference row that opens a single-line text dialog, mirroring AndroidX EditTextPreference. + * + * @param title Title text of the preference and of the dialog + * @param value Currently stored text + * @param onValueChange Called with the edited text once the dialog is confirmed + * @param modifier Modifier applied to the row + * @param summary Secondary line under the title + * @param enabled Whether the row can be opened + */ +@Composable +fun EditTextPreference( + title: String, + value: String, + onValueChange: (String) -> Unit, + modifier: Modifier = Modifier, + summary: String? = null, + enabled: Boolean = true +) { + var showDialog by remember { mutableStateOf(false) } + + ListItem( + modifier = modifier + .alpha(if (enabled) 1f else DISABLED_ALPHA) + .clickable(enabled = enabled) { showDialog = true }, + headlineContent = { Text(text = title) }, + supportingContent = summary?.let { text -> { Text(text = text) } } + ) + + if (showDialog) { + // The state lives inside the branch, so it is recreated on every opening and an edit + // that is cancelled is discarded, like the AndroidX dialog does. + val textFieldState = rememberTextFieldState(value) + val focusRequester = remember { FocusRequester() } + + LaunchedEffect(focusRequester) { focusRequester.requestFocus() } + + AlertDialog( + onDismissRequest = { showDialog = false }, + title = { Text(text = title) }, + text = { + TextField( + state = textFieldState, + modifier = Modifier + .fillMaxWidth() + .focusRequester(focusRequester), + lineLimits = TextFieldLineLimits.SingleLine + ) + }, + confirmButton = { + TextButton( + onClick = { + onValueChange(textFieldState.text.toString()) + showDialog = false + } + ) { + Text(text = stringResource(Res.string.ok)) + } + }, + dismissButton = { + TextButton(onClick = { showDialog = false }) { + Text(text = stringResource(Res.string.cancel)) + } + } + ) + } +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun EditTextPreferencePreview() { + EditTextPreference( + title = "Replacement character", + summary = "Invalid characters are replaced with this value", + value = "_", + onValueChange = {} + ) +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt new file mode 100644 index 000000000..5d75693f4 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt @@ -0,0 +1,349 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.screen.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import net.newpipe.app.composable.EditTextPreference +import net.newpipe.app.composable.ListPreference +import net.newpipe.app.composable.ListPreferenceEntry +import net.newpipe.app.composable.PreferenceRow +import net.newpipe.app.composable.SwitchPreference +import net.newpipe.app.composable.TopAppBar +import net.newpipe.app.navigation.Navigator +import net.newpipe.app.platform.DownloadFolderError +import net.newpipe.app.platform.DownloadStorageActions +import net.newpipe.app.platform.FolderPickResult +import net.newpipe.app.preferences.DownloadPreferences.CHARSET_LETTERS_AND_DIGITS +import net.newpipe.app.preferences.DownloadPreferences.CHARSET_MOST_SPECIAL +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_DOWNLOAD_FOLDER +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_FILE_CHARSET +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_LIMIT_QUEUE +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_MAXIMUM_RETRIES +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_PAUSE_ON_METERED_NETWORK +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_REPLACEMENT_CHARACTER +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_STORAGE_ASK +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_STORAGE_USE_SAF +import net.newpipe.app.preferences.DownloadPreferences.MAXIMUM_RETRY_COUNTS +import net.newpipe.app.preview.ThemePreviewProvider +import net.newpipe.app.viewmodel.settings.DownloadSettingsViewModel +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.cancel +import newpipe.shared.generated.resources.charset_letters_and_digits +import newpipe.shared.generated.resources.charset_most_special_characters +import newpipe.shared.generated.resources.download_path_audio_summary +import newpipe.shared.generated.resources.download_path_audio_title +import newpipe.shared.generated.resources.download_path_summary +import newpipe.shared.generated.resources.download_path_title +import newpipe.shared.generated.resources.download_to_sdcard_error_message +import newpipe.shared.generated.resources.download_to_sdcard_error_title +import newpipe.shared.generated.resources.downloads_storage_ask_summary +import newpipe.shared.generated.resources.downloads_storage_ask_summary_no_saf_notice +import newpipe.shared.generated.resources.downloads_storage_ask_title +import newpipe.shared.generated.resources.downloads_storage_use_saf_summary +import newpipe.shared.generated.resources.downloads_storage_use_saf_summary_api_29 +import newpipe.shared.generated.resources.downloads_storage_use_saf_title +import newpipe.shared.generated.resources.enable_queue_limit +import newpipe.shared.generated.resources.enable_queue_limit_desc +import newpipe.shared.generated.resources.general_error +import newpipe.shared.generated.resources.invalid_directory +import newpipe.shared.generated.resources.max_retry_desc +import newpipe.shared.generated.resources.max_retry_msg +import newpipe.shared.generated.resources.minimize_on_exit_none_description +import newpipe.shared.generated.resources.no_app_to_open_intent +import newpipe.shared.generated.resources.no_appropriate_file_manager_message +import newpipe.shared.generated.resources.no_appropriate_file_manager_message_android_10 +import newpipe.shared.generated.resources.no_available_dir +import newpipe.shared.generated.resources.ok +import newpipe.shared.generated.resources.pause_downloads_on_mobile +import newpipe.shared.generated.resources.pause_downloads_on_mobile_desc +import newpipe.shared.generated.resources.settings_category_downloads_title +import newpipe.shared.generated.resources.settings_file_charset_title +import newpipe.shared.generated.resources.settings_file_replacement_character_summary +import newpipe.shared.generated.resources.settings_file_replacement_character_title +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel + +@Composable +fun DownloadSettingsScreen( + navigator: Navigator = koinInject(), + viewModel: DownloadSettingsViewModel = koinViewModel(), + storage: DownloadStorageActions = koinInject() +) { + val storageAsk by viewModel.storageAsk.collectAsStateWithLifecycle() + val useStorageAccessFramework by viewModel.useStorageAccessFramework + .collectAsStateWithLifecycle() + val videoDownloadFolder by viewModel.videoDownloadFolder.collectAsStateWithLifecycle() + val audioDownloadFolder by viewModel.audioDownloadFolder.collectAsStateWithLifecycle() + val fileCharset by viewModel.fileCharset.collectAsStateWithLifecycle() + val replacementCharacter by viewModel.replacementCharacter.collectAsStateWithLifecycle() + val maximumRetries by viewModel.maximumRetries.collectAsStateWithLifecycle() + val pauseOnMeteredNetwork by viewModel.pauseOnMeteredNetwork.collectAsStateWithLifecycle() + val limitQueue by viewModel.limitQueue.collectAsStateWithLifecycle() + + val storageAvailable = remember { storage.isAvailable } + val storageAccessFrameworkConfigurable = remember { + storage.isStorageAccessFrameworkConfigurable + } + + var folderError by remember { mutableStateOf(null) } + + fun handlePick(result: FolderPickResult, onPicked: (String) -> Unit) = when (result) { + is FolderPickResult.Picked -> onPicked(result.folder) + is FolderPickResult.Failed -> folderError = result.error + } + + val pickVideoFolder = storage.rememberFolderPicker { result -> + handlePick(result, viewModel::setVideoDownloadFolder) + } + val pickAudioFolder = storage.rememberFolderPicker { result -> + handlePick(result, viewModel::setAudioDownloadFolder) + } + + DownloadSettingsScreenContent( + storageAsk = storageAsk, + useStorageAccessFramework = useStorageAccessFramework, + videoDownloadFolder = storage.displayFolder(videoDownloadFolder), + audioDownloadFolder = storage.displayFolder(audioDownloadFolder), + fileCharset = fileCharset, + replacementCharacter = replacementCharacter, + maximumRetries = maximumRetries, + pauseOnMeteredNetwork = pauseOnMeteredNetwork, + limitQueue = limitQueue, + storageAvailable = storageAvailable, + storageAccessFrameworkConfigurable = storageAccessFrameworkConfigurable, + folderError = folderError, + onStorageAskChange = viewModel::setStorageAsk, + onUseStorageAccessFrameworkChange = viewModel::setUseStorageAccessFramework, + onPickVideoFolder = pickVideoFolder, + onPickAudioFolder = pickAudioFolder, + onFileCharsetChange = viewModel::setFileCharset, + onReplacementCharacterChange = viewModel::setReplacementCharacter, + onMaximumRetriesChange = viewModel::setMaximumRetries, + onPauseOnMeteredNetworkChange = viewModel::setPauseOnMeteredNetwork, + onLimitQueueChange = viewModel::setLimitQueue, + onDismissFolderError = { folderError = null }, + onNavigateUp = { navigator.navigateUp() } + ) +} + +@Composable +fun DownloadSettingsScreenContent( + storageAsk: Boolean = DEFAULT_STORAGE_ASK, + useStorageAccessFramework: Boolean = DEFAULT_STORAGE_USE_SAF, + videoDownloadFolder: String? = null, + audioDownloadFolder: String? = null, + fileCharset: String = DEFAULT_FILE_CHARSET, + replacementCharacter: String = DEFAULT_REPLACEMENT_CHARACTER, + maximumRetries: String = DEFAULT_MAXIMUM_RETRIES, + pauseOnMeteredNetwork: Boolean = DEFAULT_PAUSE_ON_METERED_NETWORK, + limitQueue: Boolean = DEFAULT_LIMIT_QUEUE, + storageAvailable: Boolean = true, + storageAccessFrameworkConfigurable: Boolean = true, + folderError: DownloadFolderError? = null, + onStorageAskChange: (Boolean) -> Unit = {}, + onUseStorageAccessFrameworkChange: (Boolean) -> Unit = {}, + onPickVideoFolder: () -> Unit = {}, + onPickAudioFolder: () -> Unit = {}, + onFileCharsetChange: (String) -> Unit = {}, + onReplacementCharacterChange: (String) -> Unit = {}, + onMaximumRetriesChange: (String) -> Unit = {}, + onPauseOnMeteredNetworkChange: (Boolean) -> Unit = {}, + onLimitQueueChange: (Boolean) -> Unit = {}, + onDismissFolderError: () -> Unit = {}, + onNavigateUp: () -> Unit = {} +) { + val charsetEntries = listOf( + ListPreferenceEntry( + CHARSET_LETTERS_AND_DIGITS, + stringResource(Res.string.charset_letters_and_digits) + ), + ListPreferenceEntry( + CHARSET_MOST_SPECIAL, + stringResource(Res.string.charset_most_special_characters) + ) + ) + + val noRetriesLabel = stringResource(Res.string.minimize_on_exit_none_description) + val maximumRetryEntries = listOf(ListPreferenceEntry(noRetriesLabel, noRetriesLabel)) + + MAXIMUM_RETRY_COUNTS.map { count -> ListPreferenceEntry(count, count) } + + val storageAskSummary = when { + storageAccessFrameworkConfigurable -> + stringResource(Res.string.downloads_storage_ask_summary) + + else -> stringResource(Res.string.downloads_storage_ask_summary_no_saf_notice) + } + val useStorageAccessFrameworkSummary = when { + storageAccessFrameworkConfigurable -> + stringResource(Res.string.downloads_storage_use_saf_summary) + + else -> stringResource(Res.string.downloads_storage_use_saf_summary_api_29) + } + + Scaffold( + topBar = { + TopAppBar( + title = stringResource(Res.string.settings_category_downloads_title), + onNavigateUp = onNavigateUp + ) + } + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(top = paddingValues.calculateTopPadding()) + .verticalScroll(rememberScrollState()) + .padding(WindowInsets.navigationBars.asPaddingValues()) + ) { + SwitchPreference( + title = stringResource(Res.string.downloads_storage_ask_title), + summary = storageAskSummary, + checked = storageAsk, + onCheckedChange = onStorageAskChange + ) + + if (storageAvailable) { + SwitchPreference( + title = stringResource(Res.string.downloads_storage_use_saf_title), + summary = useStorageAccessFrameworkSummary, + checked = useStorageAccessFramework, + onCheckedChange = onUseStorageAccessFrameworkChange, + enabled = storageAccessFrameworkConfigurable + ) + PreferenceRow( + title = stringResource(Res.string.download_path_title), + summary = videoDownloadFolder + ?: stringResource(Res.string.download_path_summary), + enabled = !storageAsk, + onClick = onPickVideoFolder + ) + PreferenceRow( + title = stringResource(Res.string.download_path_audio_title), + summary = audioDownloadFolder + ?: stringResource(Res.string.download_path_audio_summary), + enabled = !storageAsk, + onClick = onPickAudioFolder + ) + } + + ListPreference( + title = stringResource(Res.string.settings_file_charset_title), + entries = charsetEntries, + selectedValue = fileCharset, + onValueSelected = onFileCharsetChange + ) + EditTextPreference( + title = stringResource(Res.string.settings_file_replacement_character_title), + summary = stringResource( + Res.string.settings_file_replacement_character_summary + ), + value = replacementCharacter, + onValueChange = onReplacementCharacterChange + ) + ListPreference( + title = stringResource(Res.string.max_retry_msg), + entries = maximumRetryEntries, + selectedValue = maximumRetries, + onValueSelected = onMaximumRetriesChange, + summary = stringResource(Res.string.max_retry_desc) + ) + SwitchPreference( + title = stringResource(Res.string.pause_downloads_on_mobile), + summary = stringResource(Res.string.pause_downloads_on_mobile_desc), + checked = pauseOnMeteredNetwork, + onCheckedChange = onPauseOnMeteredNetworkChange + ) + SwitchPreference( + title = stringResource(Res.string.enable_queue_limit), + summary = stringResource(Res.string.enable_queue_limit_desc), + checked = limitQueue, + onCheckedChange = onLimitQueueChange + ) + } + } + + if (folderError != null) { + DownloadFolderErrorDialog( + error = folderError, + storageAccessFrameworkConfigurable = storageAccessFrameworkConfigurable, + onDismiss = onDismissFolderError + ) + } +} + +/** + * The folder picker failures the legacy screen reports, each with its own title and message. + */ +@Composable +private fun DownloadFolderErrorDialog( + error: DownloadFolderError, + storageAccessFrameworkConfigurable: Boolean, + onDismiss: () -> Unit +) { + val safTitle = stringResource(Res.string.downloads_storage_use_saf_title) + + val title = when (error) { + DownloadFolderError.NO_FILE_MANAGER -> stringResource(Res.string.no_app_to_open_intent) + + DownloadFolderError.EXTERNAL_STORAGE_UNAVAILABLE -> + stringResource(Res.string.download_to_sdcard_error_title) + + DownloadFolderError.INVALID_DIRECTORY, + DownloadFolderError.NOT_WRITABLE -> stringResource(Res.string.general_error) + } + val message = when (error) { + DownloadFolderError.NO_FILE_MANAGER -> when { + storageAccessFrameworkConfigurable -> + stringResource(Res.string.no_appropriate_file_manager_message, safTitle) + + else -> stringResource(Res.string.no_appropriate_file_manager_message_android_10) + } + + DownloadFolderError.INVALID_DIRECTORY -> stringResource(Res.string.invalid_directory) + + DownloadFolderError.NOT_WRITABLE -> stringResource(Res.string.no_available_dir) + + DownloadFolderError.EXTERNAL_STORAGE_UNAVAILABLE -> + stringResource(Res.string.download_to_sdcard_error_message) + } + + AlertDialog( + onDismissRequest = onDismiss, + title = { Text(text = title) }, + text = { Text(text = message) }, + confirmButton = { + TextButton(onClick = onDismiss) { Text(text = stringResource(Res.string.ok)) } + } + ) +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun DownloadSettingsScreenPreview() { + DownloadSettingsScreenContent() +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DownloadSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DownloadSettingsViewModel.kt new file mode 100644 index 000000000..abd1955ba --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DownloadSettingsViewModel.kt @@ -0,0 +1,120 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.viewmodel.settings + +import androidx.lifecycle.ViewModel +import com.russhwolf.settings.Settings +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import net.newpipe.app.platform.DownloadStorageActions +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_DOWNLOAD_FOLDER +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_FILE_CHARSET +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_LIMIT_QUEUE +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_MAXIMUM_RETRIES +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_PAUSE_ON_METERED_NETWORK +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_REPLACEMENT_CHARACTER +import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_STORAGE_ASK +import net.newpipe.app.preferences.DownloadPreferences.KEY_DOWNLOAD_FOLDER_AUDIO +import net.newpipe.app.preferences.DownloadPreferences.KEY_DOWNLOAD_FOLDER_VIDEO +import net.newpipe.app.preferences.DownloadPreferences.KEY_FILE_CHARSET +import net.newpipe.app.preferences.DownloadPreferences.KEY_LIMIT_QUEUE +import net.newpipe.app.preferences.DownloadPreferences.KEY_MAXIMUM_RETRIES +import net.newpipe.app.preferences.DownloadPreferences.KEY_PAUSE_ON_METERED_NETWORK +import net.newpipe.app.preferences.DownloadPreferences.KEY_REPLACEMENT_CHARACTER +import net.newpipe.app.preferences.DownloadPreferences.KEY_STORAGE_ASK +import net.newpipe.app.preferences.DownloadPreferences.KEY_STORAGE_USE_SAF +import org.koin.core.annotation.KoinViewModel + +@KoinViewModel +class DownloadSettingsViewModel( + private val settings: Settings, + private val storage: DownloadStorageActions +) : ViewModel() { + + val storageAsk: StateFlow + field = booleanFlow(KEY_STORAGE_ASK, DEFAULT_STORAGE_ASK) + + val useStorageAccessFramework: StateFlow + field = MutableStateFlow(storage.useStorageAccessFramework) + + val videoDownloadFolder: StateFlow + field = stringFlow(KEY_DOWNLOAD_FOLDER_VIDEO, DEFAULT_DOWNLOAD_FOLDER) + + val audioDownloadFolder: StateFlow + field = stringFlow(KEY_DOWNLOAD_FOLDER_AUDIO, DEFAULT_DOWNLOAD_FOLDER) + + val fileCharset: StateFlow + field = stringFlow(KEY_FILE_CHARSET, DEFAULT_FILE_CHARSET) + + val replacementCharacter: StateFlow + field = stringFlow(KEY_REPLACEMENT_CHARACTER, DEFAULT_REPLACEMENT_CHARACTER) + + val maximumRetries: StateFlow + field = stringFlow(KEY_MAXIMUM_RETRIES, DEFAULT_MAXIMUM_RETRIES) + + val pauseOnMeteredNetwork: StateFlow + field = booleanFlow(KEY_PAUSE_ON_METERED_NETWORK, DEFAULT_PAUSE_ON_METERED_NETWORK) + + val limitQueue: StateFlow + field = booleanFlow(KEY_LIMIT_QUEUE, DEFAULT_LIMIT_QUEUE) + + fun setStorageAsk(value: Boolean) = storageAsk.persist(KEY_STORAGE_ASK, value) + + fun setUseStorageAccessFramework(value: Boolean) { + useStorageAccessFramework.persist(KEY_STORAGE_USE_SAF, value) + + if (value) { + setVideoDownloadFolder(DEFAULT_DOWNLOAD_FOLDER) + setAudioDownloadFolder(DEFAULT_DOWNLOAD_FOLDER) + return + } + + val defaults = storage.defaultDownloadFolders() + if (videoDownloadFolder.value.isEmpty()) { + setVideoDownloadFolder(defaults.video) + } + if (audioDownloadFolder.value.isEmpty()) { + setAudioDownloadFolder(defaults.audio) + } + } + + fun setVideoDownloadFolder(value: String) = videoDownloadFolder.persistFolder(KEY_DOWNLOAD_FOLDER_VIDEO, value) + + fun setAudioDownloadFolder(value: String) = audioDownloadFolder.persistFolder(KEY_DOWNLOAD_FOLDER_AUDIO, value) + + fun setFileCharset(value: String) = fileCharset.persist(KEY_FILE_CHARSET, value) + + fun setReplacementCharacter(value: String) = replacementCharacter.persist(KEY_REPLACEMENT_CHARACTER, value) + + fun setMaximumRetries(value: String) = maximumRetries.persist(KEY_MAXIMUM_RETRIES, value) + + fun setPauseOnMeteredNetwork(value: Boolean) = pauseOnMeteredNetwork.persist(KEY_PAUSE_ON_METERED_NETWORK, value) + + fun setLimitQueue(value: Boolean) = limitQueue.persist(KEY_LIMIT_QUEUE, value) + + private fun stringFlow(key: String, defaultValue: String) = MutableStateFlow(settings.getString(key, defaultValue)) + + private fun booleanFlow(key: String, defaultValue: Boolean) = MutableStateFlow(settings.getBoolean(key, defaultValue)) + + private fun MutableStateFlow.persist(key: String, newValue: String) { + settings.putString(key, newValue) + value = newValue + } + + private fun MutableStateFlow.persist(key: String, newValue: Boolean) { + settings.putBoolean(key, newValue) + value = newValue + } + + private fun MutableStateFlow.persistFolder(key: String, newValue: String) { + if (newValue.isEmpty()) { + settings.remove(key) + } else { + settings.putString(key, newValue) + } + value = newValue + } +} From 1aef95837cabe67b7648511c58ab1f4d1d9c2785 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Sun, 18 Oct 2026 02:48:39 -0700 Subject: [PATCH 113/155] setup navigation --- .../kotlin/net/newpipe/app/navigation/Destination.kt | 4 +++- .../kotlin/net/newpipe/app/navigation/NavModule.kt | 5 +++++ .../net/newpipe/app/screen/settings/SettingsHomeScreen.kt | 4 ++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt index 47868c170..819aab820 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt @@ -14,6 +14,9 @@ import kotlinx.serialization.Serializable @Serializable sealed interface Destination : NavKey { + @Serializable + data object DownloadSettings : Destination + @Serializable data object DebugSettings : Destination @@ -32,4 +35,3 @@ sealed interface Destination : NavKey { @Serializable data object About : Destination } - diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt index da9648b88..a21c8e14d 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt @@ -10,6 +10,7 @@ import co.touchlab.kermit.Logger import net.newpipe.app.screen.about.AboutScreen import net.newpipe.app.screen.settings.AppearanceSettingsScreen import net.newpipe.app.screen.settings.DebugSettingsScreen +import net.newpipe.app.screen.settings.DownloadSettingsScreen import net.newpipe.app.screen.settings.PlayerSettingsScreen import net.newpipe.app.screen.settings.SettingsHomeScreen import net.newpipe.app.screen.settings.VideoAudioSettingsScreen @@ -52,6 +53,10 @@ fun navModule() = module { navigation { DebugSettingsScreen() } + + navigation { + DownloadSettingsScreen() + } } /** diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt index 7df1903f4..0f5ba5373 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt @@ -64,6 +64,10 @@ fun SettingsHomeScreen( Destination.DebugSettings ) + SettingsCategoryType.DOWNLOADS -> navigator.navigateTo( + Destination.DownloadSettings + ) + // TODO: wire remaining sub-screens as they are migrated else -> Unit } From acc9a39bb15a90eeb623988444cde8e8f59ca063 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Mon, 19 Oct 2026 01:16:06 -0700 Subject: [PATCH 114/155] add download tests and fix bugs --- .../platform/AndroidDownloadStorageActions.kt | 4 - .../app/composable/SwitchPreference.kt | 29 +++---- .../screen/settings/DownloadSettingsScreen.kt | 13 ++- .../settings/DownloadSettingsViewModel.kt | 46 +++++++--- .../app/composable/SwitchPreferenceTest.kt | 18 ++++ .../settings/DebugSettingsScreenTest.kt | 6 +- .../settings/DownloadSettingsScreenTest.kt | 84 +++++++++++++++++++ 7 files changed, 165 insertions(+), 35 deletions(-) create mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreenTest.kt diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt index b7b59d476..3b9a12ed5 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt @@ -47,7 +47,6 @@ class AndroidDownloadStorageActions(context: Context) : DownloadStorageActions { if (folder == Uri.EMPTY) { return null } - // Plain file paths read better without their scheme; SAF trees have no readable path. return when (folder.scheme) { ContentResolver.SCHEME_FILE -> folder.path else -> folder.toString() @@ -56,13 +55,10 @@ class AndroidDownloadStorageActions(context: Context) : DownloadStorageActions { @Composable override fun rememberFolderPicker(onResult: (FolderPickResult) -> Unit): () -> Unit { - // The screen passes a fresh lambda on every recomposition, so read it through a state - // holder instead of capturing the first one inside remember below. val currentOnResult by rememberUpdatedState(onResult) val launcher = rememberLauncherForActivityResult(StartActivityForResult()) { result -> if (result.resultCode != Activity.RESULT_OK) { - // The user backed out of the picker; the legacy screen stays silent too. return@rememberLauncherForActivityResult } val folder = result.data?.data diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt b/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt index f252567f3..d420ed94a 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/composable/SwitchPreference.kt @@ -16,14 +16,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.semantics.Role -import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.clearAndSetSemantics import androidx.compose.ui.tooling.preview.PreviewLightDark import androidx.compose.ui.tooling.preview.PreviewWrapper import androidx.compose.ui.unit.dp import net.newpipe.app.preview.ThemePreviewProvider private const val DISABLED_ALPHA = 0.38f -private val TRAILING_CONTENT_END_PADDING = 16.dp +private val SWITCH_END_PADDING = 16.dp /** * A preference row with a trailing switch, mirroring AndroidX SwitchPreferenceCompat. @@ -45,26 +45,27 @@ fun SwitchPreference( enabled: Boolean = true ) { Row( - modifier = modifier - .alpha(if (enabled) 1f else DISABLED_ALPHA) - .toggleable( - value = checked, - enabled = enabled, - role = Role.Switch, - onValueChange = onCheckedChange - ) - .semantics(mergeDescendants = true) {}, + modifier = modifier.alpha(if (enabled) 1f else DISABLED_ALPHA), verticalAlignment = Alignment.CenterVertically ) { ListItem( - modifier = Modifier.weight(1f), + modifier = Modifier + .weight(1f) + .toggleable( + value = checked, + enabled = enabled, + role = Role.Switch, + onValueChange = onCheckedChange + ), headlineContent = { Text(text = title) }, supportingContent = summary?.let { text -> { Text(text = text) } } ) Switch( - modifier = Modifier.padding(end = TRAILING_CONTENT_END_PADDING), + modifier = Modifier + .padding(end = SWITCH_END_PADDING) + .clearAndSetSemantics {}, checked = checked, - onCheckedChange = null, + onCheckedChange = onCheckedChange, enabled = enabled ) } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt index 5d75693f4..f88bcb03e 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt @@ -46,6 +46,7 @@ import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_PAUSE_ON_METERED_ import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_REPLACEMENT_CHARACTER import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_STORAGE_ASK import net.newpipe.app.preferences.DownloadPreferences.DEFAULT_STORAGE_USE_SAF +import net.newpipe.app.preferences.DownloadPreferences.MAXIMUM_RETRIES_NONE import net.newpipe.app.preferences.DownloadPreferences.MAXIMUM_RETRY_COUNTS import net.newpipe.app.preview.ThemePreviewProvider import net.newpipe.app.viewmodel.settings.DownloadSettingsViewModel @@ -71,11 +72,11 @@ import newpipe.shared.generated.resources.general_error import newpipe.shared.generated.resources.invalid_directory import newpipe.shared.generated.resources.max_retry_desc import newpipe.shared.generated.resources.max_retry_msg -import newpipe.shared.generated.resources.minimize_on_exit_none_description import newpipe.shared.generated.resources.no_app_to_open_intent import newpipe.shared.generated.resources.no_appropriate_file_manager_message import newpipe.shared.generated.resources.no_appropriate_file_manager_message_android_10 import newpipe.shared.generated.resources.no_available_dir +import newpipe.shared.generated.resources.none import newpipe.shared.generated.resources.ok import newpipe.shared.generated.resources.pause_downloads_on_mobile import newpipe.shared.generated.resources.pause_downloads_on_mobile_desc @@ -187,9 +188,13 @@ fun DownloadSettingsScreenContent( ) ) - val noRetriesLabel = stringResource(Res.string.minimize_on_exit_none_description) - val maximumRetryEntries = listOf(ListPreferenceEntry(noRetriesLabel, noRetriesLabel)) + - MAXIMUM_RETRY_COUNTS.map { count -> ListPreferenceEntry(count, count) } + val noRetriesLabel = stringResource(Res.string.none) + val maximumRetryEntries = MAXIMUM_RETRY_COUNTS.map { count -> + ListPreferenceEntry( + value = count, + title = if (count == MAXIMUM_RETRIES_NONE) noRetriesLabel else count + ) + } val storageAskSummary = when { storageAccessFrameworkConfigurable -> diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DownloadSettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DownloadSettingsViewModel.kt index abd1955ba..dbe6555d5 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DownloadSettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/DownloadSettingsViewModel.kt @@ -26,6 +26,7 @@ import net.newpipe.app.preferences.DownloadPreferences.KEY_PAUSE_ON_METERED_NETW import net.newpipe.app.preferences.DownloadPreferences.KEY_REPLACEMENT_CHARACTER import net.newpipe.app.preferences.DownloadPreferences.KEY_STORAGE_ASK import net.newpipe.app.preferences.DownloadPreferences.KEY_STORAGE_USE_SAF +import net.newpipe.app.preferences.DownloadPreferences.normalizedMaximumRetries import org.koin.core.annotation.KoinViewModel @KoinViewModel @@ -53,15 +54,19 @@ class DownloadSettingsViewModel( field = stringFlow(KEY_REPLACEMENT_CHARACTER, DEFAULT_REPLACEMENT_CHARACTER) val maximumRetries: StateFlow - field = stringFlow(KEY_MAXIMUM_RETRIES, DEFAULT_MAXIMUM_RETRIES) + field = MutableStateFlow(repairedMaximumRetries()) val pauseOnMeteredNetwork: StateFlow - field = booleanFlow(KEY_PAUSE_ON_METERED_NETWORK, DEFAULT_PAUSE_ON_METERED_NETWORK) + field = booleanFlow( + KEY_PAUSE_ON_METERED_NETWORK, + DEFAULT_PAUSE_ON_METERED_NETWORK + ) val limitQueue: StateFlow field = booleanFlow(KEY_LIMIT_QUEUE, DEFAULT_LIMIT_QUEUE) - fun setStorageAsk(value: Boolean) = storageAsk.persist(KEY_STORAGE_ASK, value) + fun setStorageAsk(value: Boolean) = storageAsk + .persist(KEY_STORAGE_ASK, value) fun setUseStorageAccessFramework(value: Boolean) { useStorageAccessFramework.persist(KEY_STORAGE_USE_SAF, value) @@ -81,23 +86,33 @@ class DownloadSettingsViewModel( } } - fun setVideoDownloadFolder(value: String) = videoDownloadFolder.persistFolder(KEY_DOWNLOAD_FOLDER_VIDEO, value) + fun setVideoDownloadFolder(value: String) = videoDownloadFolder + .persistFolder(KEY_DOWNLOAD_FOLDER_VIDEO, value) - fun setAudioDownloadFolder(value: String) = audioDownloadFolder.persistFolder(KEY_DOWNLOAD_FOLDER_AUDIO, value) + fun setAudioDownloadFolder(value: String) = audioDownloadFolder + .persistFolder(KEY_DOWNLOAD_FOLDER_AUDIO, value) - fun setFileCharset(value: String) = fileCharset.persist(KEY_FILE_CHARSET, value) + fun setFileCharset(value: String) = fileCharset + .persist(KEY_FILE_CHARSET, value) - fun setReplacementCharacter(value: String) = replacementCharacter.persist(KEY_REPLACEMENT_CHARACTER, value) + fun setReplacementCharacter(value: String) = replacementCharacter + .persist(KEY_REPLACEMENT_CHARACTER, value) - fun setMaximumRetries(value: String) = maximumRetries.persist(KEY_MAXIMUM_RETRIES, value) + fun setMaximumRetries(value: String) = maximumRetries + .persist(KEY_MAXIMUM_RETRIES, value) - fun setPauseOnMeteredNetwork(value: Boolean) = pauseOnMeteredNetwork.persist(KEY_PAUSE_ON_METERED_NETWORK, value) + fun setPauseOnMeteredNetwork(value: Boolean) = pauseOnMeteredNetwork + .persist(KEY_PAUSE_ON_METERED_NETWORK, value) fun setLimitQueue(value: Boolean) = limitQueue.persist(KEY_LIMIT_QUEUE, value) - private fun stringFlow(key: String, defaultValue: String) = MutableStateFlow(settings.getString(key, defaultValue)) + private fun stringFlow(key: String, defaultValue: String) = MutableStateFlow( + settings.getString(key, defaultValue) + ) - private fun booleanFlow(key: String, defaultValue: Boolean) = MutableStateFlow(settings.getBoolean(key, defaultValue)) + private fun booleanFlow(key: String, defaultValue: Boolean) = MutableStateFlow( + settings.getBoolean(key, defaultValue) + ) private fun MutableStateFlow.persist(key: String, newValue: String) { settings.putString(key, newValue) @@ -117,4 +132,13 @@ class DownloadSettingsViewModel( } value = newValue } + + private fun repairedMaximumRetries(): String { + val stored = settings.getString(KEY_MAXIMUM_RETRIES, DEFAULT_MAXIMUM_RETRIES) + val repaired = normalizedMaximumRetries(stored) + if (repaired != stored) { + settings.putString(KEY_MAXIMUM_RETRIES, repaired) + } + return repaired + } } diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt index 00ea451c4..ceb9bbeb1 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/composable/SwitchPreferenceTest.kt @@ -6,6 +6,7 @@ package net.newpipe.app.composable import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsNotEnabled import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.v2.runComposeUiTest @@ -44,4 +45,21 @@ class SwitchPreferenceTest { onNodeWithText(title).performClick() assertFalse(fired) } + + @Test + fun disabledRowReportsItsStateOnTheTitle() = runComposeUiTest { + val title = "Enable feature" + setContent { + SwitchPreference( + title = title, + summary = "Some explanation", + checked = false, + onCheckedChange = {}, + enabled = false + ) + } + + // The title and the switch state must be one node + onNodeWithText(title).assertIsNotEnabled() + } } diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreenTest.kt index 5cf313f79..16e98e68b 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreenTest.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DebugSettingsScreenTest.kt @@ -6,7 +6,9 @@ package net.newpipe.app.screen.settings import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertCountEquals import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onAllNodesWithText import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.test.performScrollTo @@ -53,8 +55,8 @@ class DebugSettingsScreenTest { modules = listOf(emptySettings), content = { DebugSettingsScreenContent(leakCanaryAvailable = false) }, onContent = { - onNodeWithText(getString(Res.string.leak_canary_not_available)) - .assertIsDisplayed() + onAllNodesWithText(getString(Res.string.leak_canary_not_available)) + .assertCountEquals(2) onNodeWithText(getString(Res.string.enable_leak_canary_summary)) .assertDoesNotExist() } diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreenTest.kt new file mode 100644 index 000000000..846c623ac --- /dev/null +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreenTest.kt @@ -0,0 +1,84 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package net.newpipe.app.screen.settings + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.v2.runComposeUiTest +import com.russhwolf.settings.MapSettings +import com.russhwolf.settings.Settings +import kotlin.test.Test +import net.newpipe.app.extensions.withKoin +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.download_path_summary +import newpipe.shared.generated.resources.download_path_title +import newpipe.shared.generated.resources.downloads_storage_use_saf_summary_api_29 +import newpipe.shared.generated.resources.downloads_storage_use_saf_title +import newpipe.shared.generated.resources.max_retry_desc +import newpipe.shared.generated.resources.settings_category_downloads_title +import org.jetbrains.compose.resources.getString +import org.koin.dsl.module + +@OptIn(ExperimentalTestApi::class) +class DownloadSettingsScreenTest { + + private val emptySettings = module { + single { MapSettings() } + } + + @Test + fun rendersTitleAndUnsetDownloadFolder() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { DownloadSettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.settings_category_downloads_title)) + .assertIsDisplayed() + onNodeWithText(getString(Res.string.download_path_summary)).assertIsDisplayed() + } + ) + } + + @Test + fun downloadFolderIsDisabledWhileEveryDownloadAsks() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { DownloadSettingsScreenContent(storageAsk = true) }, + onContent = { + onNodeWithText(getString(Res.string.download_path_title)).assertIsNotEnabled() + } + ) + } + + @Test + fun storageAccessFrameworkIsLockedWhenNotConfigurable() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { + DownloadSettingsScreenContent(storageAccessFrameworkConfigurable = false) + }, + onContent = { + onNodeWithText(getString(Res.string.downloads_storage_use_saf_summary_api_29)) + .assertIsDisplayed() + onNodeWithText(getString(Res.string.downloads_storage_use_saf_title)) + .assertIsNotEnabled() + } + ) + } + + @Test + fun maximumRetriesKeepsItsStaticSummary() = runComposeUiTest { + withKoin( + modules = listOf(emptySettings), + content = { DownloadSettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.max_retry_desc)).assertIsDisplayed() + } + ) + } +} From 9c398043ec1489d691c2f7fa9b9fbcd48f3b307c Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Mon, 19 Oct 2026 12:06:16 -0700 Subject: [PATCH 115/155] code refactor --- .../platform/AndroidDownloadStorageActions.kt | 14 ++-- .../screen/settings/DownloadSettingsScreen.kt | 66 +++++++++++++------ 2 files changed, 54 insertions(+), 26 deletions(-) diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt index 3b9a12ed5..bfc747596 100644 --- a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidDownloadStorageActions.kt @@ -65,10 +65,13 @@ class AndroidDownloadStorageActions(context: Context) : DownloadStorageActions { val bridge = host currentOnResult( when { - folder == null || bridge == null -> + folder == null || bridge == null -> { FolderPickResult.Failed(DownloadFolderError.INVALID_DIRECTORY) + } - else -> bridge.acquireFolder(folder) + else -> { + bridge.acquireFolder(folder) + } } ) } @@ -93,9 +96,10 @@ class AndroidDownloadStorageActions(context: Context) : DownloadStorageActions { } } - private fun newPipeFolderIn(directoryName: String): String = File(File(Environment.getExternalStorageDirectory(), directoryName), NEWPIPE_FOLDER) - .toURI() - .toString() + private fun newPipeFolderIn(directoryName: String): String { + val directory = File(Environment.getExternalStorageDirectory(), directoryName) + return File(directory, NEWPIPE_FOLDER).toURI().toString() + } private fun loadHost(context: Context): DownloadStorageHost? = runCatching { Class.forName(HOST_CLASS) diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt index f88bcb03e..eddabd348 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/DownloadSettingsScreen.kt @@ -197,16 +197,22 @@ fun DownloadSettingsScreenContent( } val storageAskSummary = when { - storageAccessFrameworkConfigurable -> + storageAccessFrameworkConfigurable -> { stringResource(Res.string.downloads_storage_ask_summary) + } - else -> stringResource(Res.string.downloads_storage_ask_summary_no_saf_notice) + else -> { + stringResource(Res.string.downloads_storage_ask_summary_no_saf_notice) + } } val useStorageAccessFrameworkSummary = when { - storageAccessFrameworkConfigurable -> + storageAccessFrameworkConfigurable -> { stringResource(Res.string.downloads_storage_use_saf_summary) + } - else -> stringResource(Res.string.downloads_storage_use_saf_summary_api_29) + else -> { + stringResource(Res.string.downloads_storage_use_saf_summary_api_29) + } } Scaffold( @@ -312,28 +318,46 @@ private fun DownloadFolderErrorDialog( val safTitle = stringResource(Res.string.downloads_storage_use_saf_title) val title = when (error) { - DownloadFolderError.NO_FILE_MANAGER -> stringResource(Res.string.no_app_to_open_intent) - - DownloadFolderError.EXTERNAL_STORAGE_UNAVAILABLE -> - stringResource(Res.string.download_to_sdcard_error_title) - - DownloadFolderError.INVALID_DIRECTORY, - DownloadFolderError.NOT_WRITABLE -> stringResource(Res.string.general_error) - } - val message = when (error) { - DownloadFolderError.NO_FILE_MANAGER -> when { - storageAccessFrameworkConfigurable -> - stringResource(Res.string.no_appropriate_file_manager_message, safTitle) - - else -> stringResource(Res.string.no_appropriate_file_manager_message_android_10) + DownloadFolderError.NO_FILE_MANAGER -> { + stringResource(Res.string.no_app_to_open_intent) } - DownloadFolderError.INVALID_DIRECTORY -> stringResource(Res.string.invalid_directory) + DownloadFolderError.EXTERNAL_STORAGE_UNAVAILABLE -> { + stringResource(Res.string.download_to_sdcard_error_title) + } - DownloadFolderError.NOT_WRITABLE -> stringResource(Res.string.no_available_dir) + DownloadFolderError.INVALID_DIRECTORY, + DownloadFolderError.NOT_WRITABLE -> { + stringResource(Res.string.general_error) + } + } - DownloadFolderError.EXTERNAL_STORAGE_UNAVAILABLE -> + // Only Android 9 and below can be told to turn SAF off + val fileManagerMessage = when { + storageAccessFrameworkConfigurable -> { + stringResource(Res.string.no_appropriate_file_manager_message, safTitle) + } + + else -> { + stringResource(Res.string.no_appropriate_file_manager_message_android_10) + } + } + val message = when (error) { + DownloadFolderError.NO_FILE_MANAGER -> { + fileManagerMessage + } + + DownloadFolderError.INVALID_DIRECTORY -> { + stringResource(Res.string.invalid_directory) + } + + DownloadFolderError.NOT_WRITABLE -> { + stringResource(Res.string.no_available_dir) + } + + DownloadFolderError.EXTERNAL_STORAGE_UNAVAILABLE -> { stringResource(Res.string.download_to_sdcard_error_message) + } } AlertDialog( From c2cf8c9fbcbcc4938789f3a8f99c5536652f3fc1 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 15 Jul 2026 09:43:30 +0800 Subject: [PATCH 116/155] gradle: Update dependencies to latest stable release Signed-off-by: Aayush Gupta --- gradle/libs.versions.toml | 40 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 07a80eb7a..82de190e1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,10 +4,10 @@ # [versions] -about-libraries = "15.1.1" -acra = "5.13.1" +about-libraries = "15.3.0" +acra = "5.14.2" activity = "1.13.0" -agp = "9.3.1" +agp = "9.4.1" appcompat = "1.8.0" assertj = "3.27.7" autoservice-google = "1.1.1" @@ -16,27 +16,27 @@ bridge = "v2.0.2" browser = "1.10.0" cardview = "1.0.0" checkstyle = "13.8.0" # See https://github.com/checkstyle/checkstyle/issues/21175 -coil = "3.5.0" -compose = "1.12.0" +coil = "3.6.3" +compose = "1.12.1" constraintlayout = "2.2.2" -core = "1.19.0" +core = "1.19.1" coroutines = "1.11.0" desugar = "2.1.5" documentfile = "1.1.0" espresso = "3.7.0" exoplayer = "2.19.1" -fragment = "1.9.0" +fragment = "1.9.1" groupie = "2.10.1" -jsoup = "1.23.1" +jsoup = "1.23.2" junit = "4.13.2" junit-ext = "1.3.0" -kermit = "2.1.0" +kermit = "2.2.0" koin = "4.2.2" -koin-plugin = "1.1.0" -kotlin = "2.4.10" +koin-plugin = "1.2.1" +kotlin = "2.4.21" kotlinx-coroutines-rx3 = "1.11.0" -kotlinx-serialization-json = "1.11.0" -ksp = "2.3.11" +kotlinx-serialization-json = "1.12.0" +ksp = "2.3.12" ktlint = "1.8.0" leakcanary = "2.14" leakcanaryVersion = "1.0.0" @@ -46,21 +46,21 @@ markwon = "4.6.2" material = "1.11.0" # TODO: update to newer version after bug is fixed. See https://github.com/TeamNewPipe/NewPipe/pull/13018 material3 = "1.11.0-alpha07" media = "1.7.1" -mockitoCore = "5.23.0" -multiplatform = "1.11.1" -navigation3 = "1.1.1" +mockitoCore = "5.24.0" +multiplatform = "1.12.2" +navigation3 = "1.1.2" okhttp = "5.5.0" phoenix = "3.0.0" preference = "1.2.1" prettytime = "5.0.8.Final" recyclerview = "1.4.0" -room = "2.8.4" +room = "2.8.5" # Needs migration to 3.x, may as well be moved to shared runner = "1.7.0" rxandroid = "3.0.2" rxbinding = "4.0.0" rxjava = "3.1.12" settings = "1.3.0" -sonarqube = "7.4.0.8496" +sonarqube = "7.5.0.8588" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" swiperefreshlayout = "1.2.0" @@ -74,10 +74,10 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "65cabc2ba5216ee871ace4a9963c08bdbf5d5dc0" +teamnewpipe-newpipe-extractor = "8443c91bf4276c326f7b33e30a36d88e0ab94cfe" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 -work = "2.11.2" +work = "2.11.2" # New versions require minSdk 24 [libraries] acra-core = { module = "ch.acra:acra-core", version.ref = "acra" } From a2a9e07a0e58e42832731938fd5726b0c1af9ce8 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Tue, 20 Oct 2026 18:24:57 +0800 Subject: [PATCH 117/155] Update Gradle to 9.8.2 Signed-off-by: Aayush Gupta --- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a78c88e53..5907d39c3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=dce76f55f8e251a3a1f130eb120f30b3d271de2b76c9b0729d316b5a1b6dc01f -distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.1-bin.zip +distributionSha256Sum=21bd5da2de49b642904077f38c0efdc7778e92b3ed0889392dca61b97e389607 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.2-bin.zip networkTimeout=10000 retries=0 retryBackOffMs=500 From d2f6b76bac66bf28f718196cbbac4a2ee5965f1a Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Tue, 20 Oct 2026 13:45:34 +0200 Subject: [PATCH 118/155] Translated using Weblate (German) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (Polish) Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (German) Currently translated at 95.2% (179 of 188 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Portuguese) Currently translated at 98.5% (67 of 68 strings) Translated using Weblate (Galician) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Korean) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Swedish) Currently translated at 44.3% (70 of 158 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Update translation files Updated by "Remove blank strings" add-on in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Portuguese) Currently translated at 98.5% (67 of 68 strings) Translated using Weblate (Haitian) Currently translated at 1.4% (11 of 778 strings) Translated using Weblate (Haitian) Currently translated at 10.7% (17 of 158 strings) Translated using Weblate (Montenegrin) Currently translated at 2.3% (18 of 778 strings) Translated using Weblate (Montenegrin) Currently translated at 12.0% (19 of 158 strings) Translated using Weblate (Lombard) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Lombard) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (ryu (generated) (ryu)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (ryu (generated) (ryu)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Toki Pona) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Toki Pona) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Undetermined) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Undetermined) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Punjabi (Pakistan)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Punjabi (Pakistan)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Arabic (Libya)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Arabic (Libya)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Berber) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Berber) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 70.2% (111 of 158 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 70.2% (111 of 158 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Acehnese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Acehnese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bambara) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bambara) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bavarian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bavarian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 22.1% (35 of 158 strings) Translated using Weblate (Kabyle) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kabyle) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Latin) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Santali) Currently translated at 1.8% (3 of 158 strings) Translated using Weblate (Santali) Currently translated at 1.8% (3 of 158 strings) Translated using Weblate (Burmese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Burmese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Assamese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Assamese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Sardinian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Sardinian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (N’Ko) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (N’Ko) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tagalog) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tagalog) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Urdu) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Urdu) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Slovenian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Slovenian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Sinhala) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Sinhala) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Slovak) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Kannada) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kannada) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Korean) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Korean) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Albanian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Albanian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Serbian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Serbian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kazakh) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kazakh) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Georgian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Georgian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Finnish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Finnish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Swedish) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (French) Currently translated at 37.9% (60 of 158 strings) Translated using Weblate (French) Currently translated at 37.9% (60 of 158 strings) Translated using Weblate (French) Currently translated at 37.9% (60 of 158 strings) Translated using Weblate (Somali) Currently translated at 16.4% (26 of 158 strings) Translated using Weblate (Spanish) Currently translated at 26.5% (42 of 158 strings) Translated using Weblate (Neapolitan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Neapolitan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Nepali) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Nepali) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch) Currently translated at 13.9% (22 of 158 strings) Translated using Weblate (Bengali (India)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bengali (India)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Indonesian) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Interlingua) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Interlingua) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Arabic) Currently translated at 88.6% (140 of 158 strings) Translated using Weblate (Swahili) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Swahili) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Afrikaans) Currently translated at 38.6% (61 of 158 strings) Translated using Weblate (Afrikaans) Currently translated at 38.6% (61 of 158 strings) Translated using Weblate (Marathi) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Marathi) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Malay) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Malay) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Macedonian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Macedonian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Mongolian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Mongolian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Malayalam) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Malayalam) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Hebrew) Currently translated at 22.7% (36 of 158 strings) Translated using Weblate (Hindi) Currently translated at 24.6% (39 of 158 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Croatian) Currently translated at 19.6% (31 of 158 strings) Translated using Weblate (Armenian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Armenian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Icelandic) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Vietnamese) Currently translated at 13.2% (21 of 158 strings) Translated using Weblate (Vietnamese) Currently translated at 13.2% (21 of 158 strings) Translated using Weblate (Punjabi) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Welsh) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Welsh) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Catalan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Catalan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Odia) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Odia) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Occitan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Occitan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Japanese) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Bosnian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bosnian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Breton) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Breton) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Javanese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Javanese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Asturian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Asturian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Ukrainian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Bulgarian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Belarusian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Bengali) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bengali) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Romanian) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Russian) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Estonian) Currently translated at 29.1% (46 of 158 strings) Translated using Weblate (Basque) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Basque) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Esperanto) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Esperanto) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Greek) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Greek) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Danish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Danish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tamil) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tamil) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Filipino) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (German) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Persian) Currently translated at 30.3% (48 of 158 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.4% (774 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Filipino) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Telugu) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Telugu) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tigrinya) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tigrinya) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Thai) Currently translated at 31.0% (49 of 158 strings) Translated using Weblate (Lithuanian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Lithuanian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Latvian) Currently translated at 24.0% (38 of 158 strings) Translated using Weblate (Turkish) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Tatar) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tatar) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Galician) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Gujarati) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Gujarati) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Italian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Italian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (German) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Persian) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Persian) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Polish) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Polish) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Lombard) Currently translated at 4.8% (38 of 778 strings) Translated using Weblate (Breton) Currently translated at 12.9% (101 of 778 strings) Translated using Weblate (Breton) Currently translated at 12.9% (101 of 778 strings) Translated using Weblate (Welsh) Currently translated at 0.1% (1 of 778 strings) Translated using Weblate (Tatar) Currently translated at 6.1% (48 of 778 strings) Translated using Weblate (Mongolian) Currently translated at 5.2% (41 of 778 strings) Translated using Weblate (Burmese) Currently translated at 2.8% (22 of 778 strings) Translated using Weblate (Toki Pona) Currently translated at 5.9% (46 of 778 strings) Translated using Weblate (Toki Pona) Currently translated at 5.9% (46 of 778 strings) Translated using Weblate (ryu (generated) (ryu)) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (ryu (generated) (ryu)) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Tigrinya) Currently translated at 21.4% (167 of 778 strings) Translated using Weblate (Kannada) Currently translated at 5.5% (43 of 778 strings) Translated using Weblate (N’Ko) Currently translated at 83.9% (653 of 778 strings) Translated using Weblate (N’Ko) Currently translated at 83.9% (653 of 778 strings) Translated using Weblate (Bambara) Currently translated at 0.2% (2 of 778 strings) Translated using Weblate (Assamese) Currently translated at 11.9% (93 of 778 strings) Translated using Weblate (Assamese) Currently translated at 11.9% (93 of 778 strings) Translated using Weblate (Assamese) Currently translated at 11.9% (93 of 778 strings) Translated using Weblate (Assamese) Currently translated at 11.9% (93 of 778 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 19.0% (148 of 778 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 19.0% (148 of 778 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 19.0% (148 of 778 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 19.0% (148 of 778 strings) Translated using Weblate (Georgian) Currently translated at 94.4% (735 of 778 strings) Translated using Weblate (Georgian) Currently translated at 94.4% (735 of 778 strings) Translated using Weblate (Georgian) Currently translated at 94.4% (735 of 778 strings) Translated using Weblate (Kazakh) Currently translated at 0.6% (5 of 778 strings) Translated using Weblate (Kazakh) Currently translated at 0.6% (5 of 778 strings) Translated using Weblate (Kazakh) Currently translated at 0.6% (5 of 778 strings) Translated using Weblate (Kazakh) Currently translated at 0.6% (5 of 778 strings) Translated using Weblate (Punjabi (Pakistan)) Currently translated at 16.0% (125 of 778 strings) Translated using Weblate (Punjabi (Pakistan)) Currently translated at 16.0% (125 of 778 strings) Translated using Weblate (Undetermined) Currently translated at 16.9% (132 of 778 strings) Translated using Weblate (Undetermined) Currently translated at 16.9% (132 of 778 strings) Translated using Weblate (Undetermined) Currently translated at 16.9% (132 of 778 strings) Translated using Weblate (Icelandic) Currently translated at 98.7% (768 of 778 strings) Translated using Weblate (Icelandic) Currently translated at 98.7% (768 of 778 strings) Translated using Weblate (Icelandic) Currently translated at 98.7% (768 of 778 strings) Translated using Weblate (Icelandic) Currently translated at 98.7% (768 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Bosnian) Currently translated at 97.5% (759 of 778 strings) Translated using Weblate (Bosnian) Currently translated at 97.5% (759 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 99.3% (773 of 778 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 99.3% (773 of 778 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 99.3% (773 of 778 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 99.3% (773 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Santali) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Santali) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Santali) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Sardinian) Currently translated at 95.8% (746 of 778 strings) Translated using Weblate (Sardinian) Currently translated at 95.8% (746 of 778 strings) Translated using Weblate (Sardinian) Currently translated at 95.8% (746 of 778 strings) Translated using Weblate (Sardinian) Currently translated at 95.8% (746 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Arabic (Libya)) Currently translated at 91.5% (712 of 778 strings) Translated using Weblate (Arabic (Libya)) Currently translated at 91.5% (712 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Tamil) Currently translated at 94.0% (732 of 778 strings) Translated using Weblate (Tamil) Currently translated at 94.0% (732 of 778 strings) Translated using Weblate (Tamil) Currently translated at 94.0% (732 of 778 strings) Translated using Weblate (Tamil) Currently translated at 94.0% (732 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Croatian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Croatian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Croatian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Croatian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 93.1% (725 of 778 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 93.1% (725 of 778 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 93.1% (725 of 778 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 93.1% (725 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Serbian) Currently translated at 98.9% (770 of 778 strings) Translated using Weblate (Serbian) Currently translated at 98.9% (770 of 778 strings) Translated using Weblate (Serbian) Currently translated at 98.9% (770 of 778 strings) Translated using Weblate (Serbian) Currently translated at 98.9% (770 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Galician) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Arabic) Currently translated at 98.5% (140 of 142 strings) Translated using Weblate (Czech) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Galician) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Galician) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 2.9% (2 of 68 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Indonesian) Currently translated at 78.8% (112 of 142 strings) Translated using Weblate (Galician) Currently translated at 26.0% (37 of 142 strings) Translated using Weblate (Galician) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 51.4% (35 of 68 strings) Translated using Weblate (Indonesian) Currently translated at 50.0% (34 of 68 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Added translation using Weblate (Norwegian Bokmål) Added translation using Weblate (Lombard) Added translation using Weblate (Montenegrin) Added translation using Weblate (Toki Pona) Added translation using Weblate (Undetermined) Added translation using Weblate (Dutch (Middle)) Added translation using Weblate (Punjabi (Pakistan)) Added translation using Weblate (Arabic (Libya)) Added translation using Weblate (Berber) Added translation using Weblate (Tamazight (Central Atlas)) Added translation using Weblate (Acehnese) Added translation using Weblate (Kurdish (Kurmanji)) Added translation using Weblate (Bambara) Added translation using Weblate (Bavarian) Added translation using Weblate (Bengali (Bangladesh)) Added translation using Weblate (Kabyle) Added translation using Weblate (Uzbek (Latin script)) Added translation using Weblate (Latin) Added translation using Weblate (Chinese (Simplified Han script)) Added translation using Weblate (Santali) Added translation using Weblate (Burmese) Added translation using Weblate (Sardinian) Added translation using Weblate (Haitian) Added translation using Weblate (N’Ko) Added translation using Weblate (Tagalog) Added translation using Weblate (Dutch (Belgium)) Added translation using Weblate (Kurdish (Sorani)) Added translation using Weblate (Portuguese (Portugal)) Added translation using Weblate (Urdu) Added translation using Weblate (Slovenian) Added translation using Weblate (Kurdish) Added translation using Weblate (Sinhala) Added translation using Weblate (Slovak) Added translation using Weblate (Kannada) Added translation using Weblate (Albanian) Added translation using Weblate (Kazakh) Added translation using Weblate (Georgian) Added translation using Weblate (Finnish) Added translation using Weblate (Persian) Added translation using Weblate (Swedish) Added translation using Weblate (Neapolitan) Added translation using Weblate (Nepali) Added translation using Weblate (Norwegian Nynorsk) Added translation using Weblate (Dutch) Added translation using Weblate (Bengali (India)) Added translation using Weblate (Indonesian) Added translation using Weblate (Azerbaijani) Added translation using Weblate (Interlingua) Added translation using Weblate (Swahili) Added translation using Weblate (Afrikaans) Added translation using Weblate (Marathi) Added translation using Weblate (Malay) Added translation using Weblate (Macedonian) Added translation using Weblate (Mongolian) Added translation using Weblate (Malayalam) Added translation using Weblate (Hebrew) Added translation using Weblate (Hungarian) Added translation using Weblate (Croatian) Added translation using Weblate (Armenian) Added translation using Weblate (English (United Kingdom)) Added translation using Weblate (Icelandic) Added translation using Weblate (Vietnamese) Added translation using Weblate (Portuguese) Added translation using Weblate (Czech) Added translation using Weblate (Welsh) Added translation using Weblate (Catalan) Added translation using Weblate (Odia) Added translation using Weblate (Occitan) Added translation using Weblate (Bosnian) Added translation using Weblate (Breton) Added translation using Weblate (Javanese) Added translation using Weblate (Asturian) Added translation using Weblate (Ukrainian) Added translation using Weblate (Bulgarian) Added translation using Weblate (Belarusian) Added translation using Weblate (Bengali) Added translation using Weblate (Estonian) Added translation using Weblate (Basque) Added translation using Weblate (Esperanto) Added translation using Weblate (Greek) Added translation using Weblate (Danish) Added translation using Weblate (Chinese (Traditional Han script, Hong Kong)) Added translation using Weblate (Tamil) Added translation using Weblate (Filipino) Added translation using Weblate (Telugu) Added translation using Weblate (Tigrinya) Added translation using Weblate (Thai) Added translation using Weblate (Lithuanian) Added translation using Weblate (Latvian) Added translation using Weblate (Tatar) Added translation using Weblate (Galician) Added translation using Weblate (Gujarati) Translated using Weblate (Thai) Currently translated at 34.5% (49 of 142 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Update translation files Updated by "Cleanup translation files" add-on in Weblate. Co-authored-by: /dev/urandom Co-authored-by: 01QueN10 <01quen10@users.noreply.hosted.weblate.org> Co-authored-by: 09pulse <09pulse@users.noreply.hosted.weblate.org> Co-authored-by: 2-Seol <2-seol@users.noreply.hosted.weblate.org> Co-authored-by: A Co-authored-by: AP Co-authored-by: Aarjav Parashar Co-authored-by: Aayush Gupta Co-authored-by: Abanoub Sameh Co-authored-by: Adolfo Jayme Barrientos Co-authored-by: Agnieszka C Co-authored-by: AhHyeon An Co-authored-by: Ahmad Firdaus Co-authored-by: Aidos Co-authored-by: AioiLight Co-authored-by: Aitor Salaberria Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Ali Demirtas Co-authored-by: Allan Nordhøy Co-authored-by: Andreas Westrell Co-authored-by: Andrij Mizyk Co-authored-by: Anonymous Co-authored-by: Anton Shestakov Co-authored-by: Antony Co-authored-by: Anxhelo Lushka Co-authored-by: Anže Končan Co-authored-by: Archi Co-authored-by: Arif Budiman Co-authored-by: AudricV Co-authored-by: Aurelian Ciocîltan Co-authored-by: Azizov Aga Co-authored-by: Azwaw Co-authored-by: Bakary Kaba Co-authored-by: Balázs Meskó Co-authored-by: Ben De Meester Co-authored-by: Benedikt Freisen Co-authored-by: BenjaminForster Co-authored-by: BennyBeat Co-authored-by: Berkay Gündüz Co-authored-by: Bert Co-authored-by: Bjorn Roesbeke Co-authored-by: Blaise Pascal Co-authored-by: Bob Co-authored-by: Bopol Co-authored-by: Bruno Gusmão Co-authored-by: Bruno Tendler Co-authored-by: ButterflyOfFire Co-authored-by: C. Rüdinger Co-authored-by: Caetano Demián Moreno Co-authored-by: Chitraarasu.k Co-authored-by: Chris Co-authored-by: Cipisek Rumcajsu Co-authored-by: Comrade KVRONV Co-authored-by: Czech Translator Co-authored-by: D D Co-authored-by: DPap Co-authored-by: Dan Co-authored-by: DanLo Co-authored-by: Danial Behzadi Co-authored-by: Daniel Co-authored-by: Daniel Rozario Co-authored-by: Daria Szatan Co-authored-by: Darko Ristovski Co-authored-by: David Kovács Co-authored-by: David Rebolo Magariños Co-authored-by: Davit Mayilyan Co-authored-by: Dayongdo Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Digiwizkid Co-authored-by: Domokun Co-authored-by: Drugi Sapog Co-authored-by: Dual Natan Co-authored-by: Duppadaadadii Co-authored-by: ERYpTION Co-authored-by: Edward Co-authored-by: Edward Thomson Co-authored-by: Emil Tang Kristensen Co-authored-by: Emin Tufan Çetin Co-authored-by: Enol P. Co-authored-by: Femini Co-authored-by: Filip Marek Co-authored-by: Fjuro Co-authored-by: Flo P Co-authored-by: Florin Voicu Co-authored-by: Francesco Saltori Co-authored-by: Franco Co-authored-by: GET100PERCENT Co-authored-by: Ghost of Sparta Co-authored-by: GobinathAL Co-authored-by: Guillem Co-authored-by: Hakim Oubouali Co-authored-by: HardLight Co-authored-by: Hasan Co-authored-by: Heimen Stoffels Co-authored-by: HelaBasa Group (හෙළබස සමූහය) Co-authored-by: Hemanta Sharma Co-authored-by: Hoseok Seo Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Hoàng Lâm Lê Co-authored-by: Ignacy Kajdan Co-authored-by: Igor Nedoboy Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: Inn Charge Co-authored-by: Isak Co-authored-by: Ivan Dekovets Co-authored-by: Ivan Krušlin Co-authored-by: IverCoder Co-authored-by: J. Lavoie Co-authored-by: JS Ahn Co-authored-by: JY3 Co-authored-by: Jalaluddin Co-authored-by: Jani Buni Co-authored-by: Jani Kinnunen Co-authored-by: Jeff Huang Co-authored-by: Jener Gomes Co-authored-by: Jerome Nav Co-authored-by: JoC Co-authored-by: Jonatan Nyberg Co-authored-by: Joseph Kim Co-authored-by: Josu Co-authored-by: Jwtiyar Nariman Co-authored-by: K. Herbert Co-authored-by: Kaantaja Co-authored-by: Karl Tammik Co-authored-by: Kartik Jivane Co-authored-by: Kiss Attila Co-authored-by: Koo Hyomin Co-authored-by: Kornelijus Tvarijanavičius Co-authored-by: Kowith Singkornkeeree Co-authored-by: Kristjan Räts Co-authored-by: Kristoffer Grundström Co-authored-by: Kuko Co-authored-by: L-M-H Co-authored-by: Languages add-on Co-authored-by: Lavin Tom K Abraham Co-authored-by: LiJu09 Co-authored-by: Lim Jia Ming Co-authored-by: Line Co-authored-by: Linerly Co-authored-by: Louis Morel Co-authored-by: Loís B Co-authored-by: M. Ll Co-authored-by: M4SK Co-authored-by: MS-PC Co-authored-by: Maciej Gamrat Co-authored-by: Maday Co-authored-by: MadderRagax Co-authored-by: Mahyuddin Co-authored-by: Manuela Silva Co-authored-by: Marco Santos Co-authored-by: Marcos Chavarría Teijeiro Co-authored-by: Marian Hanzel Co-authored-by: Mario Rossi Co-authored-by: Matej U Co-authored-by: Mathias Hamza Vedsted-Mirza Co-authored-by: Miala Co-authored-by: Michael Moroni Co-authored-by: Mickaël Binos Co-authored-by: Milan Co-authored-by: Milo Ivir Co-authored-by: MohammedSR Vevo Co-authored-by: Mostafa Ahangarha Co-authored-by: Muhammad Sharjeel <3443@users.noreply.hosted.weblate.org> Co-authored-by: Mukhamadjonov Co-authored-by: NEXI Co-authored-by: NTFSynergy Co-authored-by: Nadir Nour Co-authored-by: Naimul Kabir Co-authored-by: Napstaguy04 Co-authored-by: Nathan <02947b5yh@users.noreply.hosted.weblate.org> Co-authored-by: Ngo Lam Bao An Co-authored-by: Nico Guo <83hjpf3s@users.noreply.hosted.weblate.org> Co-authored-by: Nicu Borta Co-authored-by: Nikita Epifanov Co-authored-by: Nikoloz Co-authored-by: Nista <42772160+Nista11@users.noreply.github.com> Co-authored-by: O Passante Co-authored-by: Olexandr Nesterenko Co-authored-by: Olivia Ng Co-authored-by: Omar Macías Molina Co-authored-by: Osoitz Co-authored-by: Oymate Co-authored-by: Oğuz Ersen Co-authored-by: PPNplus Co-authored-by: Pera Petrovic Co-authored-by: Philip Goto Co-authored-by: Pluto Co-authored-by: Prajwol Pradhan Co-authored-by: Prajwol Pradhan Co-authored-by: Prasanta-Hembram Co-authored-by: Praveen0899 Co-authored-by: Prietenii Bunii Co-authored-by: Priit Jõerüüt Co-authored-by: RainSlide Co-authored-by: Random Co-authored-by: Ray Co-authored-by: Rehaz Feddit Co-authored-by: Retrial Co-authored-by: Rex_sa Co-authored-by: Ricardo Co-authored-by: Rijolo Co-authored-by: Riku Co-authored-by: Rom1 Co-authored-by: Rushikesh Panchal Co-authored-by: Ryan Co-authored-by: SC Co-authored-by: Sarfaraz Ahmed Co-authored-by: Sean Minnaert Co-authored-by: SecularSteve Co-authored-by: Sergio Marques Co-authored-by: ShareASmile Co-authored-by: Shifa Graphics Co-authored-by: Sierzh Co-authored-by: Steven Felix Co-authored-by: Subham Jena Co-authored-by: Surfoo Co-authored-by: Sveinn í Felli Co-authored-by: Sérgio Marques Co-authored-by: T1z3n Co-authored-by: THANOS SIOURDAKIS Co-authored-by: TXRdev Archive Co-authored-by: Tari Co-authored-by: Temuri Doghonadze Co-authored-by: Terry Louwers Co-authored-by: Thadah D. Denyse Co-authored-by: ThePsychoBuck Co-authored-by: Theophine Savio Theodore Co-authored-by: Thien Bui <84436@users.noreply.hosted.weblate.org> Co-authored-by: TobiGr Co-authored-by: TotalCaesar659 Co-authored-by: Translator <_translator@users.noreply.hosted.weblate.org> Co-authored-by: Trendyne Co-authored-by: Trần Lê Nhật Huy Co-authored-by: Tấn Lực Trương Co-authored-by: Vasilis K. Co-authored-by: VfBFan Co-authored-by: Ville Rantanen Co-authored-by: Vivek K J Co-authored-by: Vojtěch Šamla Co-authored-by: Vri 🌈 Co-authored-by: W L Co-authored-by: WB Co-authored-by: WaldiS Co-authored-by: Whod Co-authored-by: William Co-authored-by: Wirelessalien <121420261+WirelessAlien@users.noreply.github.com> Co-authored-by: Yago Raña Gayoso Co-authored-by: Yaron Shahrabani Co-authored-by: Yoda Co-authored-by: Zoldtukor Co-authored-by: algimantas Co-authored-by: aqwer-T Co-authored-by: atilluF <110931720+atilluF@users.noreply.github.com> Co-authored-by: bgo-eiu Co-authored-by: bomzhellino Co-authored-by: bowornsin Co-authored-by: bruh Co-authored-by: caltaojihun Co-authored-by: cat Co-authored-by: cedspam Co-authored-by: cehnemdark Co-authored-by: chr56 Co-authored-by: devl Co-authored-by: ditokp Co-authored-by: doodosod Co-authored-by: dyare darbani Co-authored-by: evfjunior Co-authored-by: ezjerry liao Co-authored-by: g Co-authored-by: gamerboy Co-authored-by: gold.ris90 Co-authored-by: gymka Co-authored-by: htet Co-authored-by: j Co-authored-by: justanidea Co-authored-by: justcontributor Co-authored-by: justcontributor Co-authored-by: kaajjo Co-authored-by: komiratsu192 Co-authored-by: kuragehime Co-authored-by: lilium Co-authored-by: martian94 Co-authored-by: minsk21 Co-authored-by: naofum Co-authored-by: nautilusx Co-authored-by: ngocanhtve Co-authored-by: nzgha Co-authored-by: odbsalt Co-authored-by: opusforlife2 Co-authored-by: ozyc Co-authored-by: petlyh <88139840+petlyh@users.noreply.github.com> Co-authored-by: pjammo Co-authored-by: qrynill Co-authored-by: r2308145 Co-authored-by: randomtroller Co-authored-by: retiolus Co-authored-by: rimasx Co-authored-by: shiloni Co-authored-by: simo Co-authored-by: skil3z Co-authored-by: ssantos Co-authored-by: subba raidu Co-authored-by: sudoLife Co-authored-by: tch69 Co-authored-by: uievawkejf Co-authored-by: wb9688 Co-authored-by: whenwesober Co-authored-by: winqooq Co-authored-by: yunna Co-authored-by: zelos-h Co-authored-by: zeritti Co-authored-by: zmni Co-authored-by: Ács Zoltán Co-authored-by: Åzze Co-authored-by: Éfrit Co-authored-by: Óscar Fernández Díaz <42654671+oscfdezdz@users.noreply.github.com> Co-authored-by: Александр Co-authored-by: Егор Ермаков Co-authored-by: Симеон Цветков Co-authored-by: Слободан Симић(Slobodan Simić) Co-authored-by: Юрий Иванович Шмаровский Co-authored-by: мачко Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) Co-authored-by: 모르것다 Co-authored-by: 이정희 Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ace/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/af/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ar_LY/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/as/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ast/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/az/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/be/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ber/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bg/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bm/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bn_BD/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bn_IN/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/br/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ca/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ckb/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/cnr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/cy/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/da/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/dum/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/el/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/en_GB/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/eo/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/et/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/eu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fa/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fil/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/gl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/gu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/he/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ht/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hy/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ia/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/is/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ja/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/jv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ka/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/kab/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/kk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/kmr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/kn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ku/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/la/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/lmo/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/lt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/lv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/mk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ml/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/mn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/mr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ms/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/my/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nap/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nb/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ne/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nl_BE/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nqo/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/oc/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/or/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pa/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pa_PK/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ro/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ru/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ryu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sat/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sc/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/si/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/so/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sq/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sw/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ta/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/te/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/th/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ti/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tok/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tzm/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/und/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ur/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/uz_Latn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/vi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hant_HK/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/gl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/gl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/hu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/newpipe/strings/ Translation: NewPipe/Metadata Translation: NewPipe/README Translation: NewPipe/Strings Translation: NewPipe/compose Signed-off-by: Aayush Gupta --- app/src/main/res/values-ace/strings.xml | 6 +- app/src/main/res/values-af/strings.xml | 2 +- app/src/main/res/values-ar-rLY/strings.xml | 73 +---- app/src/main/res/values-ar/strings.xml | 179 +++++------ app/src/main/res/values-as/strings.xml | 8 +- app/src/main/res/values-az/strings.xml | 86 ++---- app/src/main/res/values-b+ast/strings.xml | 80 ++--- app/src/main/res/values-b+uz+Latn/strings.xml | 80 ++--- app/src/main/res/values-bar/strings.xml | 4 +- app/src/main/res/values-be/strings.xml | 30 +- app/src/main/res/values-ber/strings.xml | 6 +- app/src/main/res/values-bg/strings.xml | 66 ++-- app/src/main/res/values-bm/strings.xml | 2 +- app/src/main/res/values-bn-rBD/strings.xml | 27 +- app/src/main/res/values-bn-rIN/strings.xml | 21 +- app/src/main/res/values-bn/strings.xml | 37 +-- app/src/main/res/values-bs/strings.xml | 4 +- app/src/main/res/values-ca/strings.xml | 80 ++--- app/src/main/res/values-ckb/strings.xml | 65 +--- app/src/main/res/values-cs/strings.xml | 130 ++++---- app/src/main/res/values-cy/strings.xml | 3 +- app/src/main/res/values-da/strings.xml | 92 ++---- app/src/main/res/values-de/strings.xml | 168 ++++------- app/src/main/res/values-dum/strings.xml | 6 +- app/src/main/res/values-el/strings.xml | 80 ++--- app/src/main/res/values-en-rGB/strings.xml | 45 +-- app/src/main/res/values-eo/strings.xml | 51 ++-- app/src/main/res/values-es/strings.xml | 83 ++---- app/src/main/res/values-et/strings.xml | 87 ++---- app/src/main/res/values-eu/strings.xml | 61 ++-- app/src/main/res/values-fa/strings.xml | 85 ++---- app/src/main/res/values-fi/strings.xml | 100 ++----- app/src/main/res/values-fil/strings.xml | 17 +- app/src/main/res/values-fr/strings.xml | 176 ++++------- app/src/main/res/values-gl/strings.xml | 282 ++++++++---------- app/src/main/res/values-gu/strings.xml | 4 +- app/src/main/res/values-he/strings.xml | 127 +++----- app/src/main/res/values-hi/strings.xml | 109 ++----- app/src/main/res/values-hr/strings.xml | 95 ++---- app/src/main/res/values-hu/strings.xml | 232 +++++++------- app/src/main/res/values-ia/strings.xml | 14 +- app/src/main/res/values-in/strings.xml | 256 +++++++--------- app/src/main/res/values-is/strings.xml | 72 ++--- app/src/main/res/values-it/strings.xml | 112 +++---- app/src/main/res/values-ja/strings.xml | 91 ++---- app/src/main/res/values-jv/strings.xml | 8 +- app/src/main/res/values-ka/strings.xml | 100 ++----- app/src/main/res/values-kab/strings.xml | 4 +- app/src/main/res/values-kk/strings.xml | 4 +- app/src/main/res/values-kmr/strings.xml | 80 ++--- app/src/main/res/values-kn/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 110 ++----- app/src/main/res/values-ku/strings.xml | 49 +-- app/src/main/res/values-la/strings.xml | 2 +- app/src/main/res/values-lt/strings.xml | 124 +++----- app/src/main/res/values-lv/strings.xml | 20 +- app/src/main/res/values-mk/strings.xml | 33 +- app/src/main/res/values-ml/strings.xml | 87 ++---- app/src/main/res/values-mn/strings.xml | 2 +- app/src/main/res/values-mr/strings.xml | 6 +- app/src/main/res/values-ms/strings.xml | 50 ++-- app/src/main/res/values-my/strings.xml | 2 +- app/src/main/res/values-nap/strings.xml | 6 +- app/src/main/res/values-nb-rNO/strings.xml | 94 ++---- app/src/main/res/values-ne/strings.xml | 75 ++--- app/src/main/res/values-nl-rBE/strings.xml | 84 ++---- app/src/main/res/values-nl/strings.xml | 110 ++----- app/src/main/res/values-nn/strings.xml | 8 +- app/src/main/res/values-nqo/strings.xml | 66 +--- app/src/main/res/values-oc/strings.xml | 8 +- app/src/main/res/values-or/strings.xml | 116 +++---- app/src/main/res/values-pa-rPK/strings.xml | 2 +- app/src/main/res/values-pa/strings.xml | 75 ++--- app/src/main/res/values-pl/strings.xml | 120 +++----- app/src/main/res/values-pt-rBR/strings.xml | 113 +++---- app/src/main/res/values-pt-rPT/strings.xml | 126 +++----- app/src/main/res/values-pt/strings.xml | 121 +++----- app/src/main/res/values-ro/strings.xml | 71 ++--- app/src/main/res/values-ru/strings.xml | 119 +++----- app/src/main/res/values-ryu/strings.xml | 82 ++--- app/src/main/res/values-sat/strings.xml | 75 ++--- app/src/main/res/values-sc/strings.xml | 114 +++---- app/src/main/res/values-si/strings.xml | 4 +- app/src/main/res/values-sk/strings.xml | 112 +++---- app/src/main/res/values-sl/strings.xml | 34 +-- app/src/main/res/values-so/strings.xml | 85 ++---- app/src/main/res/values-sq/strings.xml | 89 ++---- app/src/main/res/values-sr/strings.xml | 110 ++----- app/src/main/res/values-sv/strings.xml | 268 ++++++++--------- app/src/main/res/values-sw/strings.xml | 6 +- app/src/main/res/values-ta/strings.xml | 33 +- app/src/main/res/values-te/strings.xml | 39 +-- app/src/main/res/values-th/strings.xml | 55 ++-- app/src/main/res/values-tl/strings.xml | 12 +- app/src/main/res/values-tok/strings.xml | 6 +- app/src/main/res/values-tr/strings.xml | 107 ++----- app/src/main/res/values-tt/strings.xml | 2 +- app/src/main/res/values-tzm/strings.xml | 8 +- app/src/main/res/values-uk/strings.xml | 120 +++----- app/src/main/res/values-und/strings.xml | 2 +- app/src/main/res/values-ur/strings.xml | 34 +-- app/src/main/res/values-vi/strings.xml | 112 +++---- app/src/main/res/values-zh-rCN/strings.xml | 138 +++------ app/src/main/res/values-zh-rHK/strings.xml | 82 ++--- app/src/main/res/values-zh-rTW/strings.xml | 52 +--- .../metadata/android/ar/changelogs/1015.txt | 1 + .../metadata/android/gl/changelogs/1015.txt | 1 + .../metadata/android/it/changelogs/1007.txt | 2 +- .../android/pt-PT/changelogs/1015.txt | 1 + .../metadata/android/pt/changelogs/1015.txt | 1 + .../composeResources/values-ace/strings.xml | 2 +- .../composeResources/values-af/strings.xml | 6 +- .../values-ar-rLY/strings.xml | 2 +- .../composeResources/values-ar/strings.xml | 91 +++++- .../composeResources/values-as/strings.xml | 2 +- .../composeResources/values-ast/strings.xml | 2 +- .../composeResources/values-az/strings.xml | 18 +- .../values-b+uz+Latn/strings.xml | 2 +- .../composeResources/values-bar/strings.xml | 2 +- .../composeResources/values-ber/strings.xml | 2 +- .../composeResources/values-bm/strings.xml | 2 +- .../values-bn-rIN/strings.xml | 2 +- .../composeResources/values-bn/strings.xml | 2 +- .../composeResources/values-br/strings.xml | 2 +- .../composeResources/values-bs/strings.xml | 2 +- .../composeResources/values-ca/strings.xml | 2 +- .../composeResources/values-ckb/strings.xml | 2 +- .../composeResources/values-cs/strings.xml | 99 ++++++ .../composeResources/values-cy/strings.xml | 2 +- .../composeResources/values-da/strings.xml | 2 +- .../composeResources/values-de/strings.xml | 46 +++ .../composeResources/values-dum/strings.xml | 2 +- .../composeResources/values-el/strings.xml | 2 +- .../values-en-rGB/strings.xml | 2 +- .../composeResources/values-eo/strings.xml | 2 +- .../composeResources/values-eu/strings.xml | 2 +- .../composeResources/values-fa/strings.xml | 12 +- .../composeResources/values-fi/strings.xml | 2 +- .../composeResources/values-fil/strings.xml | 2 +- .../composeResources/values-fr/strings.xml | 8 +- .../composeResources/values-gl/strings.xml | 143 +++++++++ .../composeResources/values-gu/strings.xml | 2 +- .../composeResources/values-hu/strings.xml | 131 +++++++- .../composeResources/values-hy/strings.xml | 2 +- .../composeResources/values-ia/strings.xml | 2 +- .../composeResources/values-in/strings.xml | 124 +++++++- .../composeResources/values-jv/strings.xml | 2 +- .../composeResources/values-ka/strings.xml | 2 +- .../composeResources/values-kab/strings.xml | 2 +- .../composeResources/values-kk/strings.xml | 2 +- .../composeResources/values-kmr/strings.xml | 2 +- .../composeResources/values-kn/strings.xml | 2 +- .../composeResources/values-ko/strings.xml | 4 +- .../composeResources/values-ku/strings.xml | 2 +- .../composeResources/values-lmo/strings.xml | 2 +- .../composeResources/values-lt/strings.xml | 2 +- .../composeResources/values-mk/strings.xml | 2 +- .../composeResources/values-ml/strings.xml | 2 +- .../composeResources/values-mn/strings.xml | 2 +- .../composeResources/values-mr/strings.xml | 2 +- .../composeResources/values-ms/strings.xml | 2 +- .../composeResources/values-my/strings.xml | 2 +- .../composeResources/values-nap/strings.xml | 2 +- .../values-nb-rNO/strings.xml | 2 +- .../composeResources/values-ne/strings.xml | 2 +- .../values-nl-rBE/strings.xml | 2 +- .../composeResources/values-nn/strings.xml | 2 +- .../composeResources/values-nqo/strings.xml | 2 +- .../composeResources/values-oc/strings.xml | 2 +- .../composeResources/values-or/strings.xml | 2 +- .../values-pa-rPK/strings.xml | 2 +- .../composeResources/values-pl/strings.xml | 46 +++ .../values-pt-rBR/strings.xml | 16 + .../values-pt-rPT/strings.xml | 16 + .../composeResources/values-pt/strings.xml | 123 ++++++++ .../composeResources/values-ryu/strings.xml | 2 +- .../composeResources/values-sc/strings.xml | 2 +- .../composeResources/values-si/strings.xml | 2 +- .../composeResources/values-sl/strings.xml | 2 +- .../composeResources/values-sq/strings.xml | 2 +- .../composeResources/values-sr/strings.xml | 2 +- .../composeResources/values-sv/strings.xml | 25 +- .../composeResources/values-sw/strings.xml | 2 +- .../composeResources/values-ta/strings.xml | 2 +- .../composeResources/values-te/strings.xml | 2 +- .../composeResources/values-th/strings.xml | 12 + .../composeResources/values-ti/strings.xml | 2 +- .../composeResources/values-tl/strings.xml | 2 +- .../composeResources/values-tok/strings.xml | 2 +- .../composeResources/values-tt/strings.xml | 2 +- .../composeResources/values-tzm/strings.xml | 2 +- .../composeResources/values-und/strings.xml | 2 +- .../composeResources/values-ur/strings.xml | 2 +- .../values-zh-rCN/strings.xml | 46 +++ .../values-zh-rHK/strings.xml | 2 +- 195 files changed, 3465 insertions(+), 4853 deletions(-) create mode 100644 fastlane/metadata/android/ar/changelogs/1015.txt create mode 100644 fastlane/metadata/android/gl/changelogs/1015.txt create mode 100644 fastlane/metadata/android/pt-PT/changelogs/1015.txt create mode 100644 fastlane/metadata/android/pt/changelogs/1015.txt diff --git a/app/src/main/res/values-ace/strings.xml b/app/src/main/res/values-ace/strings.xml index 6691bee80..7db1cff49 100644 --- a/app/src/main/res/values-ace/strings.xml +++ b/app/src/main/res/values-ace/strings.xml @@ -1,7 +1,7 @@ Bagi ngen - Nyoe meukeusud droe: %1$s\? + Nyoe meukeusud droe: %1$s? Peuato Seutot Peutren berkaih stream @@ -12,7 +12,7 @@ Peubateu Pasang Hana jiteumeung player (droe jeut pasang VLC keu puta nyan). - Hana jiteumeung stream player. Pasang VLC\? + Hana jiteumeung stream player. Pasang VLC? Peuleumah bak %1$s Theun \"Seutot\" keu peuphon - \ No newline at end of file + diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 97e64811b..415bfaeb7 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -1,6 +1,6 @@ - Geen stream-speler gevind nie. Installeer VLC\? + Geen stream-speler gevind nie. Installeer VLC? Tik op \"Soek\" om aan die gang te kom Lees lisensie Gereelde vrae diff --git a/app/src/main/res/values-ar-rLY/strings.xml b/app/src/main/res/values-ar-rLY/strings.xml index 05e3813d5..e206e0491 100644 --- a/app/src/main/res/values-ar-rLY/strings.xml +++ b/app/src/main/res/values-ar-rLY/strings.xml @@ -50,12 +50,9 @@ حذف سجل المشاهدة بالكامل؟ تشغيل بواسطة كودي تم حذف عنصر واحد. - ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة اذا كنت تستخدم بيانات اشتراك انترنت. -\n -\nهل تريد الاستمرار؟ + ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة اذا كنت تستخدم بيانات اشتراك انترنت. \n \nهل تريد الاستمرار؟ إغلاق - يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك. -\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال. + يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك. \nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال. لاشيء مُحدّد واحدة محددة @@ -149,9 +146,7 @@ تم وضع التالي على قائمة الانتظار اسحب العناصر لإزالتها معلومات: - حساب منشئ المحتوى قد تم إنهائه. -\nلن يتمكن NewPipe من تحميل هذه الخلاصة في المستقبل. -\nهل تريد إلغاء الاشتراك من هذه القناة؟ + حساب منشئ المحتوى قد تم إنهائه. \nلن يتمكن NewPipe من تحميل هذه الخلاصة في المستقبل. \nهل تريد إلغاء الاشتراك من هذه القناة؟ تصغير إلى مشغل منبثق تم إغلاق NewPipe أثناء العمل على الملف مشغل الخلفية @@ -182,17 +177,7 @@ عرض على GitHub التفاصيل: تردد الصوت - هل تعتقد أن تحميل التغذية بطيءٌ جدًا؟ إذا كان الأمر كذلك، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه). -\n -\nيقدم NewPipe استراتيجيتين لتحميل الخلاصة: -\n• جلب قناة الاشتراك بأكملها، وهي بطيئة ولكنها كاملة. -\n• استخدام نقطة نهاية خدمة مخصصة، وهي سريعة ولكنها عادةً لا تكتمل. -\n -\nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل. -\n -\nيوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها. -\n -\nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة. + هل تعتقد أن تحميل التغذية بطيءٌ جدًا؟ إذا كان الأمر كذلك، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه). \n \nيقدم NewPipe استراتيجيتين لتحميل الخلاصة: \n• جلب قناة الاشتراك بأكملها، وهي بطيئة ولكنها كاملة. \n• استخدام نقطة نهاية خدمة مخصصة، وهي سريعة ولكنها عادةً لا تكتمل. \n \nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل. \n \nيوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها. \n \nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة. تم حذف الملف تنزيل صفحة القناة @@ -356,8 +341,7 @@ %d ثانية %d ثانية - سيتم سؤالك عن مكان حفظ كل تنزيل. -\nتمكين منتقي مجلد النظام (SAF) إذا كنت تريد التنزيل إلى بطاقة SD خارجية + سيتم سؤالك عن مكان حفظ كل تنزيل. \nتمكين منتقي مجلد النظام (SAF) إذا كنت تريد التنزيل إلى بطاقة SD خارجية استئناف التشغيل جودة غير معروفة هذا المحتوى غير متوفر في بلدك. @@ -374,8 +358,7 @@ قائمة انتظار تلقائيّة غير محمل: %d قائمة الانتظار - هذا الفيديو مقيد بالفئة العمرية. -\nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـ NewPipe الوصول إلى أي من تدفقات الفيديو الخاصة به، وبالتالي لا يتمكن من تشغيلها. + هذا الفيديو مقيد بالفئة العمرية. \nنظرًا لسياسات YouTube الجديدة المتعلقة بمقاطع الفيديو المقيدة بالفئة العمرية، لا يمكن لـ NewPipe الوصول إلى أي من تدفقات الفيديو الخاصة به، وبالتالي لا يتمكن من تشغيلها. إضافة إلى قائمة التشغيل القنوات لا تظهر @@ -412,9 +395,7 @@ هل تريد أيضا استيراد الإعدادات؟ امسح البيانات الوصفيّة المخزّنة مؤقّتًا حذف الملفات المحملة - يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث -\n -\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة + يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث \n \nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة موافق تتبّع مقاطع الفيديو التي تمّت مشاهدتها لم يتم العثور على أي بث صوتي @@ -424,8 +405,7 @@ التاريخ تشغيل في وضع منبثق كتم الصوت - هذا الإذن مطلوب -\nللفتح في وضع النافذة المنبثقة + هذا الإذن مطلوب \nللفتح في وضع النافذة المنبثقة الموجز ستتم إزالة مقاطع الفيديو التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل. \nهل أنت واثق؟ لا يمكن التراجع عن هذا! عدم الإعجاب @@ -443,8 +423,7 @@ لغة التطبيق تحميل الموجز… التحقق يدويا من وجود إصدارات جديدة - لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. -\nالرجاء تثبيت مدير ملفات متوافق مع إطار عمل الوصول إلى التخزين + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. \nالرجاء تثبيت مدير ملفات متوافق مع إطار عمل الوصول إلى التخزين إظهار خيار تعطل عند استخدام المشغل يرجى مراجعة ما إذا توجد بالفعل مشكلة تناقش التحطم الموجود بالفعل. عند إنشاء تذاكر مكررة، فإنك تستغرق منا وقتًا يمكن أن نقضيه في إصلاح الخطأ الفعلي. فتح قائمة انتظار التسغيل @@ -466,12 +445,7 @@ خاصية التقديم الغير دقيق تسمح للمشغل بالقفز خلال الفديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز الغير دقيق متوقف نافذة منبثقة - قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك: -\n -\n1. تمكين \"وضع سطح المكتب\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة) -\n2. انتقل إلى عنوان URL هذا: %1$s -\n3. تسجيل الدخول عندما يطلب منك -\n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه. + قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك: \n \n1. تمكين \"وضع سطح المكتب\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة) \n2. انتقل إلى عنوان URL هذا: %1$s \n3. تسجيل الدخول عندما يطلب منك \n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه. اختر قائمة تشغيل الحد العمري لا يوجد تطبيق على جهازك يمكنه فتح هذا @@ -583,9 +557,7 @@ خلط بدء التشغيل تلقائياً — %s إغلاق الدرج - هذا المحتوى ليس مدعومًا من قبل NewPipe. -\n -\nنأمل أن يكون مدعومًا في التحديثات القادمة. + هذا المحتوى ليس مدعومًا من قبل NewPipe. \n \nنأمل أن يكون مدعومًا في التحديثات القادمة. لا دقيقة دقيقة واحدة @@ -605,15 +577,7 @@ الإعجابات خطأ اختر مجلد التنزيل للملفات الصوتية - استيراد اشتراكات YouTube من Google takeout: -\n -\n1. انتقل إلى عنوان URL هذا: %1$s -\n2. تسجيل الدخول عند سؤالك -\n3. انقر على \"جميع البيانات المدرجة\"، ثم على \"إلغاء تحديد جميع\"، ثم حدد فقط \"الاشتراكات\" وانقر على \"موافق\" -\n4. انقر على \"الخطوة التالية\" ثم على \"إنشاء التصدير\" -\n5. انقر على زر \"تحميل\" بعد ظهوره -\n6. انقر على IMPORT FILE أدناه وحدد الملف البريدي تحميلها -\n7. [إذا فشل استيراد الرمز البريدي] استخراج ملف .csv (عادة تحت عنوان \"يوتيوب ويوتيوب الموسيقى / الاشتراكات / الاشتراكات.csv\")، انقر على IMPORT FILE أدناه وحدد ملف csv المستخرج + استيراد اشتراكات YouTube من Google takeout: \n \n1. انتقل إلى عنوان URL هذا: %1$s \n2. تسجيل الدخول عند سؤالك \n3. انقر على \"جميع البيانات المدرجة\"، ثم على \"إلغاء تحديد جميع\"، ثم حدد فقط \"الاشتراكات\" وانقر على \"موافق\" \n4. انقر على \"الخطوة التالية\" ثم على \"إنشاء التصدير\" \n5. انقر على زر \"تحميل\" بعد ظهوره \n6. انقر على IMPORT FILE أدناه وحدد الملف البريدي تحميلها \n7. [إذا فشل استيراد الرمز البريدي] استخراج ملف .csv (عادة تحت عنوان \"يوتيوب ويوتيوب الموسيقى / الاشتراكات / الاشتراكات.csv\")، انقر على IMPORT FILE أدناه وحدد ملف csv المستخرج جارٍ التحميل هذا مسار SoundCloud Go+، على الأقل في بلدك، لذلك لا يمكن دفقه أو تنزيله بواسطة NewPipe. فقط على شبكة Wi-Fi @@ -719,8 +683,7 @@ صفحة فارغة أبدا فشل النسخ إلى الحافظة - من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية. -\nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا. + من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية. \nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا. فرض الإبلاغ عن استثناءات Rx غير القابلة للتسليم خارج دورة حياة الجزء أو النشاط بعد التخلص منها ضبط إشعار مشغل البث الحالي تصدير قاعدة البيانات @@ -809,9 +772,7 @@ إذا كانت لديك أفكار؛ أو ترجمة، أو تغييرات تخص التصميم، أو تنظيف و تحسين الشفرة البرمجية، أو تعديلات عميقة عليها، فتذكر أنّ مساعدتك دائما موضع ترحيب. وكلما أتممنا شيئا كلما كان ذلك أفضل! اختار الألسنة التي تودّ ظهورها على الصفحة الرئيسية مجلد تحميل الفيديو - هذا الفيديو مقيد بالفئة العمرية. -\n -\nقم بتفيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته. + هذا الفيديو مقيد بالفئة العمرية. \n \nقم بتفيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته. تجاهل أحداث ازرار الوسائط الأجهزة اختر لسانًا الصوت @@ -837,16 +798,14 @@ منجز تقرير عن المشكلة أُضيفَ إلى قائمة الانتظار - لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. -\nيرجى تثبيت مدير ملفات أو محاولة تعطيل \"%s\" في إعدادات التنزيل + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. \nيرجى تثبيت مدير ملفات أو محاولة تعطيل \"%s\" في إعدادات التنزيل مشغل الفيديو بواسطة %s وصف ريثما شارك الرابط التشعبي للقائمة شارِكها بالترجمات النصية - %1$s -\n%2$s + %1$s \n%2$s شارِك قائمة التشغيل - %1$s: %2$s diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 4574dc17f..0b75c75e5 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -3,7 +3,7 @@ يتم التشغيل في الخلفية إلغاء داكن - صيغة الصوت الافتراضية + تنسيق الصوت الافتراضي الدقة الافتراضية عدم الإعجاب الإعجابات @@ -34,7 +34,7 @@ مشاركة مشاركة بواسطة عرض مقاطع الفيديو \"التالية\" و \"المشابهة\" - اعرض خيار لتشغيل الفيديو عبر مركز وسائط Kodi + إظهار خيار لتشغيل فيديو عبر مركز وسائط Kodi عرض خيار التشغيل بواسطة كودي السمة منشورة على %1$s @@ -64,24 +64,24 @@ السجل السجل فتح في الوضع المنبثق - يزيل الصوت في بعض الجودات + ‎يزيل الصوت عند بعض الدقات تم إلغاء الاشتراك في القناة تعذر تغيير حالة الاشتراك تعذر تحديث الاشتراك نافذة منبثقة - الدقة الافتراضية للنوافذ المنبثقة - عرض دقّات أعلى - فقط بعض الأجهزة تدعم تشغيل مقاطع فيديو 2K/4K - صيغة الفيديو الافتراضية - تذكر خصائص النوافذ المنبثقة - تذكر آخر مكان وحجم للنافذة المنبثقة + دقة النافذة المنبثقة الافتراضية + إظهار الدقات الأعلى + يمكن لبعض الأجهزة فقط تشغيل فيديوهات بدقة 2K/4K + تنسيق الفيديو الافتراضي + تذكر خصائص النافذة المنبثقة + تذكّر آخر حجم وموضع للنافذة المنبثقة اقتراحات البحث اختر الاقتراحات التي تريد إظهارها عند البحث سجل البحث تخزين طلبات البحث محليًّا تتبّع مقاطع الفيديو التي تمّت مشاهدتها استئناف التشغيل - متابعة التشغيل بعد المقاطعات (مثل المكالمات الهاتفية) + متابعة التشغيل بعد الانقطاعات (مثل المكالمات الهاتفية) إظهار تلميح \"اضغط للفتح\" إظهار التلميح عند الضغط على الخلفية أو الزر المنبثق في الفيديو \"التفاصيل:\" المشغل @@ -140,8 +140,7 @@ يُرجى الانتظار… تم نسخه إلى الحافظة يرجى تحديد مجلد التنزيل لاحقا في الإعدادات - هذا الإذن مطلوب -\nللفتح في وضع النافذة المنبثقة + هذا الإذن مطلوب \nللفتح في وضع النافذة المنبثقة السماح بالرموز في أسماء الملفات يتم استبدال الرموز غير المسموح بها بهذه القيمة استبدال الحرف @@ -210,7 +209,7 @@ تصدير قاعدة البيانات يلغي السجل الحالي والاشتراكات وقوائم التشغيل والإعدادات (اختياريًا) تصدير السجل، وقوائم تشغيل، والإعدادات، والاشتراكات - عرض المعلومات + إظهار المعلومات إضافة إلى تصحيح الأخطاء لم يتم العثور على أي بث مرئي @@ -237,8 +236,8 @@ تكبير تنزيل ملف البث الإشارات المرجعية - استعمال التقديم السريع غير دقيق - خاصية التقديم غير دقيق تسمح للمشغل بالقفز خلال الفيديو بشكل أسرع مع دقة قفز أقل. خاصية القفز ل5، 15 او 25 لا تعمل مع القفز غير دقيق + استخدام التنقّل السريع غير الدقيق + يتيح التنقّل غير الدقيق للمشغّل الانتقال إلى المواضع بسرعة أكبر وبدقة أقل. لا يعمل التنقّل بمقدار 5 أو 15 أو 25 ثانية مع هذا تم إفراغ مساحة ذاكرة التخزين المؤقتة الخاصة بالصور الملف لا يوجد المجلد @@ -258,7 +257,7 @@ امسح البيانات الوصفيّة المخزّنة مؤقّتًا إزالة جميع بيانات صفحات الويب المخزنة مؤقّتًا تم محو ذاكرة التخزين المؤقتّة للبيانات الوصفيّة - وضع البث القادم تلقائيا في قائمة الانتظار + إضافة المقطع التالي إلى قائمة التشغيل تلقائيًا استمر عند إنهاء قائمة التشغيل (غير المتكررة) من خلال إلحاق البث المرتبط تعيين كصورة مصغرة لقائمة التشغيل تفضيل قائمة التشغيل @@ -286,28 +285,15 @@ آخر ما تم تشغيله الأكثر تشغيلا هذا سوف يُزيل إعداداتك الحالية. - طريقة \'التشغيل\' المفضلة + إجراء \'الفتح\' المفضّل الإجراء الافتراضي عند فتح المحتوى — %s مشغل الخلفية - المشغل المنبثق + مشغل النافذة المنبثقة نسخة احتياطية تعذر استيراد الاشتراكات لا يمكن تصدير الاشتراكات - استيراد اشتراكات YouTube من Google takeout: -\n -\n1. انتقل إلى عنوان URL هذا: %1$s -\n2. تسجيل الدخول عند سؤالك -\n3. انقر على \"جميع البيانات المدرجة\"، ثم على \"إلغاء تحديد جميع\"، ثم حدد فقط \"الاشتراكات\" وانقر على \"موافق\" -\n4. انقر على \"الخطوة التالية\" ثم على \"إنشاء التصدير\" -\n5. انقر على زر \"تحميل\" بعد ظهوره -\n6. انقر على IMPORT FILE أدناه وحدد الملف البريدي تحميلها -\n7. [إذا فشل استيراد الرمز البريدي] استخراج ملف .csv (عادة تحت عنوان \"يوتيوب ويوتيوب الموسيقى / الاشتراكات / الاشتراكات.csv\")، انقر على IMPORT FILE أدناه وحدد ملف csv المستخرج - قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك: -\n -\n1. تمكين \"وضع سطح المكتب\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة) -\n2. انتقل إلى عنوان URL هذا: %1$s -\n3. تسجيل الدخول عندما يطلب منك -\n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه. + استيراد اشتراكات YouTube من Google takeout: \n \n1. انتقل إلى عنوان URL هذا: %1$s \n2. تسجيل الدخول عند سؤالك \n3. انقر على \"جميع البيانات المدرجة\"، ثم على \"إلغاء تحديد جميع\"، ثم حدد فقط \"الاشتراكات\" وانقر على \"موافق\" \n4. انقر على \"الخطوة التالية\" ثم على \"إنشاء التصدير\" \n5. انقر على زر \"تحميل\" بعد ظهوره \n6. انقر على IMPORT FILE أدناه وحدد الملف البريدي تحميلها \n7. [إذا فشل استيراد الرمز البريدي] استخراج ملف .csv (عادة تحت عنوان \"يوتيوب ويوتيوب الموسيقى / الاشتراكات / الاشتراكات.csv\")، انقر على IMPORT FILE أدناه وحدد ملف csv المستخرج + قم باستيراد ملف تعريف SoundCloud عن طريق كتابة عنوان URL أو معرفك: \n \n1. تمكين \"وضع سطح المكتب\" في متصفح الويب (الموقع غير متاح للأجهزة المحمولة) \n2. انتقل إلى عنوان URL هذا: %1$s \n3. تسجيل الدخول عندما يطلب منك \n4. انسخ عنوان URL للملف الشخصي الذي تمت إعادة توجيهك إليه. ضع في اعتبارك أن هذه العملية يمكن أن تكون مكلفة إذا كنت تستخدم بيانات اشتراك انترنت. \n \nهل تريد الاستمرار؟ ضوابط سرعة التشغيل سرعة الأداء @@ -315,22 +301,21 @@ إلغاء الارتباط (قد يسبب تشويه) هل تريد أيضا استيراد الإعدادات؟ سياسة خصوصية NewPipe - يأخذ مشروع NewPipe خصوصيتك على محمل الجد. لذلك، لا يجمع التطبيق أي بيانات دون موافقتك.\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير الأعطال. + يهتم مشروع NewPipe بخصوصيتك، لذلك لا يجمع التطبيق أي بيانات دون موافقتك.\nتوضح سياسة الخصوصية الخاصة بـ NewPipe بالتفصيل البيانات التي يتم إرسالها وحفظها عند إرسال تقرير عن تعطل التطبيق. اقرأ سياسة الخصوصية - من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية. -\nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا. + من أجل الامتثال للائحة الأوروبية العامة لحماية البيانات (GDPR)، فإننا نلفت انتباهك إلى سياسة خصوصية NewPipe. يرجى قراءتها بعناية. \nويجب عليك قبولها لإرسال تقرير الأخطاء إلينا. قبول رفض - لا حدود - الحد من جودة الفيديو عند استخدام بيانات الهاتف المحمول + بدون حد + تقييد الدقة عند استخدام بيانات الجوال تسريع إلى الأمام أثناء الصمت خطوة إعادة تعيين - تصغير عند تبديل التطبيق + التصغير عند تبديل التطبيق الإجراء عند التبديل إلى تطبيق آخر من مشغل الفيديو الرئيسي — %s لا شيء - تصغير إلى مشغل الخلفية - تصغير إلى مشغل منبثق + التصغير إلى مشغل الخلفية + التصغير إلى مشغل النافذة المنبثقة القنوات قوائم التشغيل المسارات @@ -386,7 +371,7 @@ مفيد عند التبديل إلى بيانات الجوال، ولكن لا يمكن تعليق بعض التنزيلات إظهار التعليقات عطّله لإخفاء التعليقات - تشغيل تلقائي + التشغيل التلقائي لا توجد تعليقات تعذر تحميل التعليقات إغلاق @@ -410,8 +395,7 @@ بدء التنزيلات إيقاف التحميل مؤقتًا اسأل عن مكان التنزيل - سيتم سؤالك عن مكان حفظ كل تنزيل. -\nتمكين منتقي مجلد النظام (SAF) إذا كنت تريد التنزيل إلى بطاقة SD خارجية + سيتم سؤالك عن مكان حفظ كل تنزيل. \nتمكين منتقي مجلد النظام (SAF) إذا كنت تريد التنزيل إلى بطاقة SD خارجية استخدام منتقي مجلد النظام (SAF) يسمح \"Storage Access Framework\" بالتنزيل على بطاقة SD خارجية حذف مواقف التشغيل @@ -437,7 +421,7 @@ يستمع إليها %s شخصًا يستمع إليها %s شخص
- تسريع إلى الأمام/-ترجيع وقت البحث + مدة التنقّل للتقديم السريع/الإرجاع مثيلات خوادم پيرتيوب حدد مثيلات PeerTube المفضلة لديك إضافة نموذج @@ -469,17 +453,7 @@ %d ثانية %d ثانية
- هل تعتقد أن تحميل التغذية بطيءٌ جدًا؟ إذا كان الأمر كذلك، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه). -\n -\nيقدم NewPipe استراتيجيتين لتحميل الخلاصة: -\n• جلب قناة الاشتراك بأكملها، وهي بطيئة ولكنها كاملة. -\n• استخدام نقطة نهاية خدمة مخصصة، وهي سريعة ولكنها عادةً لا تكتمل. -\n -\nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل. -\n -\nيوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها. -\n -\nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة. + هل تعتقد أن تحميل التغذية بطيءٌ جدًا؟ إذا كان الأمر كذلك، فحاول تمكين التحميل السريع (يمكنك تغييره في الإعدادات أو بالضغط على الزر أدناه). \n \nيقدم NewPipe استراتيجيتين لتحميل الخلاصة: \n• جلب قناة الاشتراك بأكملها، وهي بطيئة ولكنها كاملة. \n• استخدام نقطة نهاية خدمة مخصصة، وهي سريعة ولكنها عادةً لا تكتمل. \n \nالفرق بين الاثنين هو أن العنصر السريع عادة ما يفتقر إلى بعض المعلومات، مثل مدة العنصر أو نوعه (لا يمكن التمييز بين مقاطع الفيديو المباشرة والأخرى العادية) وقد يعيد عناصر أقل. \n \nيوتيوب هو مثال على الخدمة التي تقدمها هذه طريقة سريعة مع تغذية RSS الخاصة بها. \n \nلذا فإن الاختيار يتلخص في ما تفضله: السرعة أو المعلومات الدقيقة. تعطيل الوضع السريع تمكين الوضع السريع متوفر في بعض الخدمات، وعادةً ما يكون أسرع بكثير ولكن قد يُرجع كمية محدودة من العناصر وغالبًا ما تكون معلومات غير مكتملة (مثلًا بدون مدة أو نوع عنصر أو حالة مباشرة) @@ -533,17 +507,13 @@ نظرًا لقيود مشغل ExoPlayer مدة التقديم تم ضبطها الى %d ثانية إلغاء الكتم كتم الصوت - هذا المحتوى ليس مدعومًا من قبل NewPipe. -\n -\nنأمل أن يكون مدعومًا في التحديثات القادمة. + هذا المحتوى ليس مدعومًا من قبل NewPipe. \n \nنأمل أن يكون مدعومًا في التحديثات القادمة. ∞ فيديو +100 فيديو الفنانون الألبومات الأغاني - هذا الفيديو مقيد بالفئة العمرية. -\n -\nقم بتشغيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته. + هذا الفيديو مقيد بالفئة العمرية. \n \nقم بتشغيل \"%1$s\" في الإعدادات إذا كنت تريد رؤيته. نعم، ومقاطع الفيديو التي تمت مشاهدتها جزئيًا سَتتم إزالة البُثوث التي تمت مشاهدتها قبل وبعد إضافتها إلى قائمة التشغيل.\nهل أنت متأكد؟ إزالة البثوث التي تمت مشاهدتها؟ @@ -562,15 +532,15 @@ تقرير على GitHub نسخ التقرير مُنسق عرض نتائج ل: %s - أبدا - فقط على شبكة Wi-Fi + أبدًا + عبر Wi-Fi فقط بدء التشغيل تلقائيًا — %s تشغيل قائمة الانتظار تعذر التعرف على الرابط. فتح باستخدام تطبيق آخر؟ قائمة انتظار تلقائيّة سيتم استبدال قائمة انتظار للمشغل النشط - قد يؤدي التبديل من مشغل إلى آخر إلى استبدال قائمة الانتظار الخاصة بك - طلب تأكيد قبل مسح قائمة الانتظار + قد يؤدي التبديل من مشغّل إلى آخر إلى استبدال قائمة الانتظار الخاصة بك + اطلب التأكيد قبل مسح قائمة الانتظار لا شيء جارٍ التحميل خلط @@ -626,8 +596,8 @@ تلقائي (سمة الجهاز) الثيم الليلي إظهار تفاصيل القناة - قم بتعطيل نفق الوسائط إذا واجهت شاشة سوداء أو تقطيع اثناء تشغيل الفيديو. - تعطيل نفق الوسائط + عطّل تمرير الوسائط النفقي إذا واجهت شاشة سوداء أو تقطيعًا أثناء تشغيل الفيديو. + تعطيل تمرير الوسائط النفقي داخلي خاص غير مدرج @@ -646,22 +616,20 @@ فتح الموقع تم إنهاء الحساب لا يوفر وضع التغذية السريعة مزيدًا من المعلومات حول هذا الموضوع. - حساب منشئ المحتوى قد تم إنهائه. -\nلن يتمكن NewPipe من تحميل هذه الخلاصة في المستقبل. -\nهل تريد إلغاء الاشتراك من هذه القناة؟ + حساب منشئ المحتوى قد تم إنهائه. \nلن يتمكن NewPipe من تحميل هذه الخلاصة في المستقبل. \nهل تريد إلغاء الاشتراك من هذه القناة؟ تعذر تحميل تغذية لـ\'%s\'. خطأ في تحميل الخلاصة بدءًا من Android 10، يتم دعم \"Storage Access Framework\" فقط سيتم سؤالك عن مكان حفظ كل تنزيل لم يتم تعيين مجلد التحميل، الرجاء اختيار مجلد التحميل الافتراضي الآن - إيقاف - تشغيل + متوقف + يعمل وضع الجهاز اللوحي تم تعطيل التعليقات - لا تظهر + عدم الإظهار جودة منخفضة (أصغر) جودة عالية (أكبر) - معاينة مصغرة على شريط التمرير + معاينة مصغّرة لشريط التقدّم وضع علامة على تمت مشاهدته أُعجب بها منشئ المحتوى اقتراحات البحث عن بعد @@ -683,8 +651,8 @@ اكتملت التنزيلات%s اكتملت التنزيلات%s - لا تبدأ تشغيل مقاطع الفيديو في المشغل المصغر، ولكن قم بتدوير وضع ملء الشاشة مباشرة، إذا تم تأمين التدوير التلقائي. لا يزال بإمكانك الوصول إلى المشغل المصغر عن طريق الخروج من ملء الشاشة - بدء تشغيل المشغل الرئيسي في وضع ملء الشاشة + لا تبدأ تشغيل الفيديوهات في المشغّل المصغّر، بل انتقل مباشرةً إلى وضع ملء الشاشة إذا كان تدوير الشاشة التلقائي مقفلًا. يمكنك الوصول إلى المشغّل المصغّر عند الخروج من وضع ملء الشاشة + بدء تشغيل الفيديو في وضع ملء الشاشة وضع التالي على قائمة الانتظار تم وضع التالي على قائمة الانتظار جاري المعالجة ... قد يستغرق لحظة @@ -700,14 +668,12 @@ واجه NewPipe خطأ، اضغط للتقرير حدث خطأ، انظر للإشعار قم بإنشاء تنبيه بالخطأ - لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. -\nيرجى تثبيت مدير ملفات أو محاولة تعطيل \"%s\" في إعدادات التنزيل + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. \nيرجى تثبيت مدير ملفات أو محاولة تعطيل \"%s\" في إعدادات التنزيل إظهار خطأ snackbar - لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. -\nالرجاء تثبيت مدير ملفات متوافق مع إطار عمل الوصول إلى التخزين + لم يتم العثور على مدير ملفات مناسب لهذا الإجراء. \nالرجاء تثبيت مدير ملفات متوافق مع إطار عمل الوصول إلى التخزين تعليق مثبت LeakCanary غير متوفر - الافتراضي ExoPlayer + الإعداد الافتراضي لـ ExoPlayer تكوين إشعار مشغل البث الحالي الإشعارات تحميل تفاصيل البث… @@ -743,7 +709,7 @@ حدد الجودة للمشغلين الخارجيين تنسيق غير معروف جودة غير معروفة - حجم الفاصل الزمني لتحميل التشغيل + حجم فترة تحميل التشغيل الأسئلة الشائعة إذا كنت تواجه مشكلة في استخدام التطبيق، فتأكد من مراجعة هذه الإجابات على الأسئلة الشائعة! عرض على الموقع الإلكتروني @@ -758,8 +724,8 @@ البطاقة تمت إضافة وقت (أوقات) مكررة %d تحتوي قوائم التشغيل رمادية اللون بالفعل على هذا العنصر. - مفيد ، على سبيل المثال ، إذا كنت تستخدم سماعة رأس بأزرار مادية مكسورة - تجاهل ضغطات أزرار الوسائط الفعلية على الجهاز + مفيد، على سبيل المثال، إذا كنت تستخدم سماعة رأس بأزرار فعلية معطلة + تجاهل أحداث أزرار الوسائط العتادية هل تريد إزالة جميع البثوث المكررة في قائمة التشغيل هذه؟ إظهار/إخفاء البثوث تمت مشاهدته جزئيا @@ -768,38 +734,36 @@ إزالة التكرارات؟ إظهار البثوث التالية شاهدت بالكامل - إجراء الإيماءة اليسرى - إجراء الإيماءة اليمنى + إجراء الإيماءة لليسار + إجراء الإيماءة لليمين السطوع - بدون - اختر إيماءة للنصف الأيسر من شاشة المشغل - اختر إيماءة للنصف الأيمن من شاشة المشغل - مستوى الصوت + لا شيء + اختر الإيماءة للنصف الأيسر من شاشة المشغّل + ‎اختر الإيماءة للنصف الأيمن من شاشة المشغّل + مستوي الصوت قم بتغيير حجم الفاصل الزمني للتحميل على المحتويات التدريجية (حاليا %s). قد تؤدي القيمة المنخفضة إلى تسريع التحميل الأولي - تفضل الصوت الوصفي + تفضيل الصوت الوصفي الصوت : %s المسار الصوتي يجب أن يكون هناك مسار صوتي موجود بالفعل في هذا البث حدد مسار الصوت للمشغلات الخارجية غير معروف إعدادات ExoPlayer - إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغل لتصبح سارية المفعول - استخدم دائمًا الحل البديل لإعداد سطح إخراج فيديو ExoPlayer + إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغّل لتطبيقها + استخدام حل بديل لإعداد سطح إخراج الفيديو في ExoPlayer دائمًا %1$s %2$s الافتراضي مدبلجة وصفي - حدد المسار الصوتي الأصلي بغض النظر عن اللغة + ‪اختيار المسار الصوتي الأصلي بغض النظر عن اللغة تفضيل الصوت الأصلي - حدد مسارًا صوتيًا يحتوي على أوصاف للأشخاص ضعاف البصر إذا كان ذلك متاحًا - استخدم ميزة فك ترميز وحدة فك التشفير الاحتياطية في ExoPlayer - قم بتمكين هذا الخيار إذا كانت لديك مشكلات في تهيئة وحدة فك التشفير ، والتي تعود إلى أجهزة فك التشفير ذات الأولوية الأقل إذا فشلت تهيئة وحدات فك التشفير الأولية. قد ينتج عن ذلك أداء تشغيل ضعيف مقارنة باستخدام وحدات فك التشفير الأساسية - يقوم هذا الحل البديل بتحرير وإعادة إنشاء نماذج برامج ترميز الفيديو عند حدوث تغيير في السطح، بدلا من تعيين السطح إلى برنامج الترميز مباشرة. تم استخدام هذا الإعداد بالفعل بواسطة ExoPlayer على بعض الأجهزة التي تعاني من هذه المشكلة ، وهذا الإعداد له تأثير فقط على Android 6 والإصدارات الأحدث -\n -\nقد يؤدي تمكين هذا الخيار إلى منع أخطاء التشغيل عند تبديل مشغل الفيديو الحالي أو التبديل إلى وضع ملء الشاشة + اختيار مسار صوتي يحتوي على أوصاف للمكفوفين وضعاف البصر إذا كان متاحًا + استخدام ميزة الرجوع إلى وحدة فك ترميز بديلة في ExoPlayer + فعّل هذا الخيار إذا واجهت مشكلات في تهيئة وحدة فك الترميز. عند فشل تهيئة وحدات فك الترميز الأساسية، سيستخدم التطبيق وحدات بديلة أقل أولوية، وقد يؤدي ذلك إلى أداء أضعف أثناء التشغيل + يعيد هذا الحل البديل تهيئة برامج ترميز الفيديو عند تغيير سطح العرض، بدلًا من تعيين السطح مباشرةً لبرنامج الترميز. يستخدم ExoPlayer هذا الحل بالفعل على بعض الأجهزة التي تواجه هذه المشكلة، ولا يؤثر هذا الإعداد إلا في Android 6 والإصدارات الأحدث\n\nقد يساعد تفعيل هذا الخيار على منع أخطاء التشغيل عند التبديل بين مشغلات الفيديو أو الانتقال إلى وضع ملء الشاشة انقل محدد علامة التبويب الرئيسي إلى الأسفل موضع علامات التبويب الرئيسية - تم تعطيل نفق وسائل الإعلام عن طريق التقصير على جهازك لأن نموذج جهازك معروف بأنه لا يدعمه. + تم تعطيل تمرير الوسائط النفقي افتراضيًا على جهازك لأن طراز جهازك معروف بعدم دعمه لهذه الميزة. لا توجد بثوث لا توجد بثوث مباشرة الفيديوهات @@ -841,8 +805,7 @@ الصور المصغرة مشاركة عنوان القائمة مشاركة العناوين - %1$s -\n%2$s + %1$s \n%2$s مشاركة قائمة التشغيل - %1$s: %2$s @@ -860,12 +823,9 @@ اعادة ضبط الإعداداتِ النسخ الاحتياطي والاستعادة أعيدوا جميع الإعدادات إلى قيمهم الافتراضية - ستؤدي إعادة ضبط جميع الإعدادات إلى تجاهل جميع إعداداتك المفضلة وإعادة تشغيل التطبيق. -\n -\nهل انت متأكد انك تريد المتابعة؟ + ستؤدي إعادة ضبط جميع الإعدادات إلى تجاهل جميع إعداداتك المفضلة وإعادة تشغيل التطبيق. \n \nهل انت متأكد انك تريد المتابعة؟ نعم - يمكن لـ NewPipe البحث تلقائيًا عن الإصدارات الجديدة من وقت لآخر وإعلامك بمجرد توفرها. -\nهل تريد تمكين هذا؟ + يمكن لـ NewPipe البحث تلقائيًا عن الإصدارات الجديدة من وقت لآخر وإعلامك بمجرد توفرها. \nهل تريد تمكين هذا؟ لا تستخدم الإعدادات الموجودة في عملية التصدير التي يتم استيرادها تنسيقًا عرضة للاختراق تم إهماله منذ NewPipe 0.27.0. تأكد من أن التصدير الذي يتم استيراده من مصدر موثوق به، ويفضل استخدام عمليات التصدير التي تم الحصول عليها من NewPipe 0.27.0 أو الأحدث في المستقبل فقط. سيتم قريبًا إزالة دعم استيراد الإعدادات بهذا التنسيق الضعيف تمامًا، وبعد ذلك لن تتمكن الإصدارات القديمة من NewPipe من استيراد إعدادات التصدير من الإصدارات الجديدة بعد الآن. الثانوي @@ -935,4 +895,5 @@ استيراد %d اشتراك… الدورات + البودكاست diff --git a/app/src/main/res/values-as/strings.xml b/app/src/main/res/values-as/strings.xml index fc9d5b2b6..f4caa50ec 100644 --- a/app/src/main/res/values-as/strings.xml +++ b/app/src/main/res/values-as/strings.xml @@ -9,7 +9,7 @@ ...ৰ সৈতে খোলক চেয়াৰ %1$s ত প্ৰকাশ কৰা হৈছে - কোনো ষ্ট্ৰিম প্লেয়াৰ পোৱা নগ\'ল। VLC ইনষ্টল কৰক\? + কোনো ষ্ট্ৰিম প্লেয়াৰ পোৱা নগ\'ল। VLC ইনষ্টল কৰক? ডাউনল’ড ষ্ট্ৰিম কৰা ফাইল ডাউনলোড কৰক সন্ধান কৰক @@ -22,7 +22,7 @@ আৰম্ভ কৰিবলৈ মেগনিফাইং গ্লাছৰ চিহ্নত টিপক। চাবস্ক্ৰাইব চোৱা হ\'ল (চিহ্নিত কৰক) - আপুনি \"%1$s\" বুজাইছিল নেকি\? + আপুনি \"%1$s\" বুজাইছিল নেকি? বাহ্যিক ভিডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক বাহ্যিক অডিঅ’ প্লেয়াৰ ব্যৱহাৰ কৰক Channel আনচাবস্ক্ৰাইব কৰা হ\'ল @@ -39,7 +39,7 @@ উচ্চ ৰিজ\'লিউচন দেখুৱাওক কেৱল কিছুমান ডিভাইচেহে 2K/4K ভিডিঅ’ বজাব পাৰে Kodi ৰ সৈতে বজাওক - Kode এপ ইনষ্টল\? + Kode এপ ইনষ্টল? \"Kodi ৰ সৈতে খোলক\" বিকল্প দেখুৱাওক Kodi মিডিয়া চেণ্টাৰৰ জৰিয়তে এটা ভিডিঅ\' চলাবলৈ এটা বিকল্প প্ৰদৰ্শন কৰক প্লেয়াৰটো ক্ৰেচ কৰক @@ -96,4 +96,4 @@ মন্তব্য লুকুৱাবলৈ বন্ধ কৰক \'পৰৱৰ্তী\' আৰু \'সাদৃশ্য থকা\' ভিডিঅ\' দেখুৱাওক ষ্ট্ৰিমৰ সৃষ্টিকৰ্তা, ষ্ট্ৰিমৰ বিষয়বস্তু বা এটা সন্ধান অনুৰোধৰ বিষয়ে অতিৰিক্ত তথ্যৰ সৈতে মেটা তথ্যৰ বাকচসমূহ লুকুৱাবলৈ বন্ধ কৰক - \ No newline at end of file + diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index e2faab131..0b8fcd860 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -2,7 +2,7 @@ Başlamaq üçün böyüdücü lupaya toxun. %1$s tarixində yayımlanıb - Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın\? + Yayım oynadıcı tapılmadı. \"VLC\" quraşdırılsın? Yayım oynadıcı tapılmadı (Oynatmaq üçün VLC quraşdıra bilərsiniz). Quraşdır İmtina et @@ -12,7 +12,7 @@ Yayım faylın yüklə Axtarış Tənzimləmələr - \"%1$s\" nəzərdə tuturdunuz\? + \"%1$s\" nəzərdə tuturdunuz? ilə paylaş Xarici video oynadıcı istifadə et Bəzi formatlarda səsi silir @@ -34,7 +34,7 @@ İlkin ayırdetmə Daha böyük formatlar göstər \"Kodi\" ilə Oynat - Çatışmayan \"Kore\" tətbiqi yüklənilsin\? + Çatışmayan \"Kore\" tətbiqi yüklənilsin? \"Kodi ilə Oynat\" seçimini göstər Kodi media mərkəzindən video oynatmaq üçün seçim göstər Səs @@ -109,7 +109,7 @@ Oynadıcı Cari məzmun dili Cari məzmun ölkəsi - URL\'i tanımaq olmadı. Başqa tətbiqlə açılsın\? + URL\'i tanımaq olmadı. Başqa tətbiqlə açılsın? Dəstəklənməyən URL\'i \"Növbələmək üçün basılı saxla\" tövsiyəsin göstər \"Növbəti\" və \"Oxşar\" videoları göstər @@ -131,9 +131,7 @@ Endirilənlər Endirilənlər Canlı - Bu video yaş məhdudiyyətlidir. -\n -\nOnu görmək istəyirsinizsə, tənzimləmələrdə \"%1$s\" seçimini aktivləşdirin. + Bu video yaş məhdudiyyətlidir. \n \nOnu görmək istəyirsinizsə, tənzimləmələrdə \"%1$s\" seçimini aktivləşdirin. YouTube potensial yetkin məzmunu gizlədən \"Məhdud Rejim\" təmin edir \"PeerTube\" serverləri Yığcam bildirişdə göstərmək üçün ən çoxu üç fəaliyyət seçə bilərsiniz! @@ -141,7 +139,7 @@ Axın Yalnız qrupsuz abunəlikləri göstər Yeni - Bu qrupu silmək istəyirsiniz\? + Bu qrupu silmək istəyirsiniz? Boş qrup adı %d seçildi @@ -173,15 +171,15 @@ Pleylistlər Xəta Axtarış tarixçəsi silindi - Bütün axtarış tarixçəsi silinsin\? + Bütün axtarış tarixçəsi silinsin? Açar sözlər axtarışı tarixçəsin silir Axtarış tarixçəsini sil Oynatma mövqeləri silindi - Bütün oynatma mövqeləri silinsin\? + Bütün oynatma mövqeləri silinsin? Bütün oynatma mövqelərini silir Oynatma mövqelərini sil Baxış tarixçəsi silindi - Bütün baxış tarixçəsi silinsin\? + Bütün baxış tarixçəsi silinsin? Baxış tarixçəsini təmizlə reCAPTCHA həll edərkən NewPipe saxladığı bazaları sil %s tərəfindən yaradıldı @@ -206,13 +204,12 @@ Server əlavə et Sevimli \"PeerTube\" serverlərinizi seçin Endirilmiş faylları sil - Endirmə tarixçənizi təmizləmək və ya bütün endirilmiş faylları silmək istəyirsiniz\? + Endirmə tarixçənizi təmizləmək və ya bütün endirilmiş faylları silmək istəyirsiniz? Endirmə tarixçəsini təmizlə Endirmələri başlat Endirmələri dayandır Haraya endiriləcəyini soruş - Sizdən hər endirmənin harada saxlanılacağı soruşulacaq. -\nXarici SD karta endirmək istəyirsinizsə, sistem qovluğu seçicisini (SAF) aktiv edin + Sizdən hər endirmənin harada saxlanılacağı soruşulacaq. \nXarici SD karta endirmək istəyirsinizsə, sistem qovluğu seçicisini (SAF) aktiv edin \'Yaddaş Giriş Quruluşu\' xarici SD karta endirməyə imkan verir Sistem standartı Tətbiq dili @@ -243,7 +240,7 @@ Məzmun əlçatmazdır Bütün miniatürləri yükləmək alınmadı Şəbəkə səhvi - Xarici SD karta endirmək mümkün deyil. Endirmə qovluğunun yeri sıfırlansın\? + Xarici SD karta endirmək mümkün deyil. Endirmə qovluğunun yeri sıfırlansın? Xarici yaddaş əlçatan deyil Oynadılmış yayımlar tarixçəsini və oynatma mövqelərini silir Üst məlumatı göstər @@ -271,11 +268,10 @@ Oynadıcı xətası bərpa edilir Bərpa olunmayan oynatma xətası baş verdi Oldu - Bu video yaş məhdudiyyətlidir. -\nYaş məhdudiyyəti olan videolarla bağlı yeni YouTube siyasətlərinə görə, NewPipe bu cür video yayımlara daxil ola və oynada bilməz. + Bu video yaş məhdudiyyətlidir. \nYaş məhdudiyyəti olan videolarla bağlı yeni YouTube siyasətlərinə görə, NewPipe bu cür video yayımlara daxil ola və oynada bilməz. Səs yayımı tapılmadı Digər tətbiqlərin üzərində göstərməyə icazə ver - İlkin tənzimləmələri qaytarmaq istəyirsiniz\? + İlkin tənzimləmələri qaytarmaq istəyirsiniz? Növbəti sıraya sal Təkrar Cəhd Et Cari oynatma yayımı bildirişini konfiqurasiya et @@ -326,19 +322,18 @@ Veb sayt Əlavə məlumat və xəbərlər üçün NewPipe Veb saytını ziyarət et. NewPipe-ın Məxfilik Siyasəti - NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Nəticə etibarı ilə, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır. -\nNewPipe məxfilik siyasəti xəta məlumatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir. + NewPipe layihəsi məxfiliyinizə çox ciddi yanaşır. Nəticə etibarı ilə, tətbiq sizin razılığınız olmadan heç bir məlumat toplamır. \nNewPipe məxfilik siyasəti xəta məlumatı göndərdiyiniz zaman hansı məlumatların göndərildiyini və saxlanıldığını ətraflı izah edir. Məxfilik siyasətini oxu NewPipe-ın Lisenziyası Tarixçə - Bu elementi axtarış tarixçəsindən silmək istəyirsiniz\? + Bu elementi axtarış tarixçəsindən silmək istəyirsiniz? Son Oynadılan Ən Çox Oynadılan Bölmə seç İdxal edildi Etibarlı ZIP faylı yoxdur Xəbərdarlıq: Bütün faylları idxal etmək mümkün olmadı. - Tənzimləmələri də idxal etmək istəyirsiniz\? + Tənzimləmələri də idxal etmək istəyirsiniz? Ən yaxşı 50 Yeni və populyar Yerli @@ -359,28 +354,21 @@ Səsi aç Pleylisti Əlfəcinlə Əlfəcini Silin - Bu pleylist silinsin\? + Bu pleylist silinsin? Pleylist yaradıldı Pleylist miniatürü dəyişdirildi. Avtomatik yaradıldı (heç bir yükləyici tapılmadı) Avtomatik yaradıldı Titrlər - LeakCanary yoxdur + LeakCanary mövcud deyil Yaddaş sızma monitorinqi yığın boşaltma zamanı tətbiqin cavab verməməsinə səbəb ola bilər Yaddaş sızmalarını göstər Utilizasiyadan sonra fraqment və ya fəaliyyətin yaşam dövründən kənarda, çatdırıla bilməyən Rx istisnaları barədə məlumat verməsinə məcbur et - Xidmətlərdən alınmış orijinal mətnlər yayım elementlərində görünəcək + Xidmətlərdən orijinal mətnlər yayım elementlərində görünəcək Yeni yayımları yoxlamanı işə sal - URL və ya ID\'nizi daxil etməklə SoundCloud profilini idxal edin: -\n -\n1. Veb-brauzerdə \"iş masası rejimini\" aktiv edin (sayt mobil cihazlar üçün mövcud deyil) -\n2. Bu URL\'ə keçin: %1$s -\n3. Soruşulduqda daxil olun -\n4. Yönləndirildiyiniz profilin URL\'sini kopyalayın. + URL və ya ID\'nizi daxil etməklə SoundCloud profilini idxal edin: \n \n1. Veb-brauzerdə \"iş masası rejimini\" aktiv edin (sayt mobil cihazlar üçün mövcud deyil) \n2. Bu URL\'ə keçin: %1$s \n3. Soruşulduqda daxil olun \n4. Yönləndirildiyiniz profilin URL\'sini kopyalayın. ID\'niz, soundcloud.com/ID\'niz - Unutmayın ki, bu əməliyyat şəbəkəyə ağır yük ola bilər. -\n -\nDavam etmək istəyirsiniz\? + Unutmayın ki, bu əməliyyat şəbəkəyə ağır yük ola bilər. \n \nDavam etmək istəyirsiniz? Səssizlik zamanı sürətlə irəli Yeni yayım bildirişləri Abunəliklərdən yeni yayımlar haqqında bildir @@ -395,16 +383,14 @@ Göstərməyin Endirmə uğursuz oldu Server çox iş parçalı endirmələri qəbul etmir, @string/msg_threads = 1 ilə yenidən cəhd edin - Bütün endirilmiş fayllar diskdən silinsin\? + Bütün endirilmiş fayllar diskdən silinsin? Maksimum təkrar cəhdlər Pleylistə əlavə olunandan əvvəl və sonrakı baxılan yayımlar silinəcək. \nSiz əminsiniz? Kanal qrupları Yeni axın elementləri Abunəlik köhnəlmiş hesab edilənə qədərki son yeniləmədən sonrakı vaxt — %s Axın yükləmə xətası - Bu məzmun hələ NewPipe tərəfindən dəstəklənmir. -\n -\nÜmid edirik ki, gələcək versiyada dəstəklənəcək. + Bu məzmun hələ NewPipe tərəfindən dəstəklənmir. \n \nÜmid edirik ki, gələcək versiyada dəstəklənəcək. Həm kilid ekranı fonu, həm də bildirişlər üçün miniatür istifadə et Ən Yeni Bu məzmun ölkənizdə mövcud deyil. @@ -465,9 +451,7 @@ Yeniləmələr yoxlanılır… NewPipe yeniləməsi mövcuddur! Lisenziya - Müəllifin hesabı bağlanıb. -\nNewPipe gələcəkdə bu axını yükləyə bilməyəcək. -\nBu kanaldan abunəliyi çıxarmaq istəyirsiniz\? + Müəllifin hesabı bağlanıb. \nNewPipe gələcəkdə bu axını yükləyə bilməyəcək. \nBu kanaldan abunəliyi çıxarmaq istəyirsiniz? Seçilən Çəkməcəni Bağla Video oynadıcı @@ -563,8 +547,7 @@ Android-də pulsuz, çevik yayımlanma. © %1$s, %2$s tərəfindən %3$s altında Yüklə - Bu icazə, ani görüntü rejimində -\naçmaq üçün lazımdır + Bu icazə, ani görüntü rejimində \naçmaq üçün lazımdır Buferə köçürüldü Hissələr Adını dəyişdir @@ -589,7 +572,7 @@ Ucalıq Radio \"Oynadıcını çökdür\" Göstər - Oynadıcını istifadə edərkən çökdürmə seçimini göstər + Oynadıcını istifadə edərkən çökdürmə seçimini göstərir Xəta balonu göstər Xəta bildirişi yarat Burdan idxal et @@ -692,12 +675,12 @@ Cihaz daxili media düyməsi problemlərinə məhəl qoyma Məsələn, fiziki düymələri qırılan qulaqlıq işlədirsinizsə faydalıdır Dublikatları sil - Dublikatlar silinsin\? + Dublikatlar silinsin? Aşağıdakı yayımları göstər Yayımları Göstər/Gizlə Tam baxılıb Qismən baxılıb - Bu pleylistdəki bütün dublikat yayımları silmək istəyirsiniz\? + Bu pleylistdəki bütün dublikat yayımları silmək istəyirsiniz? Yaxınlaşan Sol jest fəaliyyəti Oynadıcı ekranının sağ yarısı üçün jest seç @@ -741,8 +724,7 @@ Aşağıdakı hər bildiriş fəaliyyətin ona toxunub redaktə edin. İlk üç fəaliyyət (oynatma/fasilə, əvvəlki və növbəti) sistem tərəfindən tənzimlənib və dəyişdirilə bilməz. Xeyr Nüsxələmə və bərpa - NewPipe arabir avtomatik şəkildə yeni versiyaları yoxlaya və onlar mövcud olduqda sizə bildirə bilər. -\nBunu aktivləşdirmək istəyirsiniz? + NewPipe arabir avtomatik şəkildə yeni versiyaları yoxlaya və onlar mövcud olduqda sizə bildirə bilər. \nBunu aktivləşdirmək istəyirsiniz? Bəli Tənzimləmələri sıfırla Bütün tənzimləmələri standart dəyərlərinə sıfırla @@ -781,14 +763,10 @@ Oynatma siyahısın paylaş Başlıqlarla paylaşın - %1$s: %2$s - %1$s -\n%2$s + %1$s \n%2$s Daha çox göstər Daha qısa göstər - Bütün tənzimləmələri sıfırlama üstünlük verdiyiniz seçimlərin hamısın ləğv edəcək və tətbiq yenidən açılacaq. -\n -\n -\nDavam etmək istədiyinizə əminsiniz? + Bütün tənzimləmələri sıfırlama üstünlük verdiyiniz seçimlərin hamısın ləğv edəcək və tətbiq yenidən açılacaq. \n \n \nDavam etmək istədiyinizə əminsiniz? Canlı Albomlar Şəkil keyfiyyəti diff --git a/app/src/main/res/values-b+ast/strings.xml b/app/src/main/res/values-b+ast/strings.xml index e5fb76ae1..5514d3aff 100644 --- a/app/src/main/res/values-b+ast/strings.xml +++ b/app/src/main/res/values-b+ast/strings.xml @@ -5,7 +5,7 @@ Abrir nun restolador Compartir Axustes - ¿Quxesti dicir «%1$s»\? + ¿Quxesti dicir «%1$s»? Usar un reproductor esternu de videu Usar un reproductor esternu d\'audiu Resolución predeterminada @@ -43,8 +43,7 @@ Tarrezmes Formatu de videu predetermináu Prietu - Precísase esti permisu p\'abrir -\nnel mou ventanu + Precísase esti permisu p\'abrir \nnel mou ventanu Retu de reCAPTCHA Solicitóse un retu de reCAPTCHA En segundu planu @@ -95,7 +94,7 @@ Collaboración Historial Historial - ¿Quies desaniciar esti elementu del historial de busques\? + ¿Quies desaniciar esti elementu del historial de busques? Reproducir too Nun pudo reproducise esti fluxu Asocedió un fallu irrecuperable del reproductor @@ -128,7 +127,7 @@ Llista de reproducción nueva Nome Amestar a una llista de reproducción - ¿Desanicair esta llista de reproducción\? + ¿Desanicair esta llista de reproducción? Ensin sotítulos Axustar Rellenar @@ -140,7 +139,7 @@ Esportando… Nun pudieron esportase les soscripciones Aición d\'apertura preferida - ¿Quies tamién importar los axustes\? + ¿Quies tamién importar los axustes? Lleer Canales Llistes de reproducción @@ -173,34 +172,21 @@ Nun pudieron importase les soscripciones Sotítulos Aceutar - ¿Quies reafitar los valores\? + ¿Quies reafitar los valores? Nun pudo atopase\'l sirvidor El sirvidor nun aceuta descargues multifilu, volvi tentalo con @string/msg_threads = 1 Nun hai comentarios Llimpieza de datos Amosar los comentarios Desactiva esta opción p\'anubrir los comentarios - Pa cumplir cola Regulación Xeneral de Proteición de Datos (RGPD), pidímoste que mires la política de privacidá de NewPipe. Lleila con procuru. -\nHas aceutala pa unvianos informes de fallos. + Pa cumplir cola Regulación Xeneral de Proteición de Datos (RGPD), pidímoste que mires la política de privacidá de NewPipe. Lleila con procuru. \nHas aceutala pa unvianos informes de fallos. L\'aición al cambiar a otra aplicación dende\'l reproductor de videu princpial — %s El númberu máximu d\'intentos pa encaboxar la descarga - ¿Quies llimpiar l\'historial de descargues o desaniciar tolos ficheros baxaos\? + ¿Quies llimpiar l\'historial de descargues o desaniciar tolos ficheros baxaos? Esportación anterior Importación d\'un ficheru - Importa les soscripciones de YouTube dende Google Takeout: -\n -\n1. Vete a esta URL: %1$s -\n2. Anicia sesión cuando se te pida -\n3. Calca en «Tolos datos incluyíos», darréu en «Deseleicionar too», dempués esbilla namás «soscripciones» y calca «Aceutar» -\n4. Calca en «Pasu siguiente» y darréu en «Crear una esportación» -\n5. Calca nel botón «Baxar» dempués de qu\'apaeza y -\n6. A partir del ficheru baxáu, estrái\'l ficheru .json (polo xeneral baxo «YouTube and YouTube Music/subscriptions/subscriptions.json») ya impórtalu equí. - Importa un perfil de SoundCloud teclexando la URL o la to ID: -\n -\n1. Activa\'l «mou d\'escritoriu» nun restolador web (el sitiu nun ta disponible pa móviles) -\n2. Vete a esta URL: %1$s -\n3. Anicia sesión cuando se te pida -\n4. Copia la URL del perfil al que te redirixeron. + Importa les soscripciones de YouTube dende Google Takeout: \n \n1. Vete a esta URL: %1$s \n2. Anicia sesión cuando se te pida \n3. Calca en «Tolos datos incluyíos», darréu en «Deseleicionar too», dempués esbilla namás «soscripciones» y calca «Aceutar» \n4. Calca en «Pasu siguiente» y darréu en «Crear una esportación» \n5. Calca nel botón «Baxar» dempués de qu\'apaeza y \n6. A partir del ficheru baxáu, estrái\'l ficheru .json (polo xeneral baxo «YouTube and YouTube Music/subscriptions/subscriptions.json») ya impórtalu equí. + Importa un perfil de SoundCloud teclexando la URL o la to ID: \n \n1. Activa\'l «mou d\'escritoriu» nun restolador web (el sitiu nun ta disponible pa móviles) \n2. Vete a esta URL: %1$s \n3. Anicia sesión cuando se te pida \n4. Copia la URL del perfil al que te redirixeron. soundcloud.com/LaToID Minimizar al cambiar d\'aplicación Minimizar al reproductor en segundu planu @@ -224,7 +210,7 @@ Compartir con Soscribiéstite Nun hai vídeos - ¿Desaniciar tol historial de busques\? + ¿Desaniciar tol historial de busques? ¡Hai un anovamientu pa NewPipe! Perdióse\'l progresu porque se desanició\'l ficheru Instancies de PeerTube @@ -261,12 +247,12 @@ %d día %d díes - ¿Quies desaniciar esti grupu\? + ¿Quies desaniciar esti grupu? Llimpióse la caché de metadatos Desanicia tolos datos na caché de les páxines web Llimpiar los metadatos de la caché Llimpióse la caché d\'imáxenes - ¿Instalar Kode\? + ¿Instalar Kode? Qué asocedió:\nSolicitú:\nLlingua del conteníu:\nPaís del conteníu:\nLlingua de l\'aplicación:\nServiciu:\nHora en GMT:\nPaquete:\nVersión de l\'aplicación:\nVersión del SO: Nun s\'atopó nengún reproductor de fluxos (pues instalar VLC pa reproducilos). Amuesa una miniatura nel fondu de la pantalla de bloquéu y dientro de los avisos @@ -275,20 +261,8 @@ Por %s Canal creada por %s Avatar de la canal - Esti conteníu entá nun ta sofitáu por NewPipe. -\n -\nQuiciabes nel futuru sí. - ¿Cuides que la carga del feed ye perlenta\? Si ye asina, activa la carga rápida (pues camudalo nos axustes o primiendo\'l botón d\'embaxo). -\n -\nNewPipe ufre dos estratexes de descarga de feeds: -\n• Dir en cata de tola canal de soscripciones, lo cual ye lento pero completo. -\n• Usar un serviciu final dedicáu, lo cual ye rápido mas xeneralmente incompleto. -\n -\nLa diferencia ente los dos ye qu\'al más rápidu, polo xeneral, fálta-y dalguna información como\'l tipu (nun pue estremar ente vídeos en direuto o normales) o la duración de los elementos (que devuelve menos). -\n -\nYouTube ye l\'exemplu d\'un serviciu qu\'ufre esti métodu rápidu col so feed RSS. -\n -\nPolo que tu escueyes según lo que prefieras, si velocidá o información precisa. + Esti conteníu entá nun ta sofitáu por NewPipe. \n \nQuiciabes nel futuru sí. + ¿Cuides que la carga del feed ye perlenta? Si ye asina, activa la carga rápida (pues camudalo nos axustes o primiendo\'l botón d\'embaxo). \n \nNewPipe ufre dos estratexes de descarga de feeds: \n• Dir en cata de tola canal de soscripciones, lo cual ye lento pero completo. \n• Usar un serviciu final dedicáu, lo cual ye rápido mas xeneralmente incompleto. \n \nLa diferencia ente los dos ye qu\'al más rápidu, polo xeneral, fálta-y dalguna información como\'l tipu (nun pue estremar ente vídeos en direuto o normales) o la duración de los elementos (que devuelve menos). \n \nYouTube ye l\'exemplu d\'un serviciu qu\'ufre esti métodu rápidu col so feed RSS. \n \nPolo que tu escueyes según lo que prefieras, si velocidá o información precisa. Desactivar el mou rápidu Activar el mou rápidu Disponible en dalgunos preseos, suel ser muncho más rápido mas podría devolver un númberu llendáu d\'elementos y davezu información completa (por exemplu, falta de la duración, el tipu d\'elementu o l\'estáu de la tresmisión). @@ -317,8 +291,7 @@ ¿Desaniciar los vídeos vistos? Desaniciar lo visto Escoyeta d\'una instancia - El «Storage Access Framework» permite les descargues nuna tarxeta SD esterna. -\nDalgunos preseos son incompatibles + El «Storage Access Framework» permite les descargues nuna tarxeta SD esterna. \nDalgunos preseos son incompatibles Usar SAF Va pidísete l\'allugamientu onde guardar les descargues con cauna Posar les descargues @@ -358,9 +331,7 @@ Avance rápidu nos silencios Separtar (pue causar distorsión) Controles de la velocidá de reproducción - Ten en cuenta qu\'esta operación pue ser esixente cola rede. -\n -\n¿Quies siguir\? + Ten en cuenta qu\'esta operación pue ser esixente cola rede. \n \n¿Quies siguir? Esportar a Importar dende Importar @@ -410,8 +381,7 @@ Lo más reproducío Lo último reproducío NewPipe ye software copyleft: pues usalu, estudialu, compartilu y ameyoralu como quieras. N\'especial, pues redistribuyilu y/o modificalu baxo los términos de la GNU General Public License según espublizó la Free Software Foundation, quier la versión 3 de la llicencia quier (na to opinión) cualesquier versión posterior. - El proyeutu de NewPipe toma mui en serio la privacidá. Poro, l\'aplicación nun recueye nengún datu ensin el to consentimientu. -\nLa política de privacidá de NewPipe desplica en detalle los datos que s\'unvien y atroxen cuando unvies un informe de casque. + El proyeutu de NewPipe toma mui en serio la privacidá. Poro, l\'aplicación nun recueye nengún datu ensin el to consentimientu. \nLa política de privacidá de NewPipe desplica en detalle los datos que s\'unvien y atroxen cuando unvies un informe de casque. Un aplicación llibre pa ver/sentir plataformes de tresmisión n\'Android. Caráuteres de troquéu Los caráuteres que nun son válidos van trocase por esti valor @@ -463,17 +433,17 @@ Nun pudo configurase\'l menú de descarga El conteníu nun ta disponible Fallu de la rede - La descarga a la tarxeta SD nun ye posible. ¿Reafitar l\'allugamientu de la carpeta de descarga\? + La descarga a la tarxeta SD nun ye posible. ¿Reafitar l\'allugamientu de la carpeta de descarga? L\'almacenamientu esternu nun ta disponible Desanicióse l\'historial de busques. Desanicia l\'historial de les pallabres clave de busca Llimpiar l\'historial de busca Desaniciáronse los puntos de reproducción. - ¿Desaniciar tolos puntos de reproducción\? + ¿Desaniciar tolos puntos de reproducción? Desanicia tolos puntos de reproducción Desaniciar los puntos de reproducción Desanicióse l\'historial de vídeos vistos. - ¿Desaniciar tol historial de vídeos vistos\? + ¿Desaniciar tol historial de vídeos vistos? Desanicia l\'historial de fluxos reproducíos y el de puntos de reproducción Llimpiar l\'historial de los vídeos vistos Llimpia les cookies que NewPipe atrroxa cuando soluciones un reCAPTCHA @@ -494,9 +464,7 @@ Canciones Too Informe d\'un fallu - Tien una torga por edá. -\n -\nActiva «%1$s» nos axustes de l\'aplicación si quies velu. + Tien una torga por edá. \n \nActiva «%1$s» nos axustes de l\'aplicación si quies velu. YouTube forne\'l «Mou torgáu» qu\'anubre conteníu\'l que seya potencialmente p\'adultos Activar el «Mou torgáu» de YouTube Amuesa\'l conteníu que quiciabes nun seya afayadizu pa guaḥes porque tien una llende d\'edá (como +18) @@ -506,7 +474,7 @@ Amiestu d\'una instancia Atopa les instancies que te presten en %s Esbilla les instancies de PeerTube que prefieras - Nun pudo reconocese la URL. ¿Abrila con otra aplicación\? + Nun pudo reconocese la URL. ¿Abrila con otra aplicación? Amuesa\'l mensaxe al primir el nel botón «En segundu planu» o «Ventanu» nel «Details:» de los vídeos Amosar el mensaxe «Ten primío p\'amestar a la cola» Amosar los vídeos siguientes y asemeyaos @@ -556,6 +524,6 @@ Baxar Abrir nel mou ventanu Instalar - Nun s\'atopó nengún reproductor de fluxos. ¿Instalar VLC\? + Nun s\'atopó nengún reproductor de fluxos. ¿Instalar VLC? Toca «Buscar» pa entamar diff --git a/app/src/main/res/values-b+uz+Latn/strings.xml b/app/src/main/res/values-b+uz+Latn/strings.xml index 7e737235b..263c90313 100644 --- a/app/src/main/res/values-b+uz+Latn/strings.xml +++ b/app/src/main/res/values-b+uz+Latn/strings.xml @@ -3,7 +3,7 @@ Tashqi video pleerdan foydalanish Bilan baham ko\'rish %s uchun natijalar ko\'rsatilmoqda - \"%1$s\" demoqchimisiz\? + \"%1$s\" demoqchimisiz? Sozlashlar Qidirish stream faylni yuklab olish @@ -14,7 +14,7 @@ Pop-up rejimda ochish Bekor qilish Stream pleer topilmadi (uni ijro etish uchun VLC o\'rnatishingiz mumkin). - Hech qanday translatsiya pleyeri topilmadi. VLC o\'rnatilsinmi\? + Hech qanday translatsiya pleyeri topilmadi. VLC o\'rnatilsinmi? %1$s tomonidan e‘lon qilingan Boshlash uchun \"Izlash\" tugmasini bosing Avto-navbat @@ -54,7 +54,7 @@ Eskizini 1: 1 tomonlar nisbatiga o‘lchash Kodi media-markazi orqali videoni ijro etish variantini ko\'rsatish \"Kodi bilan ijro etish\" parametrini ko\'rsatish - missing Kore dasturini o\'rnatasizmi\? + missing Kore dasturini o\'rnatasizmi? Kodi bilan ijro etish Faqat ba\'zi qurilmalar 2K / 4K videolarni ijro etishi mumkin Yuqori o\'lchamlarni ko\'rsatish @@ -120,9 +120,7 @@ Yuklanganlar Yuklanganlar Jonli - Ushbu video yoshga cheklangan. -\n -\nAgar xohlasangiz, sozlamalarda \"%1$s\" ni yoqing. + Ushbu video yoshga cheklangan. \n \nAgar xohlasangiz, sozlamalarda \"%1$s\" ni yoqing. YouTube \"cheklangan rejim\" ni taqdim etadi, u katta yoshlilar uchun tarkibni yashiradi. YouTube-ning \"Cheklangan rejimi\" ni yoqish Tarkibni bolalar uchun yaroqsiz deb ko\'rsating, chunki uning yosh chegarasi bor (18+ kabi). @@ -147,7 +145,7 @@ PeerTube misollari Standart kontent tili Standart kontent mamlakati - URL manzili aniqlanmadi. Boshqa ilova bilan ochilsinmi\? + URL manzili aniqlanmadi. Boshqa ilova bilan ochilsinmi? Qo\'llab-quvvatlanmaydigan URL manzili \"Tafsilotlar:\" videodagi fon yoki po-pup tugmachasini bosganda ko\'rsatma. \"Qo\'shish uchun ushlab turish\" maslahatini ko\'rsatish @@ -184,15 +182,14 @@ Asosiy sahifaning tarkibi Eng ko\'p ijrolar etilganlar Oxirgi ijro - Ushbu narsani qidiruv tarixidan o\'chirmoqchimisiz\? + Ushbu narsani qidiruv tarixidan o\'chirmoqchimisiz? Tarix Tarix Litsenziyani o\'qish NewPipe - bu nusxa ko\'chirish dasturiy ta\'minotidir: Siz foydalanishingiz, baham ko\'rishingiz va o\'zingizning xohishingiz bilan yaxshilashingiz mumkin. Xususan, siz uni bepul dasturiy ta\'minot fondi tomonidan e\'lon qilingan GNU umumiy jamoat litsenziyasi shartlari asosida qayta tarqatishingiz va / yoki o\'zgartirishingiz mumkin, Litsenziyaning 3-versiyasi yoki (sizning xohishingizga ko\'ra) har qanday keyingi versiyada. NewPipe litsenziyasi Maxfiylik siyosatini o\'qish - NewPipe loyihasi sizning shaxsiy hayotingizga jiddiy e\'tibor beradi. Shuning uchun ilova sizning roziligingizsiz biron bir ma\'lumot to\'plamaydi. -\nNewPipe-ning maxfiylik siyosati halokat to\'g\'risidagi hisobotni yuborganingizda qanday ma\'lumotlar yuborilishi va saqlanishi haqida batafsil ma\'lumot beradi. + NewPipe loyihasi sizning shaxsiy hayotingizga jiddiy e\'tibor beradi. Shuning uchun ilova sizning roziligingizsiz biron bir ma\'lumot to\'plamaydi. \nNewPipe-ning maxfiylik siyosati halokat to\'g\'risidagi hisobotni yuborganingizda qanday ma\'lumotlar yuborilishi va saqlanishi haqida batafsil ma\'lumot beradi. NewPipe-ning maxfiylik siyosati Qo\'shimcha ma\'lumot va yangiliklar uchun NewPipe veb-saytiga tashrif buyuring. Websayt @@ -219,8 +216,7 @@ Hal etilganda \"Bajarildi\" tugmasini bosing reCAPTCHA muammosi 1 ta element o\'chirildi. - Ushbu ruxsat zarur -\npopup rejimida oching + Ushbu ruxsat zarur \npopup rejimida oching Yuklab olish papkasini keyinroq sozlamalarda belgilang Buferga nusxa olindi Iltimos kuting… @@ -290,7 +286,7 @@ Ushbu xato haqida elektron pochta orqali xabar berish Kechirasiz, bunday bo\'lmasligi kerak edi. Boshqa ilovalar orqali ko\'rsatishga ruxsat berish - Birlamchi parametrlarni tiklashni xohlaysizmi\? + Birlamchi parametrlarni tiklashni xohlaysizmi? Birlamchi parametrlarni tiklash Saqlangan yorliqlarni o\'qib bo\'lmadi, shuning uchun standartlardan foydalaning Yuklash uchun stream mavjud emas @@ -311,38 +307,26 @@ Veb-saytni tahlil qilib bo\'lmadi Barcha eskizlarni yuklab bo\'lmadi Tarmoqda xato - Tashqi SD-kartaga yuklab olishning iloji yo\'q. Yuklash papkasining joylashuvi tiklansinmi\? + Tashqi SD-kartaga yuklab olishning iloji yo\'q. Yuklash papkasining joylashuvi tiklansinmi? Tashqi xotira mavjud emas Xato Qidiruv tarixi o\'chirildi. - Butun qidiruv tarixi o\'chirilsinmi\? + Butun qidiruv tarixi o\'chirilsinmi? Qidiruv kalit so\'zlar tarixini o\'chiradi Qidiruv tarixini tozalash Ijro pozitsiyalari o\'chirildi. - Barcha ijro holatlari o\'chirilsinmi\? + Barcha ijro holatlari o\'chirilsinmi? Barcha ijro holatlarini o\'chiradi Ijro pozitsiyalarini o\'chirib tashlash Tomosha tarixi o\'chirildi. - Tomosha tarixi butunlay o\'chirib tashlansinmi\? + Tomosha tarixi butunlay o\'chirib tashlansinmi? Ijro etilgan streamlar tarixi va ijro holatlarini o\'chiradi Pleylist sahifasi %s tomonidan %s tomonidan yaratilgan Kanal avatari eskizi - Ushbu tarkib hali NewPipe tomonidan qo\'llab-quvvatlanmaydi. -\n -\nUmid qilamanki, kelgusi versiyada qo\'llab-quvvatlanadi. - Sizningcha, ta\'minotni yuklash juda sekinmi\? Agar shunday bo\'lsa, tez yuklashni yoqib ko\'ring (uni sozlamalardan yoki quyidagi tugmani bosib o\'zgartirishingiz mumkin). -\n -\nNewPipe ikkita lentani yuklash strategiyasini taklif qiladi: -\n• Sekin, lekin to\'liq bo\'lgan obuna kanalini to\'liq olish. -\n• Tez, lekin odatda to\'liq bo\'lmagan maxsus xizmatning so\'nggi nuqtasidan foydalanish. -\n -\nIkkalasining farqi shundaki, tezkor narsaning davomiyligi yoki turi kabi ba\'zi ma\'lumotlarga ega emas (jonli videolar va oddiy videolarni ajrata olmaydi) va u kamroq narsalarni qaytarishi mumkin. -\n -\nYouTube ushbu tezkor usulni RSS tasmasi bilan taqdim etadigan xizmatning namunasidir. -\n -\nShunday qilib, tanlov siz afzal ko\'rgan narsaga bog\'liq: tezlik yoki aniq ma\'lumot. + Ushbu tarkib hali NewPipe tomonidan qo\'llab-quvvatlanmaydi. \n \nUmid qilamanki, kelgusi versiyada qo\'llab-quvvatlanadi. + Sizningcha, ta\'minotni yuklash juda sekinmi? Agar shunday bo\'lsa, tez yuklashni yoqib ko\'ring (uni sozlamalardan yoki quyidagi tugmani bosib o\'zgartirishingiz mumkin). \n \nNewPipe ikkita lentani yuklash strategiyasini taklif qiladi: \n• Sekin, lekin to\'liq bo\'lgan obuna kanalini to\'liq olish. \n• Tez, lekin odatda to\'liq bo\'lmagan maxsus xizmatning so\'nggi nuqtasidan foydalanish. \n \nIkkalasining farqi shundaki, tezkor narsaning davomiyligi yoki turi kabi ba\'zi ma\'lumotlarga ega emas (jonli videolar va oddiy videolarni ajrata olmaydi) va u kamroq narsalarni qaytarishi mumkin. \n \nYouTube ushbu tezkor usulni RSS tasmasi bilan taqdim etadigan xizmatning namunasidir. \n \nShunday qilib, tanlov siz afzal ko\'rgan narsaga bog\'liq: tezlik yoki aniq ma\'lumot. Tez rejimni o\'chirish Tez rejimni yoqish Ba\'zi xizmatlarda mavjud bo\'lib, u tezroq bo\'ladi, lekin cheklangan miqdordagi narsalar va ko\'pincha to\'liq bo\'lmagan ma\'lumotlarni qaytarishi mumkin (masalan, davomiyligi, element turi, jonli holatda bo\'lmagan). @@ -353,7 +337,7 @@ Ta\'minlamoq Faqat guruhlanmagan obunalarni ko\'rsatish Yangi - Ushbu guruhni o\'chirmoqchimisiz\? + Ushbu guruhni o\'chirmoqchimisiz? Bo\'sh guruh nomi %d tanlangan @@ -391,8 +375,7 @@ Tizimning standart qiymati Ilova tili Namunani tanlang - \"Saqlash uchun kirish doirasi\" tashqi SD-kartaga yuklab olishga imkon beradi. -\nBa\'zi qurilmalar mos kelmaydi + \"Saqlash uchun kirish doirasi\" tashqi SD-kartaga yuklab olishga imkon beradi. \nBa\'zi qurilmalar mos kelmaydi SAFdan foydalalnish Sizdan har bir yuklab olishni qayerda saqlashingiz so\'raladi Qayerdan yuklab olishni so\'rang @@ -407,7 +390,7 @@ Maksimal qayta urinishlar To\'xtatish Yuklangan fayllarni o\'chirib tashlash - Yuklab olish tarixini tozalashni yoki barcha yuklab olingan fayllarni o\'chirishni xohlaysizmi\? + Yuklab olish tarixini tozalashni yoki barcha yuklab olingan fayllarni o\'chirishni xohlaysizmi? Yuklab olish tarixini tozalash Ushbu yuklab olishni tiklab bo\'lmaydi Ulanish vaqti tugadi @@ -459,8 +442,7 @@ Limitsiz Rad etish Qabul qilmoq - Ma\'lumotlarni himoya qilish bo\'yicha Evropa umumiy qoidalariga (GDPR) rioya qilish uchun biz sizning e\'tiboringizni NewPipe-ning maxfiylik siyosatiga qaratamiz. Iltimos, uni diqqat bilan o\'qing. -\nXatolar haqidagi hisobotni bizga yuborish uchun uni qabul qilishingiz kerak. + Ma\'lumotlarni himoya qilish bo\'yicha Evropa umumiy qoidalariga (GDPR) rioya qilish uchun biz sizning e\'tiboringizni NewPipe-ning maxfiylik siyosatiga qaratamiz. Iltimos, uni diqqat bilan o\'qing. \nXatolar haqidagi hisobotni bizga yuborish uchun uni qabul qilishingiz kerak. Qayta o\'rnatish Qadam Sukunat paytida oldinga siljish @@ -468,24 +450,10 @@ Ovoz pitchi Temp Ijro tezligini boshqarish - Ushbu operatsiyani bajarish tarmoq uchun qimmat bo\'lishi mumkinligini yodda tuting. -\n -\nDavom etishni xohlaysizmi\? + Ushbu operatsiyani bajarish tarmoq uchun qimmat bo\'lishi mumkinligini yodda tuting. \n \nDavom etishni xohlaysizmi? sizningID, soundcloud.com/yourid - URL yoki ID-ni yozib SoundCloud profilini import qiling: -\n -\n1. Veb-brauzerda \"ish stoli rejimini\" yoqing (sayt mobil qurilmalar uchun mavjud emas) -\n2. Ushbu URL manziliga o\'ting: %1$s -\n3. So\'ralganda tizimga kiring -\n4. Siz yo\'naltirilgan profil URL manzilidan nusxa oling. - YouTube-ga obunalarni Google takeout-dan import qilish: -\n -\n1. Ushbu URL manzilga o\'ting: %1$s -\n2. So\'ralganda tizimga kiring -\n3. \"Barcha ma\'lumotlar kiritilgan\" tugmachasini bosing, so\'ng \"Barchasini bekor qilish\" tugmachasini bosing, so\'ngra faqat \"obunalarni\" tanlang va \"OK\" tugmasini bosing -\n4. \"Keyingi qadam\" ni, so\'ngra \"Eksport yaratish\" tugmasini bosing. -\n5. U paydo bo\'lgandan keyin va \"Yuklab olish\" tugmasini bosing -\n6. Yuklangan zip-dan .json faylini chiqarib oling (odatda \"YouTube va YouTube Music / subscriptions / subscriptions.json\" ostida) va uni shu yerga import qiling. + URL yoki ID-ni yozib SoundCloud profilini import qiling: \n \n1. Veb-brauzerda \"ish stoli rejimini\" yoqing (sayt mobil qurilmalar uchun mavjud emas) \n2. Ushbu URL manziliga o\'ting: %1$s \n3. So\'ralganda tizimga kiring \n4. Siz yo\'naltirilgan profil URL manzilidan nusxa oling. + YouTube-ga obunalarni Google takeout-dan import qilish: \n \n1. Ushbu URL manzilga o\'ting: %1$s \n2. So\'ralganda tizimga kiring \n3. \"Barcha ma\'lumotlar kiritilgan\" tugmachasini bosing, so\'ng \"Barchasini bekor qilish\" tugmachasini bosing, so\'ngra faqat \"obunalarni\" tanlang va \"OK\" tugmasini bosing \n4. \"Keyingi qadam\" ni, so\'ngra \"Eksport yaratish\" tugmasini bosing. \n5. U paydo bo\'lgandan keyin va \"Yuklab olish\" tugmasini bosing \n6. Yuklangan zip-dan .json faylini chiqarib oling (odatda \"YouTube va YouTube Music / subscriptions / subscriptions.json\" ostida) va uni shu yerga import qiling. Obunalarni eksport qilib bo‘lmadi Obunalarni import qilib bo‘lmadi Oldingi export @@ -511,7 +479,7 @@ Pleylist eskizi o\'zgartirildi. Pleylist Pleylist yaratildi - Ushbu pleylist o\'chirilsinmi\? + Ushbu pleylist o\'chirilsinmi? Xatcho\'pni olib tashlash Xatcho\'p pleylisti Pleylist eskizi sifatida o\'rnating @@ -548,6 +516,6 @@ Top 50 Ommabop Fikrlarni yuklab bo‘lmadi - Sozlamalarni ham import qilmoqchimisiz\? + Sozlamalarni ham import qilmoqchimisiz? Bu sizning joriy sozlamangizni bekor qiladi. diff --git a/app/src/main/res/values-bar/strings.xml b/app/src/main/res/values-bar/strings.xml index 63ae52c9a..13b80c6cc 100644 --- a/app/src/main/res/values-bar/strings.xml +++ b/app/src/main/res/values-bar/strings.xml @@ -4,7 +4,7 @@ An andan Wideo-Playa heanehma Deiln mid Ergebnis füa: %s - Hosd du \"%1$s\" gmoand\? + Hosd du \"%1$s\" gmoand? Rumdogdan Suacha Stream-Dotai obalon @@ -14,7 +14,7 @@ Im Browser auf macha Weg damid Drauf doa - Koan Stream-Playa gfundn! Mogsd n VLC installiean\? + Koan Stream-Playa gfundn! Mogsd n VLC installiean? Aufe glon am %1$s do wean obaglone Audios gspaichad Oadna für obaglone Audios diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 5b58fe124..5c212e436 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -115,11 +115,11 @@ Экспарт гісторыі, падпісак, плэй-лістоў і налад Ачысціць гісторыю праглядаў Выдаліць гісторыю прайграных патокаў і пазіцыі прайгравання - Выдаліць усю гісторыю праглядаў\? + Выдаліць усю гісторыю праглядаў? Гісторыя праглядаў выдалена Ачысціць гісторыю пошуку Выдаліць гісторыю пошукавых запытаў - Выдаліць усю гісторыю пошуку\? + Выдаліць усю гісторыю пошуку? Гісторыя пошуку выдалена Памылка Памылка сеткі @@ -296,9 +296,7 @@ Імпарт падпісак YouTube з Google Takeout: \n \n1. Перайдзіце па гэтым URL: %1$s \n2. Увайдзіце, калі вас папросяць \n3. Націсніце на «Усе даныя ўключаны», затым на «Зняць выбар з усіх», затым выберыце толькі «падпіскі» і націсніце «ОК» \n4. Націсніце «Наступны крок», а затым «Стварыць экспарт» \n5. Націсніце на кнопку «Спампаваць» пасля таго, як яна з\'явіцца \n6. Ніжэй націсніце на ІМПАРТАВАЦЬ ФАЙЛ і выберыце спампаваны файл .zip \n7. [Калі не ўдаецца імпартаваць .zip] Трэба выняць файл .csv (звычайна ў раздзеле «YouTube і YouTube Music/subscriptions/subscriptions.csv»), ніжэй націсніце ІМПАРТАВАЦЬ ФАЙЛ і выберыце выняты файл CSV Каб імпартаваць профіль SoundCloud, увядзіце URL або свой ID:\n\n1. Уключыце «Версія для ПК» у браўзеры (сайт не падтрымліваецца мабільнымі прыладамі) \n2. Перайдзіце на: %1$s \n3. Увайдзіце, калі неабходна \n4. Скапіруйце URL-адрас профілю, на які вас перанакіравала. вашID, soundcloud.com/вашID - Гэтае дзеянне можа выклікаць вялікі расход трафіку. -\n -\nПрацягнуць? + Гэтае дзеянне можа выклікаць вялікі расход трафіку. \n \nПрацягнуць? Кіраванне хуткасцю прайгравання Тэмп Тон @@ -442,7 +440,7 @@ Паведаміць на GitHub Скапіяваць адфарматаваную справаздачу Дайце дазвол на адлюстраванне паверх іншых праграм - Выдаліць усе пазіцыі прайгравання\? + Выдаліць усе пазіцыі прайгравання? Выдаліць пазіцыі прайгравання Ачысціць файлы cookie з reCAPTCHA Файлы cookie з reCAPTCHA ачышчаны @@ -461,7 +459,7 @@ Афарбоўваць апавяшчэнне асноўным колерам мініяцюры. Падтрымліваецца не ўсімі прыладамі У кампактным апавяшчэнні даступна не больш за тры дзеянні! Каб адрэдагаваць кожнае з дзеянняў у апавяшчэнні, націсніце на яго. З дапамогай сцяжкоў справа, выберыце да трох дзеянняў, якія будуць паказвацца ў кампактным апавяшчэнні. - Не ўдалося распазнаць URL-адрас. Адкрыць у іншай праграме\? + Не ўдалося распазнаць URL-адрас. Адкрыць у іншай праграме? Апавяшчэнне плэера Апавяшчэнні Новыя трансляцыі @@ -566,9 +564,7 @@ Выключыце, каб схаваць апісанне відэа і дадатковую інфармацыю Прапановы пры лакальным пошуку Наладзіць апавяшчэнне пра паток, які зараз прайграецца - Гэта відэа абмежавана па ўзросце. -\n -\nУключыце «%1$s» у наладах, калі хочаце бачыць гэта. + Гэта відэа абмежавана па ўзросце. \n \nУключыце «%1$s» у наладах, калі хочаце бачыць гэта. Апавяшчэнне аб памылцы Апавяшчэнні для паведамлення аб памылках Адбылася памылка NewPipe, націсніце, каб адправіць справаздачу @@ -583,8 +579,7 @@ Карысна, напрыклад, калі вы карыстаецеся гарнітурай са зламанымі фізічнымі кнопкамі Выключыце, каб схаваць палі метаданых з дадатковымі звесткамі пра стваральніка патоку, змесціва патоку або пошукавы запыт Прапановы пры аддаленым пошуку - Гэта відэа абмежавана па ўзросце. -\nУ сувязі з новай палітыкай YouTube у дачыненні да відэа з узроставымі абмежаваннямі, NewPipe не можа атрымаць доступ ні да аднаго са сваіх відэапатокаў і, такім чынам, не можа іх прайграваць. + Гэта відэа абмежавана па ўзросце. \nУ сувязі з новай палітыкай YouTube у дачыненні да відэа з узроставымі абмежаваннямі, NewPipe не можа атрымаць доступ ні да аднаго са сваіх відэапатокаў і, такім чынам, не можа іх прайграваць. YouTube забяспечвае «Абмежаваны рэжым», які хавае патэнцыйна змесціва для дарослых Разлік хэша Вырашана @@ -626,7 +621,7 @@ Не загружана: %d Пачынаючы з Android 10 падтрымліваецца толькі «Storage Access Framework» Праверка абнаўленняў… - Выдаліць дублікаты\? + Выдаліць дублікаты? Выдаліць дублікаты Выдаліць усе дубліраваныя патокі ў гэтым плэйлісце? Новыя элементы стужкі @@ -747,8 +742,7 @@ Якія ўкладкі паказваюцца на старонцы канала Абагуліць спіс URL-адрасоў Абагуліць назвы - %1$s -\n%2$s + %1$s \n%2$s Укладкі канала Shorts Загрузка метаданых… @@ -816,9 +810,9 @@ Пошук %1$s (%2$s) Спадабалася «Дазволіць паказ па-над астатнімі праграмамі» - %s тыс. - %s млн - %s млрд + %s тыс. + %s млн + %s млрд Выдаліць файл Выдаліць запіс Старонка SoundCloud Top 50 выдалена diff --git a/app/src/main/res/values-ber/strings.xml b/app/src/main/res/values-ber/strings.xml index 39247f49b..a65755b16 100644 --- a/app/src/main/res/values-ber/strings.xml +++ b/app/src/main/res/values-ber/strings.xml @@ -75,7 +75,7 @@ ⵙⵔ ⵙ %s ⵔⵏⵏⵓ ⵜ %s - ⵉⵙ ⵜⵅⵙⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⵜⵔⴰⴱⴱⵓⵜ ⴰ\? + ⵉⵙ ⵜⵅⵙⴷ ⴰⴷ ⵜⴽⴽⵙⴷ ⵜⵔⴰⴱⴱⵓⵜ ⴰ? ⴱⴷⴷ ⴰⵥⵟⵟⴰ ⵜⴰⵍⴳⴰⵎⵜ @@ -101,8 +101,8 @@ ⵙⵎⵔⵙ ⵉⵎⵖⵔⵉ ⵏ ⵉⵎⵙⵍⵉ ⴰⴱⵕⵕⴰⵏⵉ ⵙⵎⵔⵙ ⵉⵎⵖⵔⵉ ⵏ ⵓⴼⵉⴷⵢⵓ ⴰⴱⵕⵕⴰⵏⵉ ⴰⵙⵎⴰⵍ ⵏ ⵜⴰⵢⴰⴼⵓⵜ ⵉ: %s - ⵎⵉⵏ ⵜⵅⵙⴷ ⴰⴷ ⵜⵉⵏⵉⴷ:\"%1$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 088996bc5..452e9da79 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -2,7 +2,7 @@ Докоснете лупата, за да започнете. Публикувано на %1$s - Не е намерен стрийм плейър. Инсталиране на VLC\? + Не е намерен стрийм плейър. Инсталиране на VLC? Инсталиране Отказ Отвори в браузър @@ -11,7 +11,7 @@ Изтегляне Търсене Настройки - Може би имахте предвид „%1$s“\? + Може би имахте предвид „%1$s“? Споделяне с Използване на външен видео плейър Премахва аудиото при някои резолюции @@ -170,11 +170,11 @@ Замества текущата ви история, абонаменти, списъци за възпроизвеждане и (по избор) настройки Изнасяне на история, абонаменти, плейлисти и настройки Изтрий историята с изгледани - Изтрий цялата история с изгледани\? + Изтрий цялата история с изгледани? Историята с изгледани е изтрита Изтрий историята на търсенията Изтрива историята с въвежданите за търсене ключови думи - Изтрий цялата история на търсенията\? + Изтрий цялата история на търсенията? Историята на търсене е изтрита Външните плейъри не поддържат този вид линкове Невалидна директория @@ -208,8 +208,7 @@ Начало Преименувай Моля, определете папка за изтегляне по-късно в настройките - Това разрешение се изисква за -\nвъзпроизвеждане в отделен прозорец + Това разрешение се изисква за \nвъзпроизвеждане в отделен прозорец 1 елемент е изтрит. reCAPTCHA заявка Изисква се въвеждане на reCAPTCHA @@ -286,15 +285,12 @@ Внасяне на абонаменти в YouTube от Google Takeout: \n \n1. Отидете на този URL: %1$s \n2. Влезте, когато бъдете помолени \n3. Щракнете върху „Всички включени данни“, след това върху „Демаркиране на всички“, след това изберете само „абонаменти“ и щракнете върху „OK“ \n4. Кликнете върху „Следваща стъпка“ и след това върху „Създаване на износ“ \n5. Кликнете върху бутона \"Изтегляне\", след като се появи \n6. Кликнете върху ВНАСЯНЕ НА ФАЙЛ по-долу и изберете изтегления .zip файл \n7. [Ако внасянето на .zip е неуспешно] Разархивирайте .csv файла (обикновено под „YouTube и YouTube Music/subscriptions/subscriptions.csv“), щракнете върху ВНАСЯНЕ НА ФАЙЛ по-долу и изберете извлечения csv файл Внесете профил в SoundCloud, като въведете или URL адреса, или вашия ID: \n \n1. Включете „десктоп режим“ в браузър (сайтът е недостъпен за мобилни устройства) \n2. Посетете връзката: %1$s \n3. Влезте в профила си, ако се изисква \n4. Копирайте хипервръзката на профилната страница, към която сте насочени. вашиятID, soundcloud.com/вашиятID - Това действие може да изразходва голямо количество данни от вашия трафик. -\n -\nЖелаете ли да продължите? + Това действие може да изразходва голямо количество данни от вашия трафик. \n \nЖелаете ли да продължите? Управление скоростта на възпроизвеждане Темпо Височина Бързо превъртане при тишина - За да се съобразим с Европейския общ регламент за защита на данните (GDPR), с настоящото обръщаме внимание на политиката за поверителност на NewPipe. Моля, прочетете го внимателно. -\nТрябва да го приемете, за да ни изпратите доклада за грешка. + За да се съобразим с Европейския общ регламент за защита на данните (GDPR), с настоящото обръщаме внимание на политиката за поверителност на NewPipe. Моля, прочетете го внимателно. \nТрябва да го приемете, за да ни изпратите доклада за грешка. Приеми Откажи Без ограничения @@ -349,8 +345,7 @@ Никога Завършено прекъснат - Това видео е с възрастови ограничения. -\nПоради новите политики на YouTube за видеа с възрастови ограничения, NewPipe не може да достъпи нито един от видеопотоците на това видео и не може да го възпроизведе. + Това видео е с възрастови ограничения. \nПоради новите политики на YouTube за видеа с възрастови ограничения, NewPipe не може да достъпи нито един от видеопотоците на това видео и не може да го възпроизведе. Не показвай Местни предложения за търсене Моля проверете дали има създадена дискусия за срив като този. Постъпилите дубликати са в ущърб на така ценното време за разработка. @@ -458,9 +453,7 @@ Максимален брой опити преди отменяне на изтеглянето Създай Искате ли да изтриете тази група? - Това съдържание не се поддържа от NewPipe. -\n -\nЕвентуално може да бъде поддържано в бъдещи версии. + Това съдържание не се поддържа от NewPipe. \n \nЕвентуално може да бъде поддържано в бъдещи версии. Обработка… Ще отнеме момент Поради ограничения в ExoPlayer, стъпката за превъртане е зададена на %d секунди Потоците, които са били гледани преди и след добавянето им към плейлиста, ще бъдат премахнати. \nСигурни ли сте? @@ -508,15 +501,13 @@ PeerTube инстанции Има насрочено изтегляне с това име Вече има активно изтегляне с това име - Искате да изтриете историята на изтеглянията или всички изтеглени файлове\? + Искате да изтриете историята на изтеглянията или всички изтеглени файлове? Полезно при превключване към мобилни данни, въпреки че някои изтегляния не поддържат възобновяване и ще започнат отначало Срив на приложението Цветът на известието да се избира според главния цвят в миниатюрата на видеото (може да не работи на всички устройства) Включване на \"Ограничен режим“ в YouTube YouTube предлага „ограничен режим“, чрез който можете да филтрирате потенциално съдържание за възрастни - Това видео е с възрастова граница. -\n -\nВключете „%1$s“ в настройките ако искате да го пуснете. + Това видео е с възрастова граница. \n \nВключете „%1$s“ в настройките ако искате да го пуснете. Автоматична (тема на устройството) Мащабиране на миниатюрата в известието от 16:9 към 1:1 формат (възможни са изкривявания) Избете плейлист @@ -600,8 +591,7 @@ %s отговор %s отговора - %1$s -\n%2$s + %1$s \n%2$s - %1$s: %2$s Може да си харесате инстанции на %s Инстанцията не можа да бъде потвърдена @@ -641,17 +631,7 @@ Избор на качество за външни плеъри Известията са спрени ExoPlayer по подразбиране - Смятате ли, че емисията зарежда прекалено бавно? Ако смятате така, може да пробвате да включите режима за бързо зареждане (може да го промените от настройките или чрез бутона по-долу). -\n -\nNewPipe предлага два режима за зареждане: -\n• Зареждане на цялата страница на абонамента, което е бавно, но и пълно. -\n• Изпозване на специална страница, предоставена от услугата, което е бързо, но обичайно е и непълно. -\n -\nРазликата между двете е, че бързият режим няма пълна информация, например времетраенето и вида (не може да различава между видеа на живо и обикновени) и може да върне по-малко видеа. -\n -\nYoutube е примерна услуга, която предоставя този метод чрез RSS емисия. -\n -\nНакратко, изборът се свежда до предпочинанието ви: бързина или точна информация. + Смятате ли, че емисията зарежда прекалено бавно? Ако смятате така, може да пробвате да включите режима за бързо зареждане (може да го промените от настройките или чрез бутона по-долу). \n \nNewPipe предлага два режима за зареждане: \n• Зареждане на цялата страница на абонамента, което е бавно, но и пълно. \n• Изпозване на специална страница, предоставена от услугата, което е бързо, но обичайно е и непълно. \n \nРазликата между двете е, че бързият режим няма пълна информация, например времетраенето и вида (не може да различава между видеа на живо и обикновени) и може да върне по-малко видеа. \n \nYoutube е примерна услуга, която предоставя този метод чрез RSS емисия. \n \nНакратко, изборът се свежда до предпочинанието ви: бързина или точна информация. Емисията е последно обновявана: %s Налично за някои услуги, обичайно е много по-бързо, но връща ограничено количество видеа и често пъти непълна информация (например няма времетраене, вид на видеото, дали е на живо) Въведете URL адреса на инстанцията @@ -659,8 +639,7 @@ Покажи информация за канала Авто-генерирани (не е намерен ъплоудер) Създай известие за грешка - NewPipe може автоматично да проверява за нови версии от време на време и да ви известява при наличие. -\nИскате ли да го включите? + NewPipe може автоматично да проверява за нови версии от време на време и да ви известява при наличие. \nИскате ли да го включите? Не е намерено Няма достатъчно свободно пространство на устройвството NewPipe бе затворен, докато обработваше файла @@ -690,10 +669,8 @@ Искате ли да премахнете всички дублиращи се потоци в този плейлист? Покажи само на негрупирани абонаменти Покажи следните потоци - Не е намерен подходящ файлов мениджър за това действие. -\nМоля, инсталирайте файлов мениджър или опитайте да деактивирате „%s“ в настройките за изтегляне - Не е намерен подходящ файлов мениджър за това действие. -\nМоля, инсталирайте файлов мениджър, съвместим с Storage Access Framework + Не е намерен подходящ файлов мениджър за това действие. \nМоля, инсталирайте файлов мениджър или опитайте да деактивирате „%s“ в настройките за изтегляне + Не е намерен подходящ файлов мениджър за това действие. \nМоля, инсталирайте файлов мениджър, съвместим с Storage Access Framework Разрешете избирането на текст в описанието Миниатюри Аватари на качващите @@ -753,17 +730,14 @@ Деактивирайте медийното тунелиране, ако имате черен екран или заекване при възпроизвеждане на видео. Мултимедийното тунелиране е деактивирано по подразбиране на вашето устройство, тъй като е известно, че моделът на вашето устройство не го поддържа. Изчакване на връзката - Ще бъдете попитани къде да запазите всяко изтегляне. -\nАктивирайте инструмента за избор на системна папка (SAF), ако искате да изтеглите на външна SD карта + Ще бъдете попитани къде да запазите всяко изтегляне. \nАктивирайте инструмента за избор на системна папка (SAF), ако искате да изтеглите на външна SD карта Започвайки от Android 10, се поддържа само „Storage Access Framework“ Ще бъдете попитани къде да запазите всяко изтегляне Праг за актуализиране на емисия Раздели за извличане при актуализиране на емисията. Тази опция няма ефект, ако каналът се актуализира чрез бърз режим. Активирайте тази опция, ако имате проблеми с инициализацията на декодера, което се връща към декодери с по-нисък приоритет, ако инициализацията на първичните декодери е неуспешна. Това може да доведе до лоша производителност при възпроизвеждане, отколкото при използване на първични декодери Кратки видеоклипове - Това заобиколно решение освобождава и инстанцира отново видео кодеци, когато възникне промяна на повърхността, вместо директно да зададе повърхността на кодека. Вече се използва от ExoPlayer на някои устройства с този проблем, тази настройка има ефект само върху Android 6 и по-нова версия -\n -\nАктивирането на тази опция може да предотврати грешки при възпроизвеждане при превключване на текущия видеоплейър или превключване на цял екран + Това заобиколно решение освобождава и инстанцира отново видео кодеци, когато възникне промяна на повърхността, вместо директно да зададе повърхността на кодека. Вече се използва от ExoPlayer на някои устройства с този проблем, тази настройка има ефект само върху Android 6 и по-нова версия \n \nАктивирането на тази опция може да предотврати грешки при възпроизвеждане при превключване на текущия видеоплейър или превключване на цял екран Раздели на канали Превключване на ориентацията на екрана Изберете качеството на изображенията и дали изобщо да се зареждат изображения, за да намалите използването на данни и памет. Промените изчистват както кеша на изображенията в паметта, така и на диска — %s @@ -775,9 +749,7 @@ Необходима мрежова връзка Нулирайте настройките Нулирайте всички настройки до техните стойности по подразбиране - Нулирането на всички настройки ще отхвърли всички ваши предпочитани настройки и ще рестартира приложението. -\n -\nСигурни ли сте, че искате да продължите? + Нулирането на всички настройки ще отхвърли всички ваши предпочитани настройки и ще рестартира приложението. \n \nСигурни ли сте, че искате да продължите? Решете Известия за напредъка на хеширането на видео Нови потоци diff --git a/app/src/main/res/values-bm/strings.xml b/app/src/main/res/values-bm/strings.xml index 62f8281ab..0767aadf1 100644 --- a/app/src/main/res/values-bm/strings.xml +++ b/app/src/main/res/values-bm/strings.xml @@ -1,4 +1,4 @@ ߥߊߘߏ ߛߐ߲߬ߞߌ߲߫ ߞߵߊ߬ ߘߊߡߌ߬ߣߊ߬. - \ No newline at end of file + diff --git a/app/src/main/res/values-bn-rBD/strings.xml b/app/src/main/res/values-bn-rBD/strings.xml index 972867b04..1894644a4 100644 --- a/app/src/main/res/values-bn-rBD/strings.xml +++ b/app/src/main/res/values-bn-rBD/strings.xml @@ -2,7 +2,7 @@ শুরু করতে আতস কাঁচটিতে টিপ দাও। %1$s তারিখে প্রকাশিত - কোন স্ট্রিম প্লেয়ার নেই। VLC ইনস্টল করতে চান\? + কোন স্ট্রিম প্লেয়ার নেই। VLC ইনস্টল করতে চান? ইনস্টল বাতিল ব্রাউজারে খুলুন @@ -11,7 +11,7 @@ ডাউনলোড খুঁজুন সেটিংস - আপনি কি %1$s বুঝিয়েছেন\? + আপনি কি %1$s বুঝিয়েছেন? শেয়ার করুন বাইরের ভিডিও প্লেয়ার ব্যবহার করুন অন্য অডিও প্লেয়ার ব্যবহার করুন @@ -28,7 +28,7 @@ উচ্চ রেজ্যুলেশন দেখাও শুধু কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে Kodi এর মাধ্যমে চালাও - হারানো কোর ইনস্টল করবেন\? + হারানো কোর ইনস্টল করবেন? \"Kodi দিয়ে চালাও\" অপশন দেখাও Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প দেখাও অডিও @@ -98,8 +98,7 @@ অনুগ্রহপূর্বক অপেক্ষা করো… ক্লিপবোর্ডে অনুলিপি করা হয়েছে পরে সেটিংস থেকে একটি ডাউনলোড ফোল্ডার নির্ধারণ করে দিন - পপআপ মোডে চালু হতে -\nএই অনুমতির প্রয়োজন আছে + পপআপ মোডে চালু হতে \nএই অনুমতির প্রয়োজন আছে reCAPTCHA চ্যালেঞ্জ reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে @@ -172,7 +171,7 @@ সীমাহীন কোন ক্যাপশন নেই প্লে লিস্ট তৈরি হয়েছে - প্লে লিস্ট ডিলিট করতে চান\? + প্লে লিস্ট ডিলিট করতে চান? বুকমার্ক মুছুন আন মিউট মিউট @@ -208,7 +207,7 @@ কোন সাবস্ক্রাইবার নেই কোন রেজাল্ট নেই গিটহাব এ এরর রিপোর্ট করুন - আপনি কি ডিফল্ট এ ফিরতে চান\? + আপনি কি ডিফল্ট এ ফিরতে চান? ডিফল্ট এ ফিরে যান ডাউন লোড এর জন্য কোন স্ট্রিম নেই একটা এরর হয়েছেঃ %1$s @@ -221,15 +220,15 @@ স্ট্রিম টি চালানো গেল না বাহ্যিক স্টোরেজ নেই অনুসন্ধান ইতিহাস মোছা হয়েছে - সমগ্র সার্চ ইতিহাস মুছবেন\? + সমগ্র সার্চ ইতিহাস মুছবেন? সার্চের ইতিহাস মোছা হয় সার্চ ইতিহাস মুছুন প্লেব্যাক অবস্থানসমূহ মোছা হয়েছে - সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন\? + সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন? সমস্ত প্লে লিস্ট এর অবস্থান মুছে ফেলুন প্লে লিস্ট এর অবস্থান মুছে ফেলুন দেখা ভিডিওর ইতিহাস মোছা হয়েছে - সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন\? + সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন? দেখার ইতিহাস মুছে ফেলুন ডাটা বেস এক্সপোর্ট করুন ডাটাবেস আনুন @@ -300,7 +299,7 @@ ফিড হালনাগাদ প্রবেশস্থল ফিড শুধুমাত্র অদলবদ্ধ সদস্যতা দেখাও - আপনি কি এ গ্রুপটি মুছতে চান\? + আপনি কি এ গ্রুপটি মুছতে চান? খালি গ্রুপ নেম %d নির্বাচিত @@ -394,7 +393,7 @@ সক্রিয় প্লেয়ারের অপেক্ষমাণ সারি প্রতিস্থাপিত হবে বিঘ্ন ঘটার পরে চালানো অব্যাহত রাখো (যেমন. ফোনকল) প্লেব্যাক অবস্থানের চিহ্নসমূহ তালিকায় দেখাও - URL টি বোঝা যায়নি। অন্য অ্যাপ দিয়ে খুলবো\? + URL টি বোঝা যায়নি। অন্য অ্যাপ দিয়ে খুলবো? কনটেন্টের জন্য পূর্বনির্ধারিত দেশ বাইরের প্লেয়ারসমূহ এ ধরনের লিঙ্কসমূহ সমর্থন করে না হ্যাশ হিসাব করা হচ্ছে @@ -425,9 +424,7 @@ এলোমেলো বাফারিং নোটিফিকেশন বর্ণিল করো - এই ভিডিও বয়স দ্বারা সীমিত। -\n -\nএটি দেখতে চাইলে সেটিংস থেকে \"%1$s\" চালু করুন। + এই ভিডিও বয়স দ্বারা সীমিত। \n \nএটি দেখতে চাইলে সেটিংস থেকে \"%1$s\" চালু করুন। সব টগল করো আপনি এখন এই চ্যানেলের গ্রাহক অপেক্ষমাণ সারি বাদ দেওয়ার আগে নিশ্চিত হতে জিজ্ঞেস করো diff --git a/app/src/main/res/values-bn-rIN/strings.xml b/app/src/main/res/values-bn-rIN/strings.xml index 17e317dfe..864f94796 100644 --- a/app/src/main/res/values-bn-rIN/strings.xml +++ b/app/src/main/res/values-bn-rIN/strings.xml @@ -9,8 +9,7 @@ ওয়েব সাইট reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে reCAPTCHA চ্যালেঞ্জ - এই অনুমতিটি -\nপপআপ মোডে খুলতে প্রয়োজন + এই অনুমতিটি \nপপআপ মোডে খুলতে প্রয়োজন ক্লিপবোর্ডে অনুলিপি করা হয়েছে অনুগ্রহপূর্বক অপেক্ষা করুন… বিস্তারিত জানার জন্য আলতো চাপ @@ -94,7 +93,7 @@ অডিও Kodi মিডিয়া সেন্টারে এর মাধ্যমে ভিডিও প্লে করার জন্য একটি বিকল্প প্রদর্শন কর দেখাও \"Kodi এর মাধ্যমে চালাও \" বিকল্প - অনুপস্থিত কোড অ্যাপ ইনস্টল করবেন\? + অনুপস্থিত কোড অ্যাপ ইনস্টল করবেন? Kodi এর মাধ্যমে চালান শুধুমাত্র কিছু ডিভাইস 2K/4K ভিডিও চালাতে পারে উচ্চ রেজোল্যুশন দেখাও @@ -122,7 +121,7 @@ কিছু কিছু রেজোলিউশনে অডিও বন্ধ করে দেয় বাইরের ভিডিও প্লেয়ার ব্যবহার করুন শেয়ার করুন - আপনি কি বুঝিয়েছেন \"%1$s\"\? + আপনি কি বুঝিয়েছেন \"%1$s\"? সেটিংস খুঁজুন স্ট্রিম ফাইল ডাউনলোড করুন @@ -133,7 +132,7 @@ বাদ দিন ইনস্টল কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি (প্লে করতে VLC ইন্সটল করতে পারেন)। - কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান\? + কোন স্ট্রিম প্লেয়ার পাওয়া যায়নি। VLC ইনস্টল করতে চান? প্রকাশকাল %1$s অনুসন্ধান শুরু করুন নতুন @@ -154,7 +153,7 @@ ফিট কোন ক্যাপশন নেই প্লে লিস্ট তৈরি হয়েছে - প্লে লিস্ট ডিলিট করতে চান\? + প্লে লিস্ট ডিলিট করতে চান? আন মিউট মিউট প্লে লিস্ট এ যুক্ত করুন @@ -190,7 +189,7 @@ তৈরি করুন পুনরায় চেষ্টা করুন দেখার ইতিহাস মুছে গেছে - সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন\? + সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন? দেখার ইতিহাস মুছে ফেলুন ডাটা বেস এক্সপোর্ট করুন অ্যাপ আপডেট এর সূচনা @@ -208,7 +207,7 @@ ডাটা মুছে ফেলুন পুনরায় প্লে ব্যাক চালু করুন ট্যাব পছন্দ করুন - আপনি কি ডিফল্ট এ ফিরতে চান\? + আপনি কি ডিফল্ট এ ফিরতে চান? একটা এরর হয়েছেঃ %1$s ফাইল সরে গেছে না হয় মুছে ফেলা হয়েছে কোন অডিও স্ট্রিম পাওয়া যায় নি @@ -216,7 +215,7 @@ স্ট্রিম টি চালানো গেল না সার্চের ইতিহাস মোছা হয় প্লে ব্যাক এর অবস্থান মোছা হয়েছে - সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন\? + সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন? সমস্ত প্লে লিস্ট এর অবস্থান মুছে ফেলুন প্লে লিস্ট এর অবস্থান মুছে ফেলুন মেন এ ফিরে যান @@ -245,7 +244,7 @@ ডাউন লোড এর জন্য কোন স্ট্রিম নেই ফাইল এর নাম খালি থাকতে পারে না কোন ভিডিও - সমগ্র সার্চ ইতিহাস মুছবেন\? + সমগ্র সার্চ ইতিহাস মুছবেন? সার্চ ইতিহাস মুছুন ডাটাবেস আনুন পপ-আপ এ খুলুন @@ -293,7 +292,7 @@ নতুন স্ট্রিম শুধুমাত্র ওয়াইফাইএ ভাষা - URL বোঝা যায় নি, অন্য অ্যাপ এ খুলুন\? + URL বোঝা যায় নি, অন্য অ্যাপ এ খুলুন? ফাইল তৈরি করা যাচ্ছে না ভিডিও বিবরণ ও বাড়তি তথ্য বন্ধ করুন মূল প্লেয়ার ফুল স্ক্রীন এ শুরু করুন diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 0d4fbd99c..e5ca8d0ac 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -32,7 +32,7 @@ কোন ক্যাপশন নেই প্লেলিস্টকৃত প্লে লিস্ট তৈরি হয়েছে - প্লে লিস্ট ডিলিট করতে চান\? + প্লে লিস্ট ডিলিট করতে চান? বুকমার্ক মুছুন আন মিউট মিউট @@ -82,8 +82,7 @@ reCAPTCHA চ্যালেঞ্জ অনুরোধ করা হয়েছে reCAPTCHA চ্যালেঞ্জ একটি আইটেম ডিলিট হয়েছে। - এই অনুমতিটি -\nপপআপ মোডে খুলতে প্রয়োজন + এই অনুমতিটি \nপপআপ মোডে খুলতে প্রয়োজন অনুগ্রহ করে একটি উপলব্ধ ডাউনলোড ডিরেক্টরি নির্বাচন করো ক্লিপবোর্ডে অনুলিপি করা হয়েছে অনুগ্রহপূর্বক অপেক্ষা করো… @@ -122,7 +121,7 @@ গিটহাব এ এরর রিপোর্ট করুন মেইলের মাধ্যমে ত্রুটি প্রতিবেদন করুন দুঃখিত, এটা ঘটা উচিত ছিল না। - তুমি কি এই সহজাত পছন্দ ফিরত চাও\? + তুমি কি এই সহজাত পছন্দ ফিরত চাও? ডিফল্ট এ ফিরে যান ডাউন লোড এর জন্য কোন স্ট্রিম নেই একটা এরর হয়েছেঃ %1$s @@ -142,15 +141,15 @@ বাহ্যিক স্টোরেজ নেই ত্রুটি সার্চ ইতিহাস ডিলিট হয়েছে - সমগ্র সার্চ ইতিহাস মুছবেন\? + সমগ্র সার্চ ইতিহাস মুছবেন? সার্চের ইতিহাস মোছা হয় সার্চ ইতিহাস মুছুন প্লে ব্যাক এর অবস্থান মোছা হয়েছে - সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন\? + সমস্ত প্লে লিস্ট এর অবস্থান মুছবেন? সমস্ত প্লে লিস্ট এর অবস্থান মুছে ফেলুন প্লে লিস্ট এর অবস্থান মুছে ফেলুন দেখার ইতিহাস মুছে গেছে - সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন\? + সম্পূর্ণ দেখার ইতিহাস মুছে ফেলুন? দেখার ইতিহাস মুছে ফেলুন ডাটা বেস এক্সপোর্ট করুন ডাটাবেস আনুন @@ -479,7 +478,7 @@ বিশেষ সমাধান করো শেষ হালনাগাদের পর একটি সাবস্ক্রিপশনের আগের সময় সেকেলে বিবেচিত — %s - তুমি কি এ গ্রুপটি মুছতে চাও\? + তুমি কি এ গ্রুপটি মুছতে চাও? আরও তথ্য এবং খবরের জন্য নিউপাইপ ওয়েবসাইট দেখো। এতে তোমার বর্তমান অবস্থা সরানো হবে। সতর্কতা: সব তথ্য আনা যায়নি। @@ -500,17 +499,15 @@ এই উদ্দিষ্ট ফোল্ডার বানানো যায় নি এই নামের একটি ফাইল আগে থেকে আছে এইরকম তথ্য খোলার সহজাত ক্রিয়া – %s - পছন্দসমূহ কি আমদানি করতে চাও\? + পছন্দসমূহ কি আমদানি করতে চাও? অবৈধ অক্ষরগুলো এই মান দ্বারা প্রতিস্থাপিত অন্য অ্যাপের উপরে দেখাতে অনুমতি দাও %s-এ তোমার পছন্দের ইন্সট্যান্স খুজো প্লে করা স্ট্রিমের ইতিহাস এবং প্লেব্যাক অবস্থানগুলি মুছে দেয় - এই ভিডিওটি বয়সসীমাবদ্ধ । -\n -\nতুমি এটি দেখতে চাইলে পছন্দসমূহে \"%1$s\" চালু করো। + এই ভিডিওটি বয়সসীমাবদ্ধ । \n \nতুমি এটি দেখতে চাইলে পছন্দসমূহে \"%1$s\" চালু করো। Youtube একটি \"সীমাবদ্ধ মোড\" সরবরাহ করে যা সম্ভাব্য বয়সসীমাবদ্ধ বিষয়গুলি গুপ্ত রাখে শিশুদের জন্যে সম্ভবত অনুপযুক্ত বিষয়গুলোও দেখান যেগুলির একটি বয়সসীমা রয়েছে (যেমন ১৮+ বিষয়সমূহ) - ইউআরএলটি চিহ্নিত করা যায়নি। অন্য অ্যাপ্লিকেশনে খুলতে চাও\? + ইউআরএলটি চিহ্নিত করা যায়নি। অন্য অ্যাপ্লিকেশনে খুলতে চাও? এই ফাইলে কাজ করার সময় নিউপাইপ বন্ধ করা হয়েছে এই নামের একটি ডাউনলোড প্রক্রিয়ারত সংরক্ষিত ট্যাব পড়া যায় নি, তাই সহজাতটি ব্যবহার করা হচ্ছে @@ -521,15 +518,13 @@ একটি ডাউনলোড একই সময়ে চলতে পারবে ডাউনলোড বাতিল করার আগে সর্বোচ্চ চেষ্টা এই তথ্যটি ব্যক্তিগত, তাই নিউপাইপ এটির ধারাপ্রচার বা ডাউনলোড করতে পারবে না। - এসডি কার্ডে নামানো যাচ্ছে না। ডাউনলোড স্থান ফিরাবে বা পাল্টাবে\? + এসডি কার্ডে নামানো যাচ্ছে না। ডাউনলোড স্থান ফিরাবে বা পাল্টাবে? বন্ধ পর্দার পটভূমি ও বিজ্ঞপ্তির পটভূমি উভয় জায়গায় এই প্রতিচ্ছবি ব্যবহার করো - নিউপাইপ প্রকল্প তোমার গোপনীয়তা গুরুত্বের সাথে নেয়। তাই এই অ্যাপ তোমার অনুমতি ছাড়া কোনো তথ্য পাঠায় না। -\nনিউপাইপের গোপনীয়তা নীতিমালা কোন তথ্য পাঠানো হয় ও সংরক্ষণ হয় তা ব্যাখ্যা করে। + নিউপাইপ প্রকল্প তোমার গোপনীয়তা গুরুত্বের সাথে নেয়। তাই এই অ্যাপ তোমার অনুমতি ছাড়া কোনো তথ্য পাঠায় না। \nনিউপাইপের গোপনীয়তা নীতিমালা কোন তথ্য পাঠানো হয় ও সংরক্ষণ হয় তা ব্যাখ্যা করে। রিক্যাপচা পূরণ করলে নিউপাইপ যেসব কুকি রাখে তা মুছো ধারা ভুক্তিতে সেবাগুলোর মূল লেখা দৃশ্যমান হবে - অনুসন্ধান ইতিহাস থেকে এই ভুক্তিটি মুছবে\? - প্রত্যেক ডাউনলোড কোথায় রাখা হবে তা জিজ্ঞেস করা হবে। -\nমেমোরি কার্ডে ডাউনলোড করতে সিস্টেম ফোল্ডার পিকার (SAF) এনেবল করুন + অনুসন্ধান ইতিহাস থেকে এই ভুক্তিটি মুছবে? + প্রত্যেক ডাউনলোড কোথায় রাখা হবে তা জিজ্ঞেস করা হবে। \nমেমোরি কার্ডে ডাউনলোড করতে সিস্টেম ফোল্ডার পিকার (SAF) এনেবল করুন এই নামের একটি ডাউনলোড চলমান মিডিয়া সুরঙ্গকরণ অক্ষম দ্রুত ফিড অবস্থা এ বিষয়ে এর বেশি তথ্য দেয় না। @@ -555,9 +550,7 @@ অনুমতিপত্র চিরকুট (ট্যাগ) বিষয়শ্রেণি - মনে রাখবে এই ক্রিয়ার নেটওয়ার্ক খরচ বেশি হতে পারে। -\n -\nচালিয়ে যাবে\? + মনে রাখবে এই ক্রিয়ার নেটওয়ার্ক খরচ বেশি হতে পারে। \n \nচালিয়ে যাবে? ট্যাবলেট অবস্থা বন্ধ চালু diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index d422dbe91..328d34e21 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -16,7 +16,7 @@ Pozadina Pretraži Podešavanja - Jeste li mislili \"%1$s\"\? + Jeste li mislili \"%1$s\"? Prikažite informaciju Podijelite pomoću Pokazuju se rezultati za: %s @@ -83,7 +83,7 @@ Isključite da bi ste sakrili meta-informacijske kutije sa dodatnim informacijama o praviocu prijenosa, sadržaju prijenosa ili zahtjevu za pretraživanje Preuzmite datoteku za prijenos Keširane slike su izbrisane - Nije pronađen nijedan medijski prijenosnik. Hoćete VLC instalisati\? + Nije pronađen nijedan medijski prijenosnik. Hoćete VLC instalisati? Nijedan medijski prijenosnik nije nađen na vašem uređaju (možete VLC instalisati da bi ste ga pokrenili). Uklonite sve keširane podatke web stranica Automatski sljedeći prijenos u red stavite diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index fbec5e5e9..a21af8fff 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -70,7 +70,7 @@ Llegiu la llicència Historial Historial - Voleu eliminar aquest element de l\'historial de cerca\? + Voleu eliminar aquest element de l\'historial de cerca? Contingut de la pàgina principal Pàgina en blanc Trieu un canal @@ -94,11 +94,11 @@ S\'està exportant… Importa un fitxer Publicat el %1$s - No s\'ha trobat cap reproductor en temps real. Voleu instal·lar el VLC\? + No s\'ha trobat cap reproductor en temps real. Voleu instal·lar el VLC? No s\'ha trobat cap reproductor de fluxos (podeu instal·lar el VLC per reproduir-ho). Obre en mode emergent Baixa el fitxer de vídeo - Volíeu dir: \"%1$s\"\? + Volíeu dir: \"%1$s\"? Comparteix-ho amb Reproductor de vídeo extern Heu eliminat la subscripció a aquest canal @@ -115,7 +115,7 @@ Mostra resolucions superiors Només alguns dispositius poden reproduir vídeos en 2K/4K Reprodueix amb el Kodi - No s\'ha trobat l\'aplicació Kore. Voleu instal·lar-la\? + No s\'ha trobat l\'aplicació Kore. Voleu instal·lar-la? Mostra «Reprodueix amb el Kodi» Mostra una opció per reproduir un vídeo amb el centre multimèdia Kodi Reproductor emergent intel·ligent @@ -211,7 +211,7 @@ Tanca el calaix S\'està obtenint la informació… S\'està carregant el contingut seleccionat - Voleu eliminar aquesta llista de reproducció\? + Voleu eliminar aquesta llista de reproducció? Controls de la velocitat de reproducció Tempo To @@ -234,8 +234,7 @@ Inicia Feu un toc aquí per a més detalls Defineix una carpeta de baixades més endavant als paràmetres - Es necessita aquest permís -\nper a obrir el mode emergent + Es necessita aquest permís \nper a obrir el mode emergent Camp reCAPTCHA S\'ha sol·licitat l\'emplenament d\'un camp reCAPTCHA Se substituiran els caràcters no vàlids amb aquest valor @@ -275,36 +274,27 @@ Informa d\'errors fora del cicle de vida Força l\'informe d\'excepcions Rx que no es puguin transmetre que tinguin lloc fora del cicle de vida d\'un fragment o activitat després de disposar-los Importeu les vostres subscripcions de YouTube mitjançant la còpia de contingut de Google Takeout: \n \n1. Aneu a : %1$s \n2. Inicieu la sessió si se us demana \n3. Premeu \"Totes les dades incloses\", després \"Dessel·lecciona-ho tot\", llavors sel·leccioneu només \"Subscripcions\" i finalment premeu \"D\'acord\". \n4. Premeu \"Pas següent\" i llavors a \"Crea una exportació\" \n5. Premeu el botó \"Baixa\" un cop hagi aparegut \n6. Premeu a IMPORTA EL FITXER i sel·leccioneu el fitxer .zip descarregat \n7. [En cas que la importació del fitxer .zip hagi fallat] extreieu-ne el fitxer subscripcions.csv (es troba generalment a \"Takeout/YouTube i YouTube Music/subscripcions/subscripcions.csv\"), premeu a IMPORTA EL FITXER i sel·leccioneu el fitxer .csv extret - Importeu un perfil del SoundCloud mitjançant l\'URL o l\'identificador del vostre perfil: -\n -\n1. Activeu el «Mode d\'ordinador» en un navegador (el lloc web no està disponible per a dispositius mòbils) -\n2. Aneu a: %1$s -\n3. Inicieu la sessió al vostre compte quan si us demani -\n4. Copieu l\'URL on si us ha redirigit. + Importeu un perfil del SoundCloud mitjançant l\'URL o l\'identificador del vostre perfil: \n \n1. Activeu el «Mode d\'ordinador» en un navegador (el lloc web no està disponible per a dispositius mòbils) \n2. Aneu a: %1$s \n3. Inicieu la sessió al vostre compte quan si us demani \n4. Copieu l\'URL on si us ha redirigit. identificador, soundcloud.com/identificador - Tingueu en compte que això pot comportar un ús intensiu de la xarxa. -\n -\nVoleu continuar\? + Tingueu en compte que això pot comportar un ús intensiu de la xarxa. \n \nVoleu continuar? No hi ha vídeos que es puguin baixar Subtítols Modifica la mida i el fons dels subtítols. Cal reiniciar l\'aplicació per aplicar els canvis Neteja l\'historial de reproduccions Neteja l\'historial dels vídeos reproduïts i les posicions de reproducció - Voleu suprimir tot l\'historial de reproduccions\? + Voleu suprimir tot l\'historial de reproduccions? S\'ha esborrat l\'historial de reproduccions Neteja l\'historial de cerca Neteja l\'historial de paraules cercades - Voleu suprimir tot l\'historial de cerca\? + Voleu suprimir tot l\'historial de cerca? S\'ha esborrat l\'historial de cerca S\'ha esborrat 1 element. El NewPipe és programari lliure sota llicència copyleft: el podeu fer servir, estudiar, compartir i millorar com vulgueu. Concretament, el podeu redistribuir i/o modificar d\'acord amb els termes de la llicència GNU GPL publicada per la Free Software Foundation, versió 3 o qualsevol altra versió posterior. - Voleu importar també els paràmetres\? + Voleu importar també els paràmetres? Política de privadesa del NewPipe - El projecte NewPipe es pren molt seriosament la vostra privadesa. Per aquesta raó, l\'aplicació no emmagatzema cap dada sense el vostre consentiment. -\nLa política de privadesa del NewPipe descriu detalladament quines dades s\'envien i s\'emmagatzemen quan envieu un informe d\'error. + El projecte NewPipe es pren molt seriosament la vostra privadesa. Per aquesta raó, l\'aplicació no emmagatzema cap dada sense el vostre consentiment. \nLa política de privadesa del NewPipe descriu detalladament quines dades s\'envien i s\'emmagatzemen quan envieu un informe d\'error. Llegiu la política de privadesa - Per complir amb el Reglament General de Protecció de Dades Europeu (GDPR), us demanem que pareu atenció a la política de privadesa del NewPipe. Llegiu-la detingudament. -\nSi voleu informar d\'un error, l\'haureu d\'acceptar. + Per complir amb el Reglament General de Protecció de Dades Europeu (GDPR), us demanem que pareu atenció a la política de privadesa del NewPipe. Llegiu-la detingudament. \nSi voleu informar d\'un error, l\'haureu d\'acceptar. Accepta Rebutja Sense restriccions @@ -326,7 +316,7 @@ S\'ha eliminat el fitxer L\'emmagatzematge extern no està disponible Reinicia als valors per defecte - Voleu reiniciar als valors per defecte\? + Voleu reiniciar als valors per defecte? Actualitzacions Llista Quadrícula @@ -380,19 +370,18 @@ No hi ha espai disponible al dispositiu S\'ha perdut el progrés perquè s\'ha eliminat el fitxer S\'ha excedit el temps d\'espera de la connexió - Esteu segurs que voleu esborrar el vostre historial de baixades o esborrar-ne tots els fitxers\? + Esteu segurs que voleu esborrar el vostre historial de baixades o esborrar-ne tots els fitxers? Limita la cua de baixades Inicia les baixades Pausa les baixades - Se us demanarà la ubicació de cada baixada. -\nHeu d\'activar el SAF si voleu descarregar-ho a una targeta SD externa + Se us demanarà la ubicació de cada baixada. \nHeu d\'activar el SAF si voleu descarregar-ho a una targeta SD externa Posicions a les llistes Mostra els indicadors de posició de reproducció a les llistes Neteja les dades El sistema ha denegat l\'acció S\'ha tancat el NewPipe mentre es treballava en el fitxer Demana on baixar - No es pot desar a la targeta externa. Voleu restablir la carpeta de baixades\? + No es pot desar a la targeta externa. Voleu restablir la carpeta de baixades? El servidor no accepta baixades simultànies. Proveu amb @string/msg_threads = 1 Restaura la darrera posició de la reproducció S\'ha esborrat les posicions de reproducció @@ -402,7 +391,7 @@ El SAF (Storage Access Framework; estructura d\'accés a l\'emmagatzematge) us permet realitzar baixades a una memòria externa com una targeta SD Esborra les posicions de reproducció Esborra totes les posicions de reproducció - Voleu suprimir tots els punts de reproducció\? + Voleu suprimir tots els punts de reproducció? In/Habilita el servei; selecció actual: Cap visualització @@ -429,9 +418,7 @@ Àlbums Cançons Vídeos - Aquest vídeo té una restricció per edat. -\n -\nSi desitgeu visualitzar-lo, activeu \"%1$s\" a paràmetres. + Aquest vídeo té una restricció per edat. \n \nSi desitgeu visualitzar-lo, activeu \"%1$s\" a paràmetres. Activa el \"mode restringit\" de YouTube La instància introduïda ja existeix Només estàn soportades URLs HTTPS @@ -449,20 +436,8 @@ Per %s Creat per %s Miniatura de l\'avatar del canal - El NewPipe encara no suporta aquest contingut. -\n -\nEsperem que en el futur ho faci. - Creieu que la càrrega de contingut és massa lenta\? Si és el cas, proveu d\'activar la càrrega ràpida (podeu canviar-ho a paràmetres o al botó de sota). -\n -\nEl NewPipe ofereix dues formes de càrrega de contingut per als feeds: -\n• Descarregant-ne el canal sencer, que és lent però complet. -\n• Fent servir un servei dedicat, que és molt ràpid però sovint incomplet. -\n -\nLa diferència entre els dos és que el ràpid sovint retorna la informació incompleta. Per exemple, pot faltar la durada o el tipus (sense poder distingir entre una retransmissió en directe i un vídeo normal) i podria ser que faltessin alguns elements. -\n -\nYouTube és un exemple d\'un servei que ofereix aquest sistema de càrrega ràpida pels seus feed RSS. -\n -\nEn definitiva, l\'elecció depèn de si preferiu rapidesa a assegurar-vos que l\'informació és precisa. + El NewPipe encara no suporta aquest contingut. \n \nEsperem que en el futur ho faci. + Creieu que la càrrega de contingut és massa lenta? Si és el cas, proveu d\'activar la càrrega ràpida (podeu canviar-ho a paràmetres o al botó de sota). \n \nEl NewPipe ofereix dues formes de càrrega de contingut per als feeds: \n• Descarregant-ne el canal sencer, que és lent però complet. \n• Fent servir un servei dedicat, que és molt ràpid però sovint incomplet. \n \nLa diferència entre els dos és que el ràpid sovint retorna la informació incompleta. Per exemple, pot faltar la durada o el tipus (sense poder distingir entre una retransmissió en directe i un vídeo normal) i podria ser que faltessin alguns elements. \n \nYouTube és un exemple d\'un servei que ofereix aquest sistema de càrrega ràpida pels seus feed RSS. \n \nEn definitiva, l\'elecció depèn de si preferiu rapidesa a assegurar-vos que l\'informació és precisa. Desactiva el mode ràpid Activa el mode ràpid Disponible en alguns serveis, normalment és més ràpid, però podria només incloure un nombre limitat de contingut i sovint informació incomplerta (per exemple, sense durada, tipus…) @@ -473,7 +448,7 @@ Flux Mostra només les subscripcions sense grup Nou - Esteu segurs de voler suprimir aquest grup\? + Esteu segurs de voler suprimir aquest grup? Nom de grup buit %d de seleccionat @@ -544,7 +519,7 @@ Notificació de comprovació del vídeo YouTube proporciona un \"mode restringit\" que amaga contingut potencialment inadequat per a infants Mostra contingut que podria ser inadequat pels infants - No s\'ha pogut reconèixer l\'adreça URL. Obrir-la amb una altra aplicació\? + No s\'ha pogut reconèixer l\'adreça URL. Obrir-la amb una altra aplicació? Posa a la cua automàticament Desactiveu-ho per deixar de mostrar les metadades, que contenen informació addicional sobre el creador del directe, el contingut o una sol·licitud de cerca Mostra les metadades @@ -583,8 +558,7 @@ Força l\'aturada de l\'aplicació Resol Reproduccions en directe relacionades - Aquest vídeo té restriccions d\'edat. -\nDegut a la nova política d\'edat de YouTube, el NewPipe no pot accedir a aquest contingut i per tant no pot reproduir-lo. + Aquest vídeo té restriccions d\'edat. \nDegut a la nova política d\'edat de YouTube, el NewPipe no pot accedir a aquest contingut i per tant no pot reproduir-lo. Desactiveu per amagar la descripció i la informació addicional del vídeo Desactiva l\'entunelament del contingut Desactiva @@ -612,9 +586,7 @@ Selecciona el teu tema fosc favorit — %s Automàtic (tema del dispositiu) Usuari suspes - El compte de l\'autor ha estat esborrat. -\nNewPipe no serà capaç de carregar aquest fil en el futur. -\nUs voleu desubscriure d\'aquest canal\? + El compte de l\'autor ha estat esborrat. \nNewPipe no serà capaç de carregar aquest fil en el futur. \nUs voleu desubscriure d\'aquest canal? No s\'ha pogut carregar el contingut per \'%s\'. Error carregant contingut Ara se\'t pregunrarà on vols guardar cada descàrrega @@ -678,7 +650,7 @@ Percent Preguntes freqüents Veure a la pàgina web - Borrar tots el fitxers descargats al disc\? + Borrar tots el fitxers descargats al disc? Ser notificat Ara estás subscrit a aquest canal Selecciona la qualitat per reproductors externs diff --git a/app/src/main/res/values-ckb/strings.xml b/app/src/main/res/values-ckb/strings.xml index 23baa512c..003854e07 100644 --- a/app/src/main/res/values-ckb/strings.xml +++ b/app/src/main/res/values-ckb/strings.xml @@ -1,20 +1,9 @@ - ئایا توانای بارکردن لاوازە؟ گەر وایە ئەوا بارکردنی خێرا تاقی بکەرەوە (دەتوانی بیگۆڕیت لە بەشی ڕێکخستنەکان لەڕێگای گرتەکردن لەم دوگمەیەی خوارەوە). -\n -\nئەم داوانامەیە دوو شێوازی بارکردنت بۆ پێشنیاز دەکات: -\n- بارکردنی تەواوی کەناڵە بەشدارییەکانت، ئەمەیان خاوە بەڵام تەواوە. -\n- تەرخانکردنی خزمەتگوزارییەکان ئەمەیان خێرایە بەڵام زۆر تەواو نییە. -\n -\nجیاوازی نێوان ئەم دووانە ئەوەیە کە خێراکە چەند زانیارییەکی وونە، وەکوو ماوەی هەر بڕگەیەک یان جۆرەکەی (ناتوانێت جیاوازی بکات لە نێوان ڤیدیۆی ڕاستەوخۆ و ئاسایی) لەوانەشە بڕگەی کەمتر باربکات. -\n -\nیوتیوب نموونەیە لەم خزمەتگوزارییە کە ڕێگەی خێرا بەکاردەبات بەهۆی پیشاندەری RSS. -\n -\nبۆیە هەڵژرادن بۆ خۆت دەگەڕێتەوە: زانیاری تەواو یان خێرا. + ئایا توانای بارکردن لاوازە؟ گەر وایە ئەوا بارکردنی خێرا تاقی بکەرەوە (دەتوانی بیگۆڕیت لە بەشی ڕێکخستنەکان لەڕێگای گرتەکردن لەم دوگمەیەی خوارەوە). \n \nئەم داوانامەیە دوو شێوازی بارکردنت بۆ پێشنیاز دەکات: \n- بارکردنی تەواوی کەناڵە بەشدارییەکانت، ئەمەیان خاوە بەڵام تەواوە. \n- تەرخانکردنی خزمەتگوزارییەکان ئەمەیان خێرایە بەڵام زۆر تەواو نییە. \n \nجیاوازی نێوان ئەم دووانە ئەوەیە کە خێراکە چەند زانیارییەکی وونە، وەکوو ماوەی هەر بڕگەیەک یان جۆرەکەی (ناتوانێت جیاوازی بکات لە نێوان ڤیدیۆی ڕاستەوخۆ و ئاسایی) لەوانەشە بڕگەی کەمتر باربکات. \n \nیوتیوب نموونەیە لەم خزمەتگوزارییە کە ڕێگەی خێرا بەکاردەبات بەهۆی پیشاندەری RSS. \n \nبۆیە هەڵژرادن بۆ خۆت دەگەڕێتەوە: زانیاری تەواو یان خێرا. نیوپایپ نه‌رمه‌والایه‌كی سەرچاوە کراوەیە : دەتوانیت بەکاریبهێنیت، بیخوێنیتەوە، هاوبەشی پێبکەیت ،بەرەوپێشی ببەیت. بەتایبەتی دەتوانی دابەشیبکەیتەوە یاخوود بگۆڕیت بەپێی مەرجەکانی GNU مۆڵەتنامەی گشتی وەک نه‌رمه‌واڵایه‌كی بڵاوی خۆڕایی, بەهۆی وەشانی ٣ ی مۆڵەتنامە، یان هەر وەشانێکی دوواتر. چی:\nداواكاری:\nزمانی بابەت:\nوڵاتی بابەت:\nزمانی به‌رنامه‌:\nخزمه‌تگوزاری:\nGMT كات:\nپاكێج:\nوه‌شان:\nOS وه‌شان: - پڕۆژەی نیوپایپ زانیارییە تایبەتییەکانت بە وردی دەپارێزێت. هەروەها به‌رنامه‌كه‌ هیچ زانایارییەکت بەبێ ئاگاداری تۆ بەکارنابات. -\n‫سیاسەتی تایبەتی نیوپایپ بە وردی ڕوونکردنەوەت دەداتێ لەسەر ئەو زانیاریانەی وەریاندەگرێت و بەکاریاندەبات. + پڕۆژەی نیوپایپ زانیارییە تایبەتییەکانت بە وردی دەپارێزێت. هەروەها به‌رنامه‌كه‌ هیچ زانایارییەکت بەبێ ئاگاداری تۆ بەکارنابات. \n‫سیاسەتی تایبەتی نیوپایپ بە وردی ڕوونکردنەوەت دەداتێ لەسەر ئەو زانیاریانەی وەریاندەگرێت و بەکاریاندەبات. ناتوانرێت لە بیرگەی دەرەکیدا داببەزێنرێت . شوێنی فۆڵده‌ری دابه‌زاندنەکان ڕێکبخرێتەوە؟ مەبەستت لە ئەمەیە ٪1$s ؟ ماوەی نوێكردنه‌وه‌ی فیید @@ -49,8 +38,7 @@ خێرا فایل سڕایەوە کۆمەڵەی کەناڵەکان - ئەم دەسەڵاتە پێویستە بۆ -\nکردنەوەی له‌ دۆخی پەنجەرە + ئەم دەسەڵاتە پێویستە بۆ \nکردنەوەی له‌ دۆخی پەنجەرە وه‌ستێنراوه‌ لە نۆره‌دایه‌ هەناردەکرا @@ -66,9 +54,7 @@ نۆبه‌تكراو دانانی ناوی نوێ ده‌چه‌سپێت لەسەر مێژووی ئێستات، بەژدارییه‌كانت، خشته‌لێدانه‌كانت و ڕێكخستنه‌كانت - تەمەنت بۆ بینینی ئەم ڤیدیۆیە قه‌ده‌غه‌كراوه‌. -\n -\n%1$s كارا بكه‌ له‌ ڕێكخستنه‌كانه‌وه‌ گه‌ر ده‌ته‌وێت بیبینیت. + تەمەنت بۆ بینینی ئەم ڤیدیۆیە قه‌ده‌غه‌كراوه‌. \n \n%1$s كارا بكه‌ له‌ ڕێكخستنه‌كانه‌وه‌ گه‌ر ده‌ته‌وێت بیبینیت. سڕانەوەی مێژووی دابه‌زاندن تەنیا ئێستا كاراكردنی ”دۆخی قەدەغەکراو”ی یوتیوب @@ -293,9 +279,7 @@ بەدڵه‌كان بیرهاتنه‌وه‌ی كۆتا قه‌باره‌ و شوێنی په‌نجه‌ره‌ سازکردن - ئەوە بزانە ئەم کردارە پێویستی بە هێڵێکی گران هەیە. -\n -\nدەتەوێ بەردەوامبیت؟ + ئەوە بزانە ئەم کردارە پێویستی بە هێڵێکی گران هەیە. \n \nدەتەوێ بەردەوامبیت؟ گشتی داخستن خۆکاری @@ -446,14 +430,7 @@ ڕه‌نووسی جێگۆڕین ڕێكخستنه‌كان دابه‌زێنراو - بۆ هاورده‌كردنی بەژداربوونەکانی یوتوب له‌ گووگڵه‌وه‌: -\n -\n1. ئەم بەستەرە بکەرەوە: %1$s -\n2. بچۆرەژوورەوە گەر داوای‌ کرد -\n3. كرته‌ بكه‌ له‌ \"All data included\"، پاشان كرته‌ بكه‌ له‌ \"Deselect all\" ، پاشان ته‌نیا \"subscriptions\" هه‌ڵبژێره‌ پاشان كرته‌ له‌ \"OK\" بكه‌ -\n4. كرته‌ بكه‌ له‌ \"Next step\" و دواتر له‌ \"Create export\" -\n5. كرته‌ بكه‌ له‌ \"Download\" دوای دەرکەوتنی -\n6. له‌ فایلی دابه‌زێنراودا فایلی .json ئێكستراكت بكه‌ و لێره‌دا هاورده‌ی بكه‌. + بۆ هاورده‌كردنی بەژداربوونەکانی یوتوب له‌ گووگڵه‌وه‌: \n \n1. ئەم بەستەرە بکەرەوە: %1$s \n2. بچۆرەژوورەوە گەر داوای‌ کرد \n3. كرته‌ بكه‌ له‌ \"All data included\"، پاشان كرته‌ بكه‌ له‌ \"Deselect all\" ، پاشان ته‌نیا \"subscriptions\" هه‌ڵبژێره‌ پاشان كرته‌ له‌ \"OK\" بكه‌ \n4. كرته‌ بكه‌ له‌ \"Next step\" و دواتر له‌ \"Create export\" \n5. كرته‌ بكه‌ له‌ \"Download\" دوای دەرکەوتنی \n6. له‌ فایلی دابه‌زێنراودا فایلی .json ئێكستراكت بكه‌ و لێره‌دا هاورده‌ی بكه‌. به‌پێی سیستەم کێشە لە هێڵەکەتدا هەیە @@ -481,11 +458,8 @@ وەستاندنی دابەزاندنەکان دەربارە و پرسیارەکان پیشاندانی لێدوانەکان - بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی نیوپایپ. تکایە بەئاگادارییەوە بیخوێنەره‌وە. -\nپێویستە په‌سه‌ندی بکەیت بۆ ناردنی سکاڵاکانت. - ئەم بابەتە هێشتا پشتگیری نەکراوە لەلایەن نیوپایپەوە. -\n -\nخوازیارین کە بتوانین لە وەشانەکانی داهاتوودا پشتگیری بکەین. + بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی نیوپایپ. تکایە بەئاگادارییەوە بیخوێنەره‌وە. \nپێویستە په‌سه‌ندی بکەیت بۆ ناردنی سکاڵاکانت. + ئەم بابەتە هێشتا پشتگیری نەکراوە لەلایەن نیوپایپەوە. \n \nخوازیارین کە بتوانین لە وەشانەکانی داهاتوودا پشتگیری بکەین. بەخشین كه‌س گوێبیستی نییه‌ مێژووی گەڕانەکانت سڕانەوە @@ -500,18 +474,12 @@ هەڵوەشاندنەوه تراکەکان ڕێکخستنەکانی دەنگ - پرست پێ دەکرێت بۆ شوێنی دابەزاندنی هەر بابەتێک. -\nهەڵبژێرەری فۆڵدەری سیستەم کارابکە (SAF) گەر دەتەوێت بابەتەکانت لە بیرگەی دەرەکیدا داببەزێنرێن + پرست پێ دەکرێت بۆ شوێنی دابەزاندنی هەر بابەتێک. \nهەڵبژێرەری فۆڵدەری سیستەم کارابکە (SAF) گەر دەتەوێت بابەتەکانت لە بیرگەی دەرەکیدا داببەزێنرێن دواین لێدراو ناتوانرێ لیستی دابه‌زاندن دابنرێت وەشانی نوێی نیوپایپ بەردەستە! وێنۆچکەی خشتەلێدان گۆڕدرا. - هێنانەوەی پەڕەی کەسی SoundCloud بەدانانی بەستەر یاخوود ئایدی: -\n -\n1. دۆخی ”Desktop mode” لە وێبگەرەکەتدا چالاک بکە (ئەم ماڵپەڕە بۆ وێبگەری مۆبایلەکان بەردەست نییە) -\n2. ئەم بەستەرە بکەرەوە : %1$s -\n3. بچۆرە ژوورەوە گەر داواکرا -\n4. بەستەری پەڕەی کەسییەکەت دابنێ. + هێنانەوەی پەڕەی کەسی SoundCloud بەدانانی بەستەر یاخوود ئایدی: \n \n1. دۆخی ”Desktop mode” لە وێبگەرەکەتدا چالاک بکە (ئەم ماڵپەڕە بۆ وێبگەری مۆبایلەکان بەردەست نییە) \n2. ئەم بەستەرە بکەرەوە : %1$s \n3. بچۆرە ژوورەوە گەر داواکرا \n4. بەستەری پەڕەی کەسییەکەت دابنێ. پیت و ژمارەکان بابەتی وڵاتی بنەڕەتی نوێکارییەکان @@ -559,8 +527,7 @@ دیسکریپشن بابه‌ته‌ هاوشێوه‌كان لێدوانه‌كان - ته‌مه‌ن بۆ ئه‌م ڤیدیۆیه‌ سنورداره‌. -\nله‌سایه‌ی سیاسه‌ته‌ نوێیه‌كانی یوتوبه‌وه‌. نیوپایپ ناتوانێت ئه‌م ڤیدیۆیه‌ لێبدات. + ته‌مه‌ن بۆ ئه‌م ڤیدیۆیه‌ سنورداره‌. \nله‌سایه‌ی سیاسه‌ته‌ نوێیه‌كانی یوتوبه‌وه‌. نیوپایپ ناتوانێت ئه‌م ڤیدیۆیه‌ لێبدات. خاوێنكردنه‌وی ئه‌و شه‌كرۆكانه‌ی كه‌ له‌ نیوپایپ كۆگاكراون ، ئه‌مه‌ش له‌دوای شیكار كردنی reCAPTCHA شه‌كرۆكه‌كانی reCAPTCHA خاوێنكرانه‌وه‌ سڕینه‌وه‌ی شه‌كرۆكه‌كانی reCAPTCHA @@ -572,9 +539,7 @@ دەتوانیت لە خوارەوە ڕووکاری ڕەشی دڵخوازی خۆت دیار بکەیت ڕووکاری ڕەشی دڵخوازی خۆت دیار بکە — %s دۆخی فییدی خێرا ناتوانێت زانیاری پتر له‌باره‌ی ئه‌مه‌وه‌ بدات. - هه‌ژماری ئه‌م كه‌سه‌ له‌ناوبراوه‌. -\nنیوپایپ ناتوانێت فییده‌كانی داهاتووی ئه‌م كه‌سه‌ پیشان بدات. -\nجا ده‌ته‌وێت به‌ژداری لابده‌یت له‌م كه‌ناڵه‌؟ + هه‌ژماری ئه‌م كه‌سه‌ له‌ناوبراوه‌. \nنیوپایپ ناتوانێت فییده‌كانی داهاتووی ئه‌م كه‌سه‌ پیشان بدات. \nجا ده‌ته‌وێت به‌ژداری لابده‌یت له‌م كه‌ناڵه‌؟ ناتوانرێت فیید باربکرێت تا ً`%s` . هه‌ڵه‌ له‌ باركردنی فیید ئەگەر تووشی شاشەی ڕەش یان لکەلکە بوویت لە کاتی پەخشکردنی ڤیدیۆدا، تونێلکردنی میدیا لەکاربخە. @@ -657,11 +622,9 @@ لێدوانی هەڵواسراو کڕاش کردنی لێدەر پیشاندانی هەڵەی سناکباڕ - هیچ FileManager پەڕگەی گونجاو بۆ ئەم کردارە نەدۆزراوەتەوە. -\nتکایە بەڕێوەبەری پەڕگەیەک دابمەزرێنە یان هەوڵبدە \'%s\' لە Settings بڕۆ Download لەکاربخە + هیچ FileManager پەڕگەی گونجاو بۆ ئەم کردارە نەدۆزراوەتەوە. \nتکایە بەڕێوەبەری پەڕگەیەک دابمەزرێنە یان هەوڵبدە \'%s\' لە Settings بڕۆ Download لەکاربخە LeakCanary بەردەست نییە - هیچ FileManager گونجاو نەدۆزرایەوە بۆ ئەم کردارە. -\nتکایە FileManager دابمەزرێنە کە گونجاوبێت لەگەڵ دەسەڵاتی گەیشتن بە بیرگە. + هیچ FileManager گونجاو نەدۆزرایەوە بۆ ئەم کردارە. \nتکایە FileManager دابمەزرێنە کە گونجاوبێت لەگەڵ دەسەڵاتی گەیشتن بە بیرگە. پشکنین کردن بۆ پەخشی نوێ پەیامەکانی پەخشە نوێیەکان پەیام بکرێم لەکاتی هەبوونی پەخشی نوێی بەژدارییەکان diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 861f908e7..6c12da0d1 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -9,7 +9,7 @@ Stáhnout Hledat Nastavení - Mysleli jste „%1$s“\? + Mysleli jste „%1$s“? Sdílet s Použít externí videopřehrávač Použít externí audiopřehrávač @@ -18,7 +18,7 @@ Adresář pro stažené audio Výchozí rozlišení Přehrát pomocí Kodi - Nainstalovat chybějící aplikaci Kore\? + Nainstalovat chybějící aplikaci Kore? Adresář pro stažená videa Sem budou ukládána stažená videa Zvolte adresář pro stažená videa @@ -84,8 +84,7 @@ Co:\nŽádost:\nJazyk obsahu:\nZemě obsahu:\nJazyk aplikace:\nSlužba:\nČas GMT:\nBalíček:\nVerze:\nVerze OS: Vše Otevřít ve vyskakovacím okně - Toto oprávnění je vyžadováno -\npro otevření ve vyskakovacím okně + Toto oprávnění je vyžadováno \npro otevření ve vyskakovacím okně U některých rozlišení odstraní zvuk Zobrazit vyšší rozlišení Pouze některá zařízení dokáží přehrávat 2K/4K videa @@ -126,18 +125,21 @@ %s odběratel %s odběratelé + %s odběratelů %s odběratelů Žádná zhlédnutí %s zhlédnutí %s zhlédnutí + %s zhlédnutí %s zhlédnutí Žádná videa %s video %s videa + %s videí %s videí Stahování @@ -242,9 +244,9 @@ Zvětšit Ladění Automaticky generováno - Monitoring úniku paměti může způsobit nereagování aplikace při heap dumpingu - Nahlásit mimo-cyklické chyby - Vynutit hlášení nedoručitelných výjimek Rx mimo životnost fragmentu nebo aktivity po odstranění + Monitorování úniků paměti může způsobit, že aplikace nebude odpovídat během vytváření výpisů paměti + Hlásit chyby out-of-lifecycle + Vynutit hlášení nedoručitelných chyb Rx mimo fragment cyklu aktivity po vyhození Použít rychlé nepřesné posouvání Nepřesné posouvání umožňuje přehrávači přesouvat se na pozice rychleji se sníženou přesností. Posun o 5, 15 nebo 25 sekund není s touto možností podporován Mezipaměť obrázků vymazána @@ -268,25 +270,10 @@ Předchozí export Odběry nelze importovat Odběry nelze exportovat - Importovat odběry YouTube z exportu dat Google: -\n -\n1. Přejděte na tuto adresu URL: %1$s -\n2. Při požádání se přihlaste -\n3. Klikněte na „Jsou zahrnuta všechna data“, poté na „Zrušit výběr všech“ a poté vyberte jen \"odběry\" a klikněte na OK -\n4. Klikněte na „Další krok“ a poté na „Vytvořit export“ -\n5. Vyčkejte, než se objeví tlačítko „Stáhnout“ a klikněte na něj -\n6. Klepněte na IMPORTOVAT SOUBOR níže a vyberte stažený soubor .zip -\n7. [Pokud se import .zip souboru nezdaří] Rozbalte soubor .csv (měl by se nacházet v „YouTube and YouTube Music/subscriptions/subscriptions.csv“), klepněte na IMPORTOVAT SOUBOR níže a vyberte rozbalený soubor csv - Importovat profil SoundCloud zadáním adresy URL nebo vašeho ID: -\n -\n1. Ve svém prohlížeči povolte „režim pro PC“ (pro mobilní zařízení není stránka dostupná) -\n2. Přejděte na tuto adresu URL: %1$s -\n3. Při požádání se přihlaste -\n4. Zkopírujte URL adresu profilu, na kterou jste byli přesměrováni. + Importovat odběry YouTube z exportu dat Google: \n \n1. Přejděte na tuto adresu URL: %1$s \n2. Při požádání se přihlaste \n3. Klikněte na „Jsou zahrnuta všechna data“, poté na „Zrušit výběr všech“ a poté vyberte jen \"odběry\" a klikněte na OK \n4. Klikněte na „Další krok“ a poté na „Vytvořit export“ \n5. Vyčkejte, než se objeví tlačítko „Stáhnout“ a klikněte na něj \n6. Klepněte na IMPORTOVAT SOUBOR níže a vyberte stažený soubor .zip \n7. [Pokud se import .zip souboru nezdaří] Rozbalte soubor .csv (měl by se nacházet v „YouTube and YouTube Music/subscriptions/subscriptions.csv“), klepněte na IMPORTOVAT SOUBOR níže a vyberte rozbalený soubor csv + Importovat profil SoundCloud zadáním adresy URL nebo vašeho ID: \n \n1. Ve svém prohlížeči povolte „režim pro PC“ (pro mobilní zařízení není stránka dostupná) \n2. Přejděte na tuto adresu URL: %1$s \n3. Při požádání se přihlaste \n4. Zkopírujte URL adresu profilu, na kterou jste byli přesměrováni. vašeID, soundcloud.com/yourid - Pamatujte, že tato operace může být náročná na data. -\n -\nChcete pokračovat? + Pamatujte, že tato operace může být náročná na data. \n \nChcete pokračovat? Ovládání rychlosti přehrávání Tempo Výška tónu @@ -298,11 +285,11 @@ Upravit velikost textu titulků a styly pozadí. Změny se projeví po restartu aplikace Vymazat historii sledování Vymaže historii přehraných streamů pozic playbacku - Vymazat celkovou historii sledování\? + Vymazat celkovou historii sledování? Historie sledování smazána Vymazat historii vyhledávání Vymaže historii vyhledávaných klíčových slov - Vymazat celkovou historii vyhledávání\? + Vymazat celkovou historii vyhledávání? Historie vyhledávání smazána Jedna položka smazána. NewPipe je copyleftovaný svobodný software: můžete jej jakkoli používat, studovat, sdílet a vylepšovat. Redistribuovat a/nebo upravovat jej můžete pod podmínkami licence GNU General Public License zveřejněné nadací Free Software Foundation, buď ve verzi 3, nebo v jakékoli novější verzi (záleží na vás). @@ -311,15 +298,13 @@ Stopy Uživatelé Ochrana soukromí NewPipe - Projekt NewPipe bere vaše soukromí velice vážně. Proto aplikace neshromažďuje žádné údaje bez vašeho souhlasu. -\nZásady ochrany soukromí NewPipe podrobně vysvětlují, jaké údaje jsou odesílány a ukládány, když odešlete zprávu o pádu aplikace. + Projekt NewPipe bere vaše soukromí velice vážně. Proto aplikace neshromažďuje žádné údaje bez vašeho souhlasu. \nZásady ochrany soukromí NewPipe podrobně vysvětlují, jaké údaje jsou odesílány a ukládány, když odešlete zprávu o pádu aplikace. Přečíst zásady ochrany osobních údajů Chcete také přenést nastavení? Zrychleně vpřed během ticha Krok Reset - Abychom vyhověli Obecnému nařízení o ochraně osobních údajů (GDPR), upozorňujeme vás na zásady ochrany soukromí v NewPipe. Přečtěte si je, prosím, pozorně. -\nJe potřeba je odsouhlasit, abyste nám mohli odeslat hlášení chyb. + Abychom vyhověli Obecnému nařízení o ochraně osobních údajů (GDPR), upozorňujeme vás na zásady ochrany soukromí v NewPipe. Přečtěte si je, prosím, pozorně. \nJe potřeba je odsouhlasit, abyste nám mohli odeslat hlášení chyb. Přijmout Odmítnout Bez omezení @@ -338,7 +323,7 @@ Externí úložiště není k dispozici Nelze načíst uložené karty, takže se použijí výchozí karty Obnovit do výchozího nastavení - Chcete obnovit výchozí nastavení\? + Chcete obnovit výchozí nastavení? Počet odběratelů není k dispozici Karty, které jsou zobrazeny na hlavní stránce Aktualizace @@ -384,7 +369,7 @@ Žádné komentáře Nelze načíst komentáře Zavřít - Stahování na externí SD kartu není možné. Resetovat umístění složky pro stahování\? + Stahování na externí SD kartu není možné. Resetovat umístění složky pro stahování? Pokračovat v přehrávání Obnovit poslední pozici přehrávání Pozice v seznamech @@ -395,14 +380,13 @@ NewPipe byl ukončen v průběhu zpracovávání souboru V zařízení nezbývá žádné místo Postup ztracen, protože soubor byl smazán - Jste si jisti smazáním své historie stahování nebo smazáním všech stažených souborů\? + Jste si jisti smazáním své historie stahování nebo smazáním všech stažených souborů? Omezit frontu stahování Najednou se bude stahovat pouze jeden soubor Začít stahování Pozastavit stahování Zeptat se na složku pro stahování - Budete dotázáni, kam jednotlivé soubory uložit. -\nAktivujte výběr systémového adresáře (SAF), chcete-li stáhnout soubor na externí SD kartu + Budete dotázáni, kam jednotlivé soubory uložit. \nAktivujte výběr systémového adresáře (SAF), chcete-li stáhnout soubor na externí SD kartu Použít výběr systémového adresáře (SAF) „Storage Access Framework“ umožňuje stahovat na externí SD kartu Zobrazit pozici přehrávání v seznamech @@ -416,12 +400,14 @@ %s sleduje %s sledují + %s sleduje %s sleduje Nikdo neposlouchá %s posluchač %s posluchači + %s posluchačů %s posluchačů Výchozí kiosek @@ -452,6 +438,7 @@ %d vteřina %d vteřiny + %d vteřin %d vteřin Kvůli omezením ExoPlayer bylo prohledávání nastaveno na %d vteřin @@ -460,16 +447,19 @@ %d minuta %d minuty + %d minut %d minut %d hodina %d hodiny + %d hodin %d hodin %d den %d dny + %d dnů %d dnů Skupiny kanálů @@ -482,6 +472,7 @@ %d vybrána %d vybrány + %d vybráno %d vybráno Prázdné jméno skupiny @@ -495,34 +486,20 @@ K dispozici na některých zařízeních, je obvykle mnohem rychlejší, ale může vrátit omezený počet položek a často neúplné informace (např. bez trvání, typu položky, skutečného stavu) Zapnout rychlý režim Vypnout rychlý režim - Zdá se vám načítání příliš pomalé\? Pokud ano, zkuste zapnout rychlé načítání (lze změnit v nastavení nebo stiskem tlačítka níže). -\n -\nNewPipe nabízí dvě strategie načítání seznamu novinek -\n• Stažení celého kanálu vašich odběrů, což je pomalé, ale spolehlivé. -\n• Použití služby k tomu určené, což je rychlé, ale obvykle neobsahuje všechny potřebné informace. -\n -\nRozdíl mezi těmi dvěma je, že rychlému způsobu obvykle chybí nějaká informace, např. délka videa nebo typ (nemůže rozlišit mezi živým a normálním videem) a patrně vrátí méně položek. -\n -\nYouTube je příklad služby, která nabízí tuto rychlou metodu pomocí RSS přísunu. -\n -\nVýběr je vposledku určen tím, čemu dáte přednost: rychlosti nebo přesnosti informací. - Tento obsah ještě není podporován NewPipe. -\n -\nSnad bude podporován v budoucnu. + Zdá se vám načítání příliš pomalé? Pokud ano, zkuste zapnout rychlé načítání (lze změnit v nastavení nebo stiskem tlačítka níže). \n \nNewPipe nabízí dvě strategie načítání seznamu novinek \n• Stažení celého kanálu vašich odběrů, což je pomalé, ale spolehlivé. \n• Použití služby k tomu určené, což je rychlé, ale obvykle neobsahuje všechny potřebné informace. \n \nRozdíl mezi těmi dvěma je, že rychlému způsobu obvykle chybí nějaká informace, např. délka videa nebo typ (nemůže rozlišit mezi živým a normálním videem) a patrně vrátí méně položek. \n \nYouTube je příklad služby, která nabízí tuto rychlou metodu pomocí RSS přísunu. \n \nVýběr je vposledku určen tím, čemu dáte přednost: rychlosti nebo přesnosti informací. + Tento obsah ještě není podporován NewPipe. \n \nSnad bude podporován v budoucnu. ∞ videí 100+ videí Umělci Alba Skladby - Toto video má věkové omezení. -\n -\nPokud jej chcete vidět, povolte „%1$s“ v nastavení. + Toto video má věkové omezení. \n \nPokud jej chcete vidět, povolte „%1$s“ v nastavení. Ano, i zčásti zhlédnutá videa Odstranit zhlédnuté streamy? Odstranit zhlédnuté Streamy, které jste zhlédli před a po jejich přidání do playlistu, budou odstraněny. \nJste se jisti? - Původní texty služeb budou viditelné u položek streamů - U položek zobrazit původní čas + Původní texty ze služeb budou viditelné u položek streamů + Zobrazit původní relativní čas u položek Zapnout „Omezený režim“ YouTube Od %s Vytvořil %s @@ -539,7 +516,7 @@ Pouze na Wi-Fi Automaticky zahájit přehrávání — %s Fronta přehravání - Nelze rozpoznat zadanou adresu URL. Otevřít pomocí jiné aplikace\? + Nelze rozpoznat zadanou adresu URL. Otevřít pomocí jiné aplikace? Automatické přehravání Fronta aktivního přehrávače bude smazána Přepnutí z jednoho přehrávače na jiný může nahradit vaši frontu @@ -583,7 +560,7 @@ Na Vašem zařízení není aplikace, která to umí otevřít Podobné položky Vypnout pro skrytí popisu videa a doplňkové informace - Zbořit aplikaci + Shodit aplikaci Stahování bylo zahájeno Svůj oblíbený noční motiv si můžete zvolit níže Zvolte si svůj oblíbený noční motiv – %s @@ -597,8 +574,7 @@ Tento obsah není ve vaší zemi dostupný. Zobrazit podrobnosti kanálu Vyřešit - Toto video je věkově omezeno. -\nKvůli novým pravidlům YouTube ohledně věkově omezených videí nemůže NewPipe získat přístup na streamy videa, a tak je nemůže přehrát. + Toto video je věkově omezeno. \nKvůli novým pravidlům YouTube ohledně věkově omezených videí nemůže NewPipe získat přístup na streamy videa, a tak je nemůže přehrát. Noční motiv Zakažte tunelování médií, pokud máte potíže s černou obrazovkou nebo sekáním při přehrávání videa. Zakázat tunelování médií @@ -620,9 +596,7 @@ Nyní můžete vybrat v popisu text. Pamatujte, že v režimu výběru může stránka blikat a odkazy nemusí reagovat na kliknutí. Účet uzavřen Režim rychlého feedu o tom neposkytuje více informací. - Autorův účet byl uzavřen. -\nNewPipe nebude už moci načíst tento feed. -\nChcete zrušit objednávku tohoto kanálu\? + Autorův účet byl uzavřen. \nNewPipe nebude už moci načíst tento feed. \nChcete zrušit objednávku tohoto kanálu? Feed pro \'%s\' nemohl být načten. Chyba při načítání feedu Počínaje systémem Android 10 je podporován pouze „Storage Access Framework“ @@ -641,11 +615,13 @@ %1$s stažení smazáno %1$s stažení smazána + %1$s staženích smazáno %1$s staženích smazáno Stahování dokončeno %s stahování dokončena + %s stahováních dokončeno %s stahováních dokončeno Vzdálené návrhy vyhledávání @@ -660,21 +636,19 @@ Kontrola aktualizací NewPipe narazil na problém, klikněte pro nahlášení Došlo k chybě, více v oznámení - Vytvořit oznámení o chybě + Vytvořit chybové oznámení Kontrola aktualizací… Zobrazit „Shodit přehrávač“ Nové položky - Pro tuto akci nebyl nalezen žádný vhodný správce souborů. -\nNainstalujte správce souborů kompatibilní se Storage Access Framework + Pro tuto akci nebyl nalezen žádný vhodný správce souborů. \nNainstalujte správce souborů kompatibilní se Storage Access Framework Oznámení o hlášení chyb Oznámení za účelem hlášení chyb - Pro tuto akci nebyl nalezen žádný vhodný správce souborů. -\nNainstalujte správce souborů nebo zkuste vypnout \'%s\' v nastavení stahování - Ukáže volbu pro zřícení během používání přehrávače - Zobrazit krátké oznámení o chybě + Pro tuto akci nebyl nalezen žádný vhodný správce souborů. \nNainstalujte správce souborů nebo zkuste vypnout \'%s\' v nastavení stahování + Zobrazí možnost shození během používání přehrávače + Zobrazit chybovou hlášku Připnutý komentář Shodit přehrávač - LeakCanary není dostupné + LeakCanary není dostupný Výchozí nastavení služby ExoPlayer Nastavit oznámení o právě přehrávaném streamu Oznámení o nových streamech @@ -697,6 +671,7 @@ %s nový stream %s nové streamy + %s nových streamů %s nových streamů Procento @@ -725,14 +700,14 @@ Duplikát přidán %dkrát Ignorovat hardwarová multimediální tlačítka Užitečné například pokud používáte sluchátka s rozbitými fyzickými tlačítky - Odstranit duplicity\? + Odstranit duplicity? Zobrazit následující streamy Zobrazit/skrýt streamy Celé zhlédnuto Částečně zhlédnuto Nadcházející Odstranit duplicity - Chcete odstranit všechny duplicitní streamy v tomto playlistu\? + Chcete odstranit všechny duplicitní streamy v tomto playlistu? Akce levého gesta Akce pravého gesta Hlasitost @@ -777,8 +752,7 @@ Které karty mají být zobrazeny na stránkách kanálů Sdílet seznam adres Sdílet s názvy - %1$s -\n%2$s + %1$s \n%2$s Karty kanálu Shorts Přepnout orientaci obrazovky @@ -811,6 +785,7 @@ %s odpověď %s odpovědi + %s odpovědí %s odpovědí Zobrazit více @@ -820,13 +795,10 @@ Záloha a obnovení Obnovit nastavení Obnovení všech nastavení na výchozí hodnoty - Obnovením nastavení se zruší všechna preferovaná nastavení a aplikace se restartuje. -\n -\nJste si jisti, že chcete pokračovat? + Obnovením nastavení se zruší všechna preferovaná nastavení a aplikace se restartuje. \n \nJste si jisti, že chcete pokračovat? Ano Ne - NewPipe může čas od času automaticky kontrolovat nové verze a upozornit vás na jejich dostupnost. -\nChcete tuto funkci povolit? + NewPipe může čas od času automaticky kontrolovat nové verze a upozornit vás na jejich dostupnost. \nChcete tuto funkci povolit? Nastavení v importovaném exportu používají zranitelný formát. NewPipe používá nový formát od verze 0.27.0. Ujistěte se, že export importujete z důvěryhodného zdroje a v budoucnu upřednostňujte používání exportů získaných z NewPipe 0.27.0 nebo novějších. Podpora importu nastavení v tomto zranitelném formátu bude brzy kompletně odstraněna, kvůli čemuž staré verze NewPipe nebudou moci importovat nastavení z exportů z nových verzí. sekundární Sdílet jako dočasný playlist YouTube diff --git a/app/src/main/res/values-cy/strings.xml b/app/src/main/res/values-cy/strings.xml index a6b3daec9..4a4cb755f 100644 --- a/app/src/main/res/values-cy/strings.xml +++ b/app/src/main/res/values-cy/strings.xml @@ -1,2 +1,3 @@ - \ No newline at end of file + + diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 66042bcd4..3dbb7b099 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -13,7 +13,7 @@ Hent stream-fil Søg Indstillinger - Mente du \"%1$s\"\? + Mente du \"%1$s\"? Del med Brug ekstern videoafspiller Fjerner lyd ved nogle opløsninger @@ -125,7 +125,7 @@ Eksportér historik, abonnementer, playlister og indstillinger Ryd visningshistorik Sletter historikken over afspillede streams og afspilningspositionerne - Slet hele visningshistorikken\? + Slet hele visningshistorikken? Visningshistorik slettet Ryd søgehistorik Sletter historik for søgeord @@ -195,8 +195,7 @@ Vent venligst… Kopieret til udklipsholder Angiv venligst en lagringsmappe senere i indstillinger - Denne tilladelse er nødvendig for -\nat åbne i popup-tilstand + Denne tilladelse er nødvendig for \nat åbne i popup-tilstand 1 element slettet. reCAPTCHA-udfordring reCAPTCHA-udfordring anmodet @@ -227,7 +226,7 @@ Læs licens Historik Historik - Vil du slette dette element fra søgehistorikken\? + Vil du slette dette element fra søgehistorikken? Sidst Afspillet Mest Afspillet Indhold af hovedside @@ -243,7 +242,7 @@ Ingen gyldig ZIP-fil Advarsel: Kunne ikke importere alle filer. Dette vil overskrive dine nuværende indstillinger. - Vil du også importere indstillinger\? + Vil du også importere indstillinger? Populært lige nu Top 50 Nyt og populært @@ -333,19 +332,9 @@ Eksporterer… Importér fil Forrige eksport - Importér YouTube-abonnementer ved at hente eksportfilen: -\n -\n1. Gå til denne webadresse: %1$s -\n2. Log ind, når du bliver bedt om det -\n3. Klik på \"Alle Youtube-data medtages\", og fravælg alt bortset fra \"abonnementer\". -\n4. Klik på \"Næste trin\", og derefter \"Opret eksport\". -\n5. Klik på \"Download\"-knappen efter den popper frem. -\n6. Klik på \"IMPORTÉR FIL\" nederst på denne side, og vælg den hentede .zip-fil. -\n7. [Såfremt .zip-importeringen slår fejl] Uddrag .csv-filen (som normalt findes i \"YouTube og YouTube Music/abonnementer/abonnementer.csv\"). Klik på \"IMPORTÉR FIL\" nederst på denne side, og vælg den uddragede .csv-fil + Importér YouTube-abonnementer ved at hente eksportfilen: \n \n1. Gå til denne webadresse: %1$s \n2. Log ind, når du bliver bedt om det \n3. Klik på \"Alle Youtube-data medtages\", og fravælg alt bortset fra \"abonnementer\". \n4. Klik på \"Næste trin\", og derefter \"Opret eksport\". \n5. Klik på \"Download\"-knappen efter den popper frem. \n6. Klik på \"IMPORTÉR FIL\" nederst på denne side, og vælg den hentede .zip-fil. \n7. [Såfremt .zip-importeringen slår fejl] Uddrag .csv-filen (som normalt findes i \"YouTube og YouTube Music/abonnementer/abonnementer.csv\"). Klik på \"IMPORTÉR FIL\" nederst på denne side, og vælg den uddragede .csv-fil ditID, soundcloud.com/ditID - Bemærk, at denne operation kan kræve meget netværkstrafik. -\n -\nVil du fortsætte? + Bemærk, at denne operation kan kræve meget netværkstrafik. \n \nVil du fortsætte? Knapper for Afspilningshastighed Tempo Tonehøjde @@ -430,13 +419,11 @@ Vis indhold, der muligvis er uegnet for børn, fordi det har en aldersgrænse (fx 18+) Slå YouTubes \"Begrænset Tilstand\" til YouTube tilbyder en \"Begrænset Tilstand\", som skjuler potentielt voksenindhold - Denne video er aldersbegrænset. -\n -\nSlå \"%1$s\" til i indstillingerne, hvis du vil se den. + Denne video er aldersbegrænset. \n \nSlå \"%1$s\" til i indstillingerne, hvis du vil se den. Nye streams Notifikationer om nye streams fra abonnementer reCAPTCHA-cookies blev ryddet - Slet alle afspilningspositioner\? + Slet alle afspilningspositioner? Filen er flyttet eller slettet NewPipe stødte ind i en fejl; tryk for at rapportere Rapportér på GitHub @@ -471,8 +458,7 @@ Vil du rydde din downloadhistorik eller slette alle hentede filer? Kan ikke gendanne dette download Ryd downloadhistorik - NewPipe-projektet tager dit privatliv meget alvorligt. Derfor indsamler appen ikke nogen data uden dit samtykke. -\nNewPipe\'s privatlivspolitik forklarer i detaljer, hvilke data der sendes og gemmes, når du sender en nedbrudsrapport. + NewPipe-projektet tager dit privatliv meget alvorligt. Derfor indsamler appen ikke nogen data uden dit samtykke. \nNewPipe\'s privatlivspolitik forklarer i detaljer, hvilke data der sendes og gemmes, når du sender en nedbrudsrapport. Kopiér formateret rapport Giv tilladelse til at vise over andre apps Vis indikatorer for afspilningsposition i lister @@ -488,8 +474,7 @@ Få Android til at vælge notifikationens farve ud fra den primære farve i miniaturebilledet (virker ikke på alle enheder) Nat-tema Søgningsvarighed for spole frem/tilbage - Denne video er aldersbegrænset. -\nGrundet nye YouTube-politikker om aldersbegrænsede videoer har NewPipe ikke adgang til nogen af dens videostreams og kan derfor ikke afspille dem. + Denne video er aldersbegrænset. \nGrundet nye YouTube-politikker om aldersbegrænsede videoer har NewPipe ikke adgang til nogen af dens videostreams og kan derfor ikke afspille dem. Crash afspilleren Spørg om bekræftelse, før du rydder en kø Forhåndsvisning af miniaturebilleder på statuslinje @@ -528,9 +513,7 @@ Tjek efter nye streams Lav en fejlnotifikation Lokale - Udgiverens konto er blevet lukket. -\nNewPipe vil ikke være i stand til at indlæse dette feed i fremtiden. -\nØnsker du at afmelde denne kanal? + Udgiverens konto er blevet lukket. \nNewPipe vil ikke være i stand til at indlæse dette feed i fremtiden. \nØnsker du at afmelde denne kanal? Feed sidst opdateret: %s Ikke indlæst: %d Indlæser feed… @@ -544,9 +527,7 @@ Vis miniaturebillede Tags Aldersbegrænsning - Dette indhold understøttes endnu ikke af NewPipe. -\n -\nVi håber at kunne understøtte det i en fremtiden. + Dette indhold understøttes endnu ikke af NewPipe. \n \nVi håber at kunne understøtte det i en fremtiden. Dette indhold er kun tilgængeligt for brugere, som har betalt for det, så det kan ikke streames eller hentes af NewPipe. Konto lukket Dette indhold er privat, så det kan ikke streames eller hentes af NewPipe. @@ -560,7 +541,7 @@ Udregner hash Løs Ingen abonnementer valgt - Vil du slette denne gruppe\? + Vil du slette denne gruppe? Licens %s ny stream @@ -597,15 +578,9 @@ Fremskridt tabt, fordi filen blev slettet NewPipe blev lukket under arbejde på filen kan ikke overskrive filen - For at overholde den europæiske databeskyttelsesforordning (GDPR) henviser vi hermed din opmærksomhed til NewPipes privatlivspolitik. Læs den venligst omhyggeligt. -\nDu skal acceptere den for at kunne sende os fejlrapporten. + For at overholde den europæiske databeskyttelsesforordning (GDPR) henviser vi hermed din opmærksomhed til NewPipes privatlivspolitik. Læs den venligst omhyggeligt. \nDu skal acceptere den for at kunne sende os fejlrapporten. Aflænk (kan skabe forvrængning) - Importér en SoundCloud-profil ved at skrive enten dit URL eller ID: -\n -\n1. Slå \"desktop-tilstand\" til i mobilbrowsere. -\n2. Gå til denne adresse: %1$s -\n3. Log ind, når du bliver bedt om det -\n4. Kopiér adressen på den profil, du bliver omdirigeret til. + Importér en SoundCloud-profil ved at skrive enten dit URL eller ID: \n \n1. Slå \"desktop-tilstand\" til i mobilbrowsere. \n2. Gå til denne adresse: %1$s \n3. Log ind, når du bliver bedt om det \n4. Kopiér adressen på den profil, du bliver omdirigeret til. Vis oprindelig tid siden på elementer Autogenereret (ingen uploader fundet) Slå lyd til @@ -638,10 +613,8 @@ Brug systemets mappevælger (SAF) Kanalens avatar-miniaturebillede Dette er et SoundCloud Go+-nummer, i hvert fald i dit land, så det kan ikke streames eller hentes af NewPipe. - Ingen passende filhåndtering blev fundet til denne handling. -\nInstaller venligst en Storage Access Framework-kompatibel filhåndtering. - Ingen passende filhåndtering blev fundet til denne handling. -\nInstaller venligst en filhåndtering, eller prøv at deaktivere \'%s\' i downloadindstillingerne. + Ingen passende filhåndtering blev fundet til denne handling. \nInstaller venligst en Storage Access Framework-kompatibel filhåndtering. + Ingen passende filhåndtering blev fundet til denne handling. \nInstaller venligst en filhåndtering, eller prøv at deaktivere \'%s\' i downloadindstillingerne. Aktivér valg af tekst i beskrivelsen Automatisk (enhedstema) Deaktivér valg af tekst i beskrivelsen @@ -657,8 +630,7 @@ Størrelse på afspilningsinterval ExoPlayer-standard Tomt gruppenavn - Du vil blive spurgt, hvor du vil gemme hver enkelt download. -\nAktivér systemets mappevælger (SAF), hvis du vil hente til et eksternt SD-kort + Du vil blive spurgt, hvor du vil gemme hver enkelt download. \nAktivér systemets mappevælger (SAF), hvis du vil hente til et eksternt SD-kort Originaltekster fra tjenester vil være synlige i stream-elementer Ingen videostreams er tilgængelige for eksterne afspillere Fra @@ -668,17 +640,7 @@ Tving rapportering af ikke-levérbare Rx-undtagelser uden for fragmentets eller aktivitetens livscyklus efter bortskaffelse Tryk for at hente %s Fra og med Android 10 understøttes kun \"Storage Access Framework\" - Synes du, at feed-indlæsning er for langsom? Hvis det er tilfældet, så prøv at aktivere hurtig indlæsning (du kan ændre det i indstillingerne eller ved at trykke på knappen nedenfor). -\n -\nNewPipe tilbyder to strategier til feed-indlæsning: -\n- Hentning af hele abonnementskanalen, hvilket er langsomt, men komplet. -\n- Brug af et dedikeret service endpoint, hvilket er hurtigt, men normalt ikke komplet. -\n -\nForskellen mellem de to, er, at den hurtige metode normalt mangler nogle oplysninger, f.eks. elementets varighed eller type (kan ikke skelne mellem livevideoer og normale videoer), og den returnerer muligvis færre elementer. -\n -\nYouTube er et eksempel på en tjeneste, der tilbyder denne hurtige metode med sit RSS-feed. -\n -\nValget er altså et spørgsmål om, hvad du foretrækker: hastighed eller præcise oplysninger. + Synes du, at feed-indlæsning er for langsom? Hvis det er tilfældet, så prøv at aktivere hurtig indlæsning (du kan ændre det i indstillingerne eller ved at trykke på knappen nedenfor). \n \nNewPipe tilbyder to strategier til feed-indlæsning: \n- Hentning af hele abonnementskanalen, hvilket er langsomt, men komplet. \n- Brug af et dedikeret service endpoint, hvilket er hurtigt, men normalt ikke komplet. \n \nForskellen mellem de to, er, at den hurtige metode normalt mangler nogle oplysninger, f.eks. elementets varighed eller type (kan ikke skelne mellem livevideoer og normale videoer), og den returnerer muligvis færre elementer. \n \nYouTube er et eksempel på en tjeneste, der tilbyder denne hurtige metode med sit RSS-feed. \n \nValget er altså et spørgsmål om, hvad du foretrækker: hastighed eller præcise oplysninger. Den valgte stream understøttes ikke af eksterne afspillere Denne indstilling er kun tilgængelig, hvis %s er valgt som tema Du kan nu vælge tekst inde i beskrivelsen. Bemærk, at siden kan flimre, og links muligvis ikke kan klikkes på, mens du er i markeringstilstand. @@ -795,12 +757,9 @@ Flere muligheder \? - %1$s: %2$s - %1$s -\n%2$s + %1$s \n%2$s Aktivér denne indstilling, hvis du oplever initialiseringsproblemer med dekodere, som falder tilbage til dekodere af lavere prioritet, hvis de primære dekoderes initialisering fejler. Dette kan resultere i dårligere afspilningsydelse end ved brug af primære dekodere - Denne løsning frigiver og genindstiller video-codecs, når en overflade ændres, i stedet for at indstille overfladen til codec\'en direkte. Denne indstilling bruges allerede af ExoPlayer på nogle enheder med dette problem, men har kun effekt på Android 6 og nyere. -\n -\nAktivering af denne indstilling kan forhindre afspilningsfejl, når du skifter den aktuelle videoafspiller eller skifter til fuld skærm + Denne løsning frigiver og genindstiller video-codecs, når en overflade ændres, i stedet for at indstille overfladen til codec\'en direkte. Denne indstilling bruges allerede af ExoPlayer på nogle enheder med dette problem, men har kun effekt på Android 6 og nyere. \n \nAktivering af denne indstilling kan forhindre afspilningsfejl, når du skifter den aktuelle videoafspiller eller skifter til fuld skærm Brug altid ExoPlayers overfladeindstilling til video-output som løsning Kort %1$s %2$s @@ -809,11 +768,8 @@ Nej Nulstil indstillinger Nulstil alle indstillinger til deres standardværdier - NewPipe kan automatisk tjekke efter nye versioner indimellem og give dig besked, når de er tilgængelige. -\nØnsker du at aktivere dette? - Hvis du nulstiller alle indstillinger, kasseres alle dine foretrukne indstillinger, og appen genstartes. -\n -\nEr du sikker på, at du vil fortsætte? + NewPipe kan automatisk tjekke efter nye versioner indimellem og give dig besked, når de er tilgængelige. \nØnsker du at aktivere dette? + Hvis du nulstiller alle indstillinger, kasseres alle dine foretrukne indstillinger, og appen genstartes. \n \nEr du sikker på, at du vil fortsætte? Indstillingerne i den eksport, der importeres, bruger et sårbart format, der er blevet forældet siden NewPipe 0.27.0. Sørg for, at den eksport, der importeres, er fra en pålidelig kilde, og brug helst kun eksport fra NewPipe 0.27.0 eller nyere i fremtiden. Understøttelse af import af indstillinger i dette sårbare format fjernes snart helt, og så vil gamle versioner af NewPipe ikke længere være i stand til at importere indstillinger fra eksport fra nye versioner. Sikkerhedskopiering og gendannelse sekundær diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 0c8b92951..db42fcc65 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -1,7 +1,7 @@ Veröffentlicht am %1$s - Kein Stream-Player gefunden. Möchtest du VLC installieren\? + Kein Stream-Player gefunden. Möchtest du VLC installieren? Installieren Abbrechen Im Browser öffnen @@ -9,14 +9,14 @@ Herunterladen Suchen Einstellungen - Meintest du „%1$s“\? + Meintest du „%1$s“? Teilen mit - Downloadordner für Videos + Video-Downloadordner Heruntergeladene Videodateien werden hier gespeichert Downloadordner für Videodateien wählen Standardauflösung Mit Kodi abspielen - Fehlende Kore-App installieren\? + Fehlende Kore-App installieren? Option „Mit Kodi abspielen“ anzeigen Option anzeigen, um Videos mit Kodi abzuspielen Audio @@ -34,7 +34,7 @@ Externen Audio-Player verwenden Im Hintergrund abspielen Netzwerkfehler - Downloadordner für Audiodateien + Audio-Downloadordner Heruntergeladene Audiodateien werden hier gespeichert Downloadordner für Audiodateien wählen Design @@ -71,9 +71,9 @@ Prüfsumme Dateiname Fehler - Bitte warten … + Bitte warten … In Zwischenablage kopiert - Bitte gib später in den Einstellungen einen Downloadordner an + Bitte gib den Downloadordner später in den Einstellungen an Starten Pause OK @@ -89,8 +89,7 @@ Im Pop-up-Modus öffnen Standard-Videoformat Im Pop-up-Modus abspielen - Diese Berechtigung ist für das -\nÖffnen im Pop-up-Modus erforderlich + Diese Berechtigung ist für das \nÖffnen im Pop-up-Modus erforderlich Pop-up-Standardauflösung Höhere Auflösungen anzeigen Nur manche Geräte können 2K-/4K-Videos abspielen @@ -115,7 +114,7 @@ Auf GitHub ansehen Beitragen Download - Erlaubte Zeichen im Dateinamen + Zulässige Zeichen in Dateinamen Ungültige Zeichen werden durch dieses Zeichen ersetzt Ersetzungszeichen Buchstaben und Zahlen @@ -132,7 +131,7 @@ Verlauf Abonnement konnte nicht geändert werden Abonnement konnte nicht aktualisiert werden - Nach Unterbrechungen (z. B. Telefonaten) Wiedergabe fortsetzen + Nach Unterbrechungen (z. B. Telefonaten) Wiedergabe fortsetzen NewPipe-Benachrichtigung Benachrichtigungen für den NewPipe-Player Verhalten @@ -154,11 +153,11 @@ %s Video %s Videos - Die meisten Sonderzeichen + Die häufigsten Sonderzeichen Wiedergabe fortsetzen Player Nichts hier, außer dem Zirpen der Grillen - Möchtest du dieses Element aus dem Suchverlauf löschen\? + Möchtest du dieses Element aus dem Suchverlauf löschen? Leere Seite Einen Kanal auswählen Noch keine Kanalabonnements vorhanden @@ -202,7 +201,7 @@ Video-Player Wiedergabe im Hintergrund Pop-up-Player - Erhalte Informationen … + Erhalte Informationen … Gewünschten Inhalt laden Datenbank importieren Datenbank exportieren @@ -242,13 +241,11 @@ Automatisch erzeugt Import von Export nach - Wird importiert … - Wird exportiert … + Wird importiert … + Wird exportiert … Datei importieren Vorheriger Export - Beachte, dass diese Aktion das Netzwerk stark belasten kann. -\n -\nMöchtest du fortfahren\? + Beachte, dass diese Aktion das Netzwerk stark belasten kann. \n \nMöchtest du fortfahren? Bilder-Cache gelöscht Zwischengespeicherte (Metadaten) löschen Alle zwischengespeicherten Website-Daten entfernen @@ -273,22 +270,9 @@ Vergrößern Die Überwachung von Speicherlecks kann dazu führen, dass die App beim Heap-Dumping nicht mehr reagiert Fehler außerhalb des Lebenszyklus melden - Erzwingen der Meldung unzustellbarer Rx-Ausnahmen außerhalb des Lebenszyklus von Fragmenten oder Aktivitäten nach der Entsorgung - Importiere YouTube-Abonnements aus dem Google Takeout: -\n -\n1. Gehe zu dieser URL: %1$s -\n2. Melde dich an, falls du dazu aufgefordert wirst -\n3. Klicke auf „Alle Daten enthalten“, dann auf „Alle abwählen“, wähle dann nur „Abonnements“ und klicke auf „OK“ -\n4. Klicke auf „Nächster Schritt“ und dann auf „Export erstellen“ -\n5. Klicke auf die Schaltfläche „Download“, nachdem sie erscheint -\n6. Klicke unten auf \"Datei importieren\" und wähle die heruntergeladene Zip-Datei aus -\n7. [Wenn der Zip-Import fehlschlägt] Entpacke die CSV-Datei (normalerweise unter „YouTube und YouTube Music/Abos/Abos.csv“), klicke auf \"Datei importieren\" und wähle die extrahierte CSV-Datei aus - Importiere ein SoundCloud-Profil, indem die URL oder deine ID eingegeben wird: -\n -\n1. Aktiviere den Desktop-Modus in einem Web-Browser (die Seite ist für mobile Geräte nicht verfügbar) -\n2. Gehe zu dieser URL: %1$s -\n3. Melde dich an, falls du dazu aufgefordert wirst -\n4. Kopiere die Profil-URL, zu der du weitergeleitet wurdest. + Meldung unzustellbarer Rx-Ausnahmen außerhalb des Lebenszyklus von Fragmenten oder Aktivitäten nach dem Entsorgen erzwingen + Importiere YouTube-Abonnements aus dem Google Takeout: \n \n1. Gehe zu dieser URL: %1$s \n2. Melde dich an, falls du dazu aufgefordert wirst \n3. Klicke auf „Alle Daten enthalten“, dann auf „Alle abwählen“, wähle dann nur „Abonnements“ und klicke auf „OK“ \n4. Klicke auf „Nächster Schritt“ und dann auf „Export erstellen“ \n5. Klicke auf die Schaltfläche „Download“, nachdem sie erscheint \n6. Klicke unten auf \"Datei importieren\" und wähle die heruntergeladene Zip-Datei aus \n7. [Wenn der Zip-Import fehlschlägt] Entpacke die CSV-Datei (normalerweise unter „YouTube und YouTube Music/Abos/Abos.csv“), klicke auf \"Datei importieren\" und wähle die extrahierte CSV-Datei aus + Importiere ein SoundCloud-Profil, indem die URL oder deine ID eingegeben wird: \n \n1. Aktiviere den Desktop-Modus in einem Web-Browser (die Seite ist für mobile Geräte nicht verfügbar) \n2. Gehe zu dieser URL: %1$s \n3. Melde dich an, falls du dazu aufgefordert wirst \n4. Kopiere die Profil-URL, zu der du weitergeleitet wurdest. deineID, soundcloud.com/deineid Keine Streams zum Download verfügbar Bevorzugte „Öffnen“-Aktion @@ -297,15 +281,15 @@ Textgröße und Hintergrund der Untertitel im Player anpassen. Erfordert Neustart der App Wiedergabeverlauf löschen Den Verlauf der wiedergegebenen Streams und die Wiedergabepositionen löschen - Den ganzen Wiedergabeverlauf löschen\? + Den ganzen Wiedergabeverlauf löschen? Wiedergabeverlauf gelöscht Suchverlauf löschen Den Verlauf der Suchbegriffe löschen - Den gesamten Suchverlauf löschen\? + Den gesamten Suchverlauf löschen? Suchverlauf gelöscht 1 Element gelöscht. NewPipe ist freie Copyleft-Software: Du kannst sie nach Belieben benutzen, untersuchen, mit anderen teilen und verbessern. Insbesondere kannst du sie unter den von der Free Software Foundation veröffentlichten Bedingungen der GNU General Public License, in der Version 3 der Lizenz oder (nach deiner Wahl) jeder späteren Version, weitergeben und/oder verändern. - Möchtest du auch Einstellungen importieren\? + Möchtest du auch Einstellungen importieren? NewPipes Datenschutzerklärung Dem NewPipe-Projekt ist Datenschutz sehr wichtig. Daher sammelt die App keinerlei Daten ohne deine Zustimmung.\nNewPipes Datenschutzerklärung erläutert ausführlich, welche Daten beim Senden eines Absturzberichts übermittelt und gespeichert werden. Datenschutzerklärung lesen @@ -334,11 +318,11 @@ Datei gelöscht Benachrichtigung über App-Update Benachrichtigungen über neue NewPipe-Versionen - Kein externer Speicher verfügbar - Herunterladen auf externe SD-Karte ist nicht möglich. Downloadordner zurücksetzen\? + Externer Speicher nicht verfügbar + Herunterladen auf externe SD-Karte nicht möglich. Speicherort des Downloadordners zurücksetzen? Konnte gespeicherte Tabs nicht lesen, daher werden die Voreinstellungen genutzt Standardwerte wiederherstellen - Möchtest du die Standardwerte wiederherstellen\? + Möchtest du die Standardwerte wiederherstellen? Abonnentenzahl nicht abrufbar Welche Tabs auf der Hauptseite angezeigt werden Aktualisierungen @@ -376,8 +360,8 @@ Nachbearbeitung fehlgeschlagen Anhalten Maximale Wiederholungen - Maximalanzahl der Versuche, bevor der Download abgebrochen wird - Unterbrechen bei kostenpflichtigen Netzwerken + Maximalanzahl der Versuche, bevor das Herunterladen abgebrochen wird + Bei kostenpflichtigen Netzwerken unterbrechen Nützlich beim Wechsel zu mobilen Daten, obwohl einige Downloads nicht unterbrochen werden können Konferenzen Ereignisse @@ -402,19 +386,18 @@ NewPipe wurde während der Verarbeitung der Datei geschlossen Kein Speicherplatz mehr auf dem Gerät Vorgang abgebrochen, da die Datei gelöscht wurde - Möchtest du deinen Downloadverlauf oder alle heruntergeladenen Dateien löschen\? + Möchtest du deinen Downloadverlauf oder alle heruntergeladenen Dateien löschen? Downloadwarteschlange begrenzen - Ein Download wird gleichzeitig ausgeführt + Es wird jeweils ein Download gleichzeitig ausgeführt Downloads starten Downloads anhalten Downloadziel abfragen - Du wirst gefragt, wo jede heruntergeladene Datei gespeichert werden soll. -\nAktiviere die Systemordnerauswahl (SAF), wenn du auf eine externe SD-Karte herunterladen möchtest + Du wirst gefragt, wo jeder Download gespeichert werden soll.\nAktiviere die Systemordnerauswahl (SAF), wenn du auf eine externe SD-Karte herunterladen möchtest Systemordnerauswahl verwenden (SAF) Das „Storage Access Framework“ ermöglicht das Herunterladen auf eine externe SD-Karte Wiedergabepositionen löschen Alle Wiedergabepositionen löschen - Alle Wiedergabepositionen löschen\? + Alle Wiedergabepositionen löschen? Dienst umschalten, aktuell ausgewählt: Standard-Kiosk Niemand schaut zu @@ -475,13 +458,13 @@ %d ausgewählte Leerer Gruppenname - Möchtest du diese Gruppe löschen\? + Möchtest du diese Gruppe löschen? Neu Immer aktualisieren Kanalgruppen Nicht geladen: %d - Lade Feed … - Verarbeite Feed … + Lade Feed … + Verarbeite Feed … Feed Abonnements auswählen Kein Abonnement ausgewählt @@ -491,29 +474,15 @@ Feed zuletzt aktualisiert: %s Grenzwert für Feed-Aktualisierung Aus fest zugeordnetem Feed abrufen wenn verfügbar - Steht in manchen Diensten zur Verfügung, ist meist viel schneller, liefert aber eventuell eine eingeschränkte Anzahl an Elementen und oft unvollständige Informationen (z. B. keine Videolänge, keinen Elementtyp, keinen Live-Status) - Glaubst du, dass das Laden von Feeds zu langsam ist? Wenn ja, versuche den Schnelllademodus einzuschalten (du kannst ihn in den Einstellungen oder über die Schaltfläche unten ändern). -\n -\nNewPipe bietet zwei Feed-Ladestrategien: -\n• das Abrufen des gesamten abonnierten Kanals, was langsam aber vollständig geschieht. -\n• das Verwenden eines fest zugeordneten Serviceendpunkts, was schnell aber für gewöhnlich unvollständig ist. -\n -\nDer Unterschied zwischen den beiden ist, dass der schnellen normalerweise einige Informationen fehlen, wie die Dauer oder der Typ des Elements (keine Unterscheidung zwischen Live-Videos und normalen) und sie eventuell weniger Elemente liefert. -\n -\nYouTube ist ein Beispiel für einen Service, der mit seinem RSS-Feed diese schnelle Methode anbietet. -\n -\nDie Entscheidung läuft also darauf hinaus, was dir lieber ist: Tempo oder genaue Informationen. + Steht in manchen Diensten zur Verfügung, ist meist viel schneller, liefert aber eventuell eine eingeschränkte Anzahl an Elementen und oft unvollständige Informationen (z. B. keine Videolänge, keinen Elementtyp, keinen Live-Status) + Glaubst du, dass das Laden von Feeds zu langsam ist? Wenn ja, versuche den Schnelllademodus einzuschalten (du kannst ihn in den Einstellungen oder über die Schaltfläche unten ändern). \n \nNewPipe bietet zwei Feed-Ladestrategien: \n• das Abrufen des gesamten abonnierten Kanals, was langsam aber vollständig geschieht. \n• das Verwenden eines fest zugeordneten Serviceendpunkts, was schnell aber für gewöhnlich unvollständig ist. \n \nDer Unterschied zwischen den beiden ist, dass der schnellen normalerweise einige Informationen fehlen, wie die Dauer oder der Typ des Elements (keine Unterscheidung zwischen Live-Videos und normalen) und sie eventuell weniger Elemente liefert. \n \nYouTube ist ein Beispiel für einen Service, der mit seinem RSS-Feed diese schnelle Methode anbietet. \n \nDie Entscheidung läuft also darauf hinaus, was dir lieber ist: Tempo oder genaue Informationen. ∞ Videos 100+ Videos Künstler Alben Lieder - Dieser Inhalt wird von NewPipe noch nicht unterstützt. -\n -\nEr wird hoffentlich in einer zukünftigen Version unterstützt. - Dieses Video ist altersbeschränkt. -\n -\nAktiviere in den Einstellungen „%1$s“, falls du diese sehen möchtest. + Dieser Inhalt wird von NewPipe noch nicht unterstützt. \n \nEr wird hoffentlich in einer zukünftigen Version unterstützt. + Dieses Video ist altersbeschränkt. \n \nAktiviere in den Einstellungen „%1$s“, falls du diese sehen möchtest. Streams, die vor und nach dem Hinzufügen zur Wiedergabeliste angeschaut wurden, werden entfernt. \nBist du sicher? Teilweise angesehene Streams entfernen Gesehene entfernen @@ -535,7 +504,7 @@ Nie Du kannst maximal drei Aktionen auswählen, die in der Kompaktbenachrichtigung angezeigt werden sollen! Bearbeite jede Benachrichtigungsaktion unten, indem du auf sie tippst. Wähle mithilfe der Kontrollkästchen rechts bis zu drei aus, die in der Kompaktbenachrichtigung angezeigt werden sollen. - Konnte die angegebene URL nicht erkennen. Mit einer anderen Anwendung öffnen\? + Konnte die angegebene URL nicht erkennen. Mit einer anderen Anwendung öffnen? Fünfte Aktionstaste Vierte Aktionstaste Dritte Aktionstaste @@ -584,8 +553,7 @@ Dies ist ein SoundCloud Go+ Track, zumindest in deinem Land, kann er von NewPipe nicht gestreamt oder heruntergeladen werden. Dieser Inhalt ist in deinem Land nicht verfügbar. App abstürzen lassen - Dieses Video ist altersbeschränkt. -\nAufgrund neuer YouTube-Richtlinien mit altersbeschränkten Videos kann NewPipe auf keinen dieser Videostreams zugreifen und ist daher nicht in der Lage, es abzuspielen. + Dieses Video ist altersbeschränkt. \nAufgrund neuer YouTube-Richtlinien mit altersbeschränkten Videos kann NewPipe auf keinen dieser Videostreams zugreifen und ist daher nicht in der Lage, es abzuspielen. Radio Vorgestellt Lösen @@ -613,15 +581,13 @@ Auswählen von Text in der Beschreibung deaktivieren Auswählen von Text in der Beschreibung aktivieren Du kannst nun Text innerhalb der Beschreibung auswählen. Beachte, dass die Seite flackern kann und Links im Auswahlmodus möglicherweise nicht anklickbar sind. - Das Konto des Autors wurde geschlossen. -\nNewPipe wird diesen Feed in Zukunft nicht mehr laden können. -\nMöchtest du dich von diesem Kanal abmelden\? + Das Konto des Autors wurde geschlossen. \nNewPipe wird diesen Feed in Zukunft nicht mehr laden können. \nMöchtest du dich von diesem Kanal abmelden? Konto geschlossen Der Schnellmodus liefert hierzu keine weiteren Informationen. Noch kein Downloadordner festgelegt, wähle jetzt den Standard-Downloadordner Website öffnen Ab Android 10 wird nur noch „Storage Access Framework“ unterstützt - Du wirst jedes Mal gefragt werden, wohin der Download gespeichert werden soll + Du wirst gefragt, wo jeder Download gespeichert werden soll Fehler beim Laden des Feeds Konnte Feed für \'%s\' nicht laden. An @@ -644,9 +610,9 @@ Hauptplayer im Vollbildmodus starten Als Nächstes eingereiht Als Nächstes in Wiedergabe einreihen - Verarbeite … Kann einen Moment dauern + Verarbeite … Kann einen Moment dauern Nach Aktualisierungen suchen - Suche nach Aktualisierungen … + Suche nach Aktualisierungen … Manuelle Prüfung auf neue Versionen Neue Feed-Elemente „Player abstürzen lassen“ anzeigen @@ -658,10 +624,8 @@ Ein Fehler ist aufgetreten, siehe die Benachrichtigung Eine Fehlermeldung erstellen Fehler-Kurzmeldung anzeigen - Es wurde kein geeigneter Dateimanager für diese Aktion gefunden. -\nBitte installiere einen Dateimanager oder versuche, \'%s\' in den Downloadeinstellungen zu deaktivieren - Es wurde kein geeigneter Dateimanager für diese Aktion gefunden. -\nBitte installiere einen Storage Access Framework kompatiblen Dateimanager + Für diese Aktion wurde kein geeigneter Dateimanager gefunden.\nBitte installiere einen Dateimanager oder versuche, \'%s\' in den Downloadeinstellungen zu deaktivieren + Für diese Aktion wurde kein geeigneter Dateimanager gefunden.\nBitte installiere einen Storage Access Framework kompatiblen Dateimanager Angehefteter Kommentar LeakCanary ist nicht verfügbar ExoPlayer-Standard @@ -672,7 +636,7 @@ %s neuer Stream %s neue Streams - Lade Stream-Details … + Lade Stream-Details … Über neue Streams aus Abonnements benachrichtigen , Jedes Netzwerk @@ -681,7 +645,7 @@ Erforderliche Netzwerkverbindung Benachrichtigungen sind deaktiviert Benachrichtigung erhalten - Alle heruntergeladenen Dateien von der Festplatte löschen\? + Alle heruntergeladenen Dateien von der Festplatte löschen? Du hast jetzt diesen Kanal abonniert Alle umschalten Prüfintervall @@ -709,11 +673,11 @@ Karte Duplikat %d mal hinzugefügt Die ausgegrauten Wiedergabelisten enthalten dieses Element bereits. - Nützlich, wenn z. B. ein Headset mit defekten physischen Tasten verwendet wird + Nützlich, wenn z. B. ein Headset mit defekten physischen Tasten verwendet wird Ereignisse der Hardware-Medientasten ignorieren Duplikate entfernen - Duplikate entfernen\? - Möchtest du alle doppelten Streams in dieser Wiedergabeliste entfernen\? + Duplikate entfernen? + Möchtest du alle doppelten Streams in dieser Wiedergabeliste entfernen? Streams anzeigen/ausblenden Folgende Streams anzeigen Demnächst @@ -736,9 +700,7 @@ Einige ExoPlayer-Einstellungen steuern. Diese Änderungen erfordern einen Neustart des Players, um wirksam zu werden Die Decoder-Fallback-Funktion von ExoPlayer verwenden Immer die ExoPlayer-Einstellung für die Videoausgangsoberfläche als Umgehung verwenden - Dieser Workaround gibt die Video-Codecs frei und instanziiert sie neu, wenn sich die Oberfläche ändert, anstatt die Oberfläche direkt auf den Codec zu setzen. Diese Einstellung wird bereits von ExoPlayer auf einigen Geräten mit diesem Problem verwendet und hat nur Auswirkungen auf Android 6 und höher -\n -\nDas Aktivieren dieser Option kann Wiedergabefehler beim Wechsel des aktuellen Videoplayers oder beim Wechsel zum Vollbildmodus verhindern + Dieser Workaround gibt die Video-Codecs frei und instanziiert sie neu, wenn sich die Oberfläche ändert, anstatt die Oberfläche direkt auf den Codec zu setzen. Diese Einstellung wird bereits von ExoPlayer auf einigen Geräten mit diesem Problem verwendet und hat nur Auswirkungen auf Android 6 und höher \n \nDas Aktivieren dieser Option kann Wiedergabefehler beim Wechsel des aktuellen Videoplayers oder beim Wechsel zum Vollbildmodus verhindern Original Synchronisiert Beschreibend @@ -761,7 +723,7 @@ Alben Tabs auf den Kanalseiten Welche Tabs auf den Kanalseiten angezeigt werden - Lade Metadaten … + Lade Metadaten … Über Tabs der Kanalseiten abrufen Tabs, die beim Aktualisieren des Feeds abgerufen werden. Diese Option hat keine Auswirkungen, wenn ein Kanal im Schnellmodus aktualisiert wird. @@ -791,8 +753,7 @@ Wähle die Bildqualität und ob überhaupt Bilder geladen werden sollen, um die Daten- und Speichernutzung zu reduzieren. Änderungen löschen sowohl den Bilder-Cache im Speicher als auch auf der Festplatte — %s URL-Liste teilen Mit Titeln teilen - %1$s -\n%2$s + %1$s \n%2$s Wiedergabeliste teilen - %1$s: %2$s @@ -808,11 +769,8 @@ Ja Nein Sichern und Wiederherstellen - NewPipe kann von Zeit zu Zeit automatisch nach neuen Versionen suchen und dich benachrichtigen, sobald sie verfügbar sind. -\nMöchtest du dies aktivieren? - Wenn du alle Einstellungen zurücksetzt, werden alle deine bevorzugten Einstellungen verworfen und die App wird neu gestartet. -\n -\nMöchtest du wirklich fortfahren? + NewPipe kann von Zeit zu Zeit automatisch nach neuen Versionen suchen und dich benachrichtigen, sobald sie verfügbar sind. \nMöchtest du dies aktivieren? + Wenn du alle Einstellungen zurücksetzt, werden alle deine bevorzugten Einstellungen verworfen und die App wird neu gestartet. \n \nMöchtest du wirklich fortfahren? Die Einstellungen in dem zu importierenden Export verwenden ein angreifbares Format, das seit NewPipe 0.27.0 veraltet ist. Stellen Sie sicher, dass der zu importierende Export aus einer vertrauenswürdigen Quelle stammt, und verwenden Sie in Zukunft nur noch Exporte, die aus NewPipe 0.27.0 oder neuer stammen. Die Unterstützung für den Import von Einstellungen in diesem angreifbaren Format wird bald vollständig entfernt werden, und dann werden alte Versionen von NewPipe nicht mehr in der Lage sein, Einstellungen von Exporten aus neuen Versionen zu importieren. Sekundär Als temporäre YouTube-Wiedergabeliste teilen @@ -843,22 +801,22 @@ HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch Ablauf der Streaming-URL oder eine IP-Sperre HTTP-Fehler %1$s vom Server während der Wiedergabe erhalten HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch eine IP-Sperre oder Probleme beim Entschlüsseln der Streaming-URL - %1$s hat die Datenbereitstellung verweigert und verlangt eine Anmeldung, um zu bestätigen, dass es sich bei dem Anfragenden nicht um einen Bot handelt.\n\nDeine IP-Adresse wurde möglicherweise vorübergehend von %1$s gesperrt. Du kannst einige Zeit warten oder zu einer anderen IP-Adresse wechseln (z. B. durch Ein- und Ausschalten eines VPNs oder durch Wechseln von WLAN zu mobilen Daten).\n\nWeitere Informationen findest du unter diesem FAQ-Eintrag. + %1$s hat die Datenbereitstellung verweigert und verlangt eine Anmeldung, um zu bestätigen, dass es sich bei dem Anfragenden nicht um einen Bot handelt.\n\nDeine IP-Adresse wurde möglicherweise vorübergehend von %1$s gesperrt. Du kannst einige Zeit warten oder zu einer anderen IP-Adresse wechseln (z. B. durch Ein- und Ausschalten eines VPNs oder durch Wechseln von WLAN zu mobilen Daten).\n\nWeitere Informationen findest du unter diesem FAQ-Eintrag. Dieser Inhalt ist für das aktuell ausgewählte Land des Inhalts nicht verfügbar.\n\nÄndere die Auswahl unter „Einstellungen > Inhalt > Bevorzugtes Land des Inhalts“. Im August 2025 gab Google bekannt, dass ab September 2026 für die Installation von Apps eine Entwicklerüberprüfung für alle Android-Apps auf zertifizierten Geräten erforderlich sein wird, einschließlich derjenigen, die außerhalb des Play Store installiert wurden. Da die Entwickler von NewPipe dieser Forderung nicht nachkommen, wird NewPipe nach diesem Zeitpunkt auf zertifizierten Android-Geräten nicht mehr funktionieren. Details Lösung - %d Abonnement wird exportiert … - %d Abonnements werden exportiert … + %d Abonnement wird exportiert … + %d Abonnements werden exportiert … - %d Abonnement wird geladen … - %d Abonnements werden geladen … + %d Abonnement wird geladen … + %d Abonnements werden geladen … - %d Abonnement wird importiert … - %d Abonnements werden importiert … + %d Abonnement wird importiert … + %d Abonnements werden importiert … Abonnements importieren Abonnements exportieren diff --git a/app/src/main/res/values-dum/strings.xml b/app/src/main/res/values-dum/strings.xml index f992392cc..51df8aedf 100644 --- a/app/src/main/res/values-dum/strings.xml +++ b/app/src/main/res/values-dum/strings.xml @@ -1,7 +1,7 @@ Gepubliceerd op %1$s - Geen stream player gevonden. Installeer VLC\? + Geen stream player gevonden. Installeer VLC? Geen stream player gevonden (je kunt VLC installeren om het af te spelen). Installeer Annuleren @@ -15,7 +15,7 @@ Abonneren Geabonneerd Deabonneren - Bedoel je \"%1$s\"\? + Bedoel je \"%1$s\"? Kon abonnement niet bijwerken Toon informatie Abonnementen @@ -30,4 +30,4 @@ Gebruik een externe video player Kanaal gedeabonneerd Kon abonnement niet aanpassen - \ No newline at end of file + diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 4b218525b..8f6dbc614 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -195,8 +195,7 @@ Παρακαλώ περιμένετε… Αντιγράφηκε στο πρόχειρο Παρακαλώ ορίστε έναν φάκελο λήψεων αργότερα στις ρυθμίσεις - Αυτή η άδεια είναι απαραίτητη για -\nτο άνοιγμα αναδυόμενων παραθύρων + Αυτή η άδεια είναι απαραίτητη για \nτο άνοιγμα αναδυόμενων παραθύρων 1 αντικείμενο διαγράφηκε. Δοκιμασία reCAPTCHA Ζητήθηκε δοκιμασία reCAPTCHA @@ -218,8 +217,7 @@ Ιστοτόπος Επισκευτείτε τον ιστότοπο του NewPipe για περισσότερες πληροφορίες και νέα. Πολιτική ιδιωτικού απόρρητου του NewPipe - Το NewPipe παίρνει πολύ σοβαρά την ιδιωτικότητα σας. Έτσι, η εφαρμογή αυτή δεν συλλέγει δεδομένα από εσάς χωρίς τη συγκατάθεσή σας. -\nΗ πολιτική ιδιωτικού απόρρητου του NewPipe εξηγεί λεπτομερώς ποια δεδομένα αποστέλλονται και αποθηκεύονται όταν επιλέγετε να στείλετε μια αναφορά σφαλμάτων. + Το NewPipe παίρνει πολύ σοβαρά την ιδιωτικότητα σας. Έτσι, η εφαρμογή αυτή δεν συλλέγει δεδομένα από εσάς χωρίς τη συγκατάθεσή σας. \nΗ πολιτική ιδιωτικού απόρρητου του NewPipe εξηγεί λεπτομερώς ποια δεδομένα αποστέλλονται και αποθηκεύονται όταν επιλέγετε να στείλετε μια αναφορά σφαλμάτων. Ανάγνωση της πολιτικής ιδιωτικού απόρρητου Η άδεια του NewPipe Το NewPipe είναι copylelft ελεύθερο λογισμικό: Μπορείτε να το χρησιμοποιήσετε, να το μελετήσετε, να το μοιραστείτε και να το βελτιώσετε κατά βούληση. Ειδικότερα, μπορείτε να το αναδιανείμετε ή/και να το τροποποιήσετε υπό την άδεια GNU General Public Licence όπως αυτή εκδόθηκε από το Free Software Foundation, είτε υπό την έκδοση 3 της άδειας, είτε (προαιρετικά) υπό οποιαδήποτε μεταγενέστερη άδεια. @@ -287,24 +285,9 @@ Προηγούμενη εξαγωγή Δεν ήταν δυνατή η εισαγωγή των εγγραφών Δεν ήταν δυνατή η εξαγωγή των εγγραφών - Κάντε εισαγωγή των εγγραφών σας στο YouTube από το Google takeout: -\n -\n1. Πλοηγηθείτε στο: %1$s -\n2. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί. -\n3. Πατήστε το «Περιλαμβάνονται όλα τα δεδομένα του YouTube», στη συνέχεια «Κατάργηση επιλογής όλων» και επιλέξτε μόνο το «συνδρομές» και «ΟΚ». -\n4. Πατήστε «Επόμενο βήμα» και μετά «Δημιουργία εξαγωγής». -\n5. Πατήστε «Λήψη» όταν εμφανιστεί. -\n6. Πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο zip. -\n7. Αν η εισαγωγή από το zip αποτύχει, εξάγετε το αρχείο .csv (συνήθως βρίσκεται στο \"YouTube και YouTube Music/subscriptions/subscriptions.csv\"), πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο csv - Για να εισάγετε τον λογαριασμό SoundCloud σας, πληκτρολογήστε τον σύνδεσμο ή το ID σας: -\n -\n1. Ενεργοποιήστε τη λειτουργία «Desktop mode» στον φυλλομετρητή σας (καθώς η ιστοσελίδα δεν είναι διαθέσιμη για κινητά) -\n2. Πλοηθηθείτε στο %1$s -\n3. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί -\n4. Αντιγράψτε τον σύνδεσμο του λογαριασμού στον οποίο ανακατευθυνθήκατε. - Αυτή η διαδικασία μπορεί να χρησιμοποιήσει μεγάλο όγκο δεδομένων. -\n -\nΕπιθυμείτε να συνεχίσετε; + Κάντε εισαγωγή των εγγραφών σας στο YouTube από το Google takeout: \n \n1. Πλοηγηθείτε στο: %1$s \n2. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί. \n3. Πατήστε το «Περιλαμβάνονται όλα τα δεδομένα του YouTube», στη συνέχεια «Κατάργηση επιλογής όλων» και επιλέξτε μόνο το «συνδρομές» και «ΟΚ». \n4. Πατήστε «Επόμενο βήμα» και μετά «Δημιουργία εξαγωγής». \n5. Πατήστε «Λήψη» όταν εμφανιστεί. \n6. Πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο zip. \n7. Αν η εισαγωγή από το zip αποτύχει, εξάγετε το αρχείο .csv (συνήθως βρίσκεται στο \"YouTube και YouTube Music/subscriptions/subscriptions.csv\"), πατήστε το ΕΙΣΑΓΩΓΗ ΑΡΧΕΙΟΥ και επιλέξτε το ληφθέν αρχείο csv + Για να εισάγετε τον λογαριασμό SoundCloud σας, πληκτρολογήστε τον σύνδεσμο ή το ID σας: \n \n1. Ενεργοποιήστε τη λειτουργία «Desktop mode» στον φυλλομετρητή σας (καθώς η ιστοσελίδα δεν είναι διαθέσιμη για κινητά) \n2. Πλοηθηθείτε στο %1$s \n3. Εισέλθετε στο λογαριασμό σας, όταν σας ζητηθεί \n4. Αντιγράψτε τον σύνδεσμο του λογαριασμού στον οποίο ανακατευθυνθήκατε. + Αυτή η διαδικασία μπορεί να χρησιμοποιήσει μεγάλο όγκο δεδομένων. \n \nΕπιθυμείτε να συνεχίσετε; Έλεγχος ταχύτητας αναπαραγωγής Τέμπο Τόνος @@ -316,8 +299,7 @@ Γρήγορη αναπαραγωγή κατά τη διάρκεια της σίγασης Βήμα Επαναφορά - Προς συμμόρφωση με τον Ευρωπαϊκό Γενικό Κανονισμό για την Προστασία Δεδομένων (GDPR), σας εφιστούμε την προσοχή στην πολιτική προστασίας προσωπικών δεδομένων του NewPipe. Παραλούμε, διαβάστε την προσεκτικά. -\nΘα πρέπει να την αποδεχτείτε προκειμένου να μας αποστείλετε την αναφορά σφάλματος. + Προς συμμόρφωση με τον Ευρωπαϊκό Γενικό Κανονισμό για την Προστασία Δεδομένων (GDPR), σας εφιστούμε την προσοχή στην πολιτική προστασίας προσωπικών δεδομένων του NewPipe. Παραλούμε, διαβάστε την προσεκτικά. \nΘα πρέπει να την αποδεχτείτε προκειμένου να μας αποστείλετε την αναφορά σφάλματος. Αποδοχή Απόρριψη Χωρίς όριο @@ -401,8 +383,7 @@ Έναρξη λήψεων Παύση λήψεων Ερώτηση πού να γίνει η λήψη - Θα ερωτηθείτε πού να αποθηκεύσετε κάθε λήψη. -\nΕνεργοποιήστε τον επιλογέα φακέλων συστήματος (SAF), αν θέλετε να κάνετε λήψεις σε εξωτερική κάρτα μνήμης + Θα ερωτηθείτε πού να αποθηκεύσετε κάθε λήψη. \nΕνεργοποιήστε τον επιλογέα φακέλων συστήματος (SAF), αν θέλετε να κάνετε λήψεις σε εξωτερική κάρτα μνήμης Χρήση επιλογέα φακέλων συστήματος (SAF) Το «Πλαίσιο Πρόσβασης Αποθήκευσης» (SAF) επιτρέπει λήψεις σε μια εξωτερική κάρτα SD Διαγραφή θέσεων αναπαραγωγής @@ -432,9 +413,7 @@ Εμφάνιση αποτελεσμάτων για: %s Ενεργοποίηση γρήγορης λειτουργίας Απενεργοποίηση γρήγορης λειτουργίας - Αυτό το περιεχόμενο δεν υποστηρίζεται ακόμη από το NewPipe. -\n -\nΕλπίζουμε ότι θα υποστηριχθεί σε μια μελλοντική έκδοση. + Αυτό το περιεχόμενο δεν υποστηρίζεται ακόμη από το NewPipe. \n \nΕλπίζουμε ότι θα υποστηριχθεί σε μια μελλοντική έκδοση. Μικρογραφία avatar του καναλιού Δημιουργήθηκε από %s Σελίδα λίστας αναπαραγωγής @@ -465,9 +444,7 @@ Καλλιτέχνες Άλμπουμ Τραγούδια - Αυτό το βίντεο έχει περιορισμό ηλικίας. -\n -\nΕνεργοποιήστε το «%1$s» στις ρυθμίσεις εάν θέλετε να το δείτε. + Αυτό το βίντεο έχει περιορισμό ηλικίας. \n \nΕνεργοποιήστε το «%1$s» στις ρυθμίσεις εάν θέλετε να το δείτε. Ενεργοποίηση \"Περιορισμένη Λειτουργία\" του YouTube Δεν ήταν δυνατή η αναγνώριση της διεύθυνσης URL. Άνοιγμα με άλλη εφαρμογή; Αυτόματη προσθήκη στην ουρά @@ -487,17 +464,7 @@ Περικοπή της μικρογραφίας βίντεο που εμφανίζεται στην ειδοποίηση από 16:9 σε αναλογία διαστάσεων 1:1 Περικοπή μικρογραφίας σε αναλογία διαστάσεων 1:1 Φόρτωση - Πιστεύετε ότι η ροή φορτώνει πολύ αργά; Δοκιμάστε να ενεργοποιήσετε τη γρήγορη φόρτωση (από τις ρυθμίσεις ή πατώντας το παρακάτω κουμπί). -\n -\nΤο NewPipe προσφέρει δύο στρατηγικές φόρτωσης ροής: -\n- Λήψη ολόκληρου του καναλιού συνδρομής, το οποίο είναι αργό αλλά πλήρες. -\n- Χρήση ενός αποκλειστικού τελικού σημείου υπηρεσίας, το οποίο είναι γρήγορο αλλά συνήθως δεν είναι πλήρες. -\n -\nΗ διαφορά μεταξύ των δύο είναι ότι η γρήγορη συνήθως στερείται κάποιες πληροφορίες, όπως η διάρκεια ή ο τύπος του στοιχείου (δεν μπορεί να διακρίνει μεταξύ ζωντανών βίντεο και κανονικών) και μπορεί να επιστρέψει λιγότερα στοιχεία. -\n -\nΤο YouTube είναι ένα παράδειγμα υπηρεσίας της γρήγορης μεθόδου με τη ροή RSS. -\n -\nΣυνεπώς επιλέγετε ανάλογα: ταχύτητα ή ακριβείς πληροφορίες. + Πιστεύετε ότι η ροή φορτώνει πολύ αργά; Δοκιμάστε να ενεργοποιήσετε τη γρήγορη φόρτωση (από τις ρυθμίσεις ή πατώντας το παρακάτω κουμπί). \n \nΤο NewPipe προσφέρει δύο στρατηγικές φόρτωσης ροής: \n- Λήψη ολόκληρου του καναλιού συνδρομής, το οποίο είναι αργό αλλά πλήρες. \n- Χρήση ενός αποκλειστικού τελικού σημείου υπηρεσίας, το οποίο είναι γρήγορο αλλά συνήθως δεν είναι πλήρες. \n \nΗ διαφορά μεταξύ των δύο είναι ότι η γρήγορη συνήθως στερείται κάποιες πληροφορίες, όπως η διάρκεια ή ο τύπος του στοιχείου (δεν μπορεί να διακρίνει μεταξύ ζωντανών βίντεο και κανονικών) και μπορεί να επιστρέψει λιγότερα στοιχεία. \n \nΤο YouTube είναι ένα παράδειγμα υπηρεσίας της γρήγορης μεθόδου με τη ροή RSS. \n \nΣυνεπώς επιλέγετε ανάλογα: ταχύτητα ή ακριβείς πληροφορίες. Η ροή ανανεώθηκε: %s Φόρτωση ροής… Επεξεργασία ροής… @@ -579,8 +546,7 @@ Αυτό το περιεχόμενο είναι ιδιωτικό και δεν μπορεί να αναπαραχθεί ή να το κατεβάσετε με το NewPipe. Αυτό είναι ένα κομμάτι SoundCloud Go+, τουλάχιστον στη χώρα σας. Έτσι δεν μπορεί να αναπαραχθεί ή να το κατεβάσετε με το NewPipe. Αυτό το περιεχόμενο δεν είναι διαθέσιμο στη χώρα σας. - Αυτό το βίντεο έχει περιορισμό ηλικίας. -\nΛόγω της νέας πολιτικής του YouTube για αυτά τα βίντεο, το NewPipe δεν μπορεί να το αναπαράγει. + Αυτό το βίντεο έχει περιορισμό ηλικίας. \nΛόγω της νέας πολιτικής του YouTube για αυτά τα βίντεο, το NewPipe δεν μπορεί να το αναπαράγει. Επιλεγμένα Ράδιο Λύση @@ -609,9 +575,7 @@ Ανοικτή ιστοσελίδα Ο λογαριασμός διαγράφηκε Η κατάσταση γρήγορης τροφοδοσίας δεν παρέχει περισσότερες πληροφορίες. - Ο λογαριασμός του δημιουργού έχει διαγραφεί. -\nΤο NewPipe δε θα μπορεί να φορτώσει αυτή την τροφοδοσία στο μέλλον. -\nΘέλετε να απεγγραφείτε από αυτό το κανάλι; + Ο λογαριασμός του δημιουργού έχει διαγραφεί. \nΤο NewPipe δε θα μπορεί να φορτώσει αυτή την τροφοδοσία στο μέλλον. \nΘέλετε να απεγγραφείτε από αυτό το κανάλι; Αδυναμία φόρτωσης τροφοδοσίας για \'%s\'. Σφάλμα φόρτωσης τροφοδοσίας Από το Android 10 και μετά, μόνο το Πλαίσιο Πρόσβασης Αποθήκευσης υποστηρίζεται @@ -655,10 +619,8 @@ Ειδοποιήσεις για την αναφορά σφαλμάτων Συνέβη ένα σφάλμα. Δείτε την ειδοποίηση Δημιουργία ειδοποίησης σφάλματος - Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια. -\nΕγκαταστήστε έναν ή δοκιμάστε να απενεργοποιήσετε το \'%s\' στις ρυθμίσεις λήψεων - Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια. -\nΕγκαταστήστε έναν συμβατό με το Πλαίσιο Πρόσβασης Αποθήκευσης + Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια. \nΕγκαταστήστε έναν ή δοκιμάστε να απενεργοποιήσετε το \'%s\' στις ρυθμίσεις λήψεων + Δε βρέθηκε κατάλληλος διαχειριστής αρχείων για αυτή την ενέργεια. \nΕγκαταστήστε έναν συμβατό με το Πλαίσιο Πρόσβασης Αποθήκευσης Το NewPipe παρουσίασε ένα σφάλμα. Πατήστε για αναφορά Εμφάνιση μιας snackbar σφάλματος Καρφιτσωμένο σχόλιο @@ -740,9 +702,7 @@ Χρησιμοποιήστε την δυνατότητα εναλλακτικού αποκωδικοποιητή του ExoPlayer Ενεργοποιήστε αυτήν την επιλογή εάν αντιμετωπίζετε προβλήματα με την προετοιμασία του αποκωδικοποιητή, η οποία επιστρέφει σε αποκωδικοποιητές χαμηλότερης προτεραιότητας εάν αποτύχει η προετοιμασία του πρωτεύοντος αποκωδικοποιητή. Αυτό μπορεί να έχει ως αποτέλεσμα κακή απόδοση αναπαραγωγής από ότι όταν χρησιμοποιείτε κύριους αποκωδικοποιητές Χρησιμοποιείτε πάντα τον εναλλακτικό τρόπο ρύθμισης της επιφάνειας εξόδου βίντεο του ExoPlayer - Αυτή η λύση απελευθερώνει και επαναφέρει τους κωδικοποιητές βίντεο όταν συμβαίνει μια αλλαγή επιφάνειας, αντί να ρυθμίζει την επιφάνεια απευθείας στον κωδικοποιητή. Χρησιμοποιείται ήδη από το ExoPlayer σε ορισμένες συσκευές με αυτό το πρόβλημα, αυτή η ρύθμιση έχει επίδραση μόνο σε Android 6 και νεότερη έκδοση. -\n -\nΗ ενεργοποίηση αυτής της επιλογής μπορεί να αποτρέψει σφάλματα αναπαραγωγής κατά την εναλλαγή του τρέχοντος προγράμματος αναπαραγωγής βίντεο ή τη μετάβαση σε πλήρη οθόνη + Αυτή η λύση απελευθερώνει και επαναφέρει τους κωδικοποιητές βίντεο όταν συμβαίνει μια αλλαγή επιφάνειας, αντί να ρυθμίζει την επιφάνεια απευθείας στον κωδικοποιητή. Χρησιμοποιείται ήδη από το ExoPlayer σε ορισμένες συσκευές με αυτό το πρόβλημα, αυτή η ρύθμιση έχει επίδραση μόνο σε Android 6 και νεότερη έκδοση. \n \nΗ ενεργοποίηση αυτής της επιλογής μπορεί να αποτρέψει σφάλματα αναπαραγωγής κατά την εναλλαγή του τρέχοντος προγράμματος αναπαραγωγής βίντεο ή τη μετάβαση σε πλήρη οθόνη %1$s %2$s αρχικό μεταγλωττισμένο @@ -793,8 +753,7 @@ Ταμπέλες Κοινοποίηση λίστας URL Κοινοποίηση με τίτλους - %1$s -\n%2$s + %1$s \n%2$s Κοινοποίηση λίστας - %1$s: %2$s @@ -808,13 +767,10 @@ Όχι Ναι Αντίγραφο ασφαλείας και επαναφορά - Το NewPipe μπορεί να ελέγχει αυτόματα για νέες εκδόσεις και να σας ειδοποιεί μόλις είναι διαθέσιμες. -\nΘέλετε να το ενεργοποιήσετε; + Το NewPipe μπορεί να ελέγχει αυτόματα για νέες εκδόσεις και να σας ειδοποιεί μόλις είναι διαθέσιμες. \nΘέλετε να το ενεργοποιήσετε; Επαναφορά ρυθμίσεων Επαναφορά όλων των ρυθμίσεων στις αρχικές τιμές τους - Η επαναφορά όλων των ρυθμίσεων θα απορρίψει όλες τις τροποποιημένες ρυθμίσεις σας και θα επανεκκινήσει την εφαρμογή. -\n -\nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε; + Η επαναφορά όλων των ρυθμίσεων θα απορρίψει όλες τις τροποποιημένες ρυθμίσεις σας και θα επανεκκινήσει την εφαρμογή. \n \nΕίστε βέβαιοι ότι θέλετε να συνεχίσετε; Οι ρυθμίσεις στην εξαγωγή που εισάγεται χρησιμοποιούν μια ευάλωτη μορφή που είχε καταργηθεί από το NewPipe 0.27.0. Βεβαιωθείτε ότι η εξαγωγή που εισάγεται προέρχεται από αξιόπιστη πηγή και προτιμήστε να χρησιμοποιείτε μόνο εξαγωγές που λαμβάνονται από το NewPipe 0.27.0 ή νεότερο στο μέλλον. Η υποστήριξη για εισαγωγή ρυθμίσεων σε αυτήν την ευάλωτη μορφή θα καταργηθεί σύντομα εντελώς και, στη συνέχεια, οι παλιές εκδόσεις του NewPipe δεν θα μπορούν πλέον να εισάγουν ρυθμίσεις εξαγωγών από νέες εκδόσεις. δευτερεύων Λίστες αναπαραγωγής diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 30e9a3927..494e2e75a 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -4,38 +4,23 @@ Display an option to play a video via Kodi media centre Have Android customise the notification’s colour according to the main colour in the thumbnail (note that this is not available on all devices) Colourise notification - Import a SoundCloud profile by typing either the URL or your ID: -\n -\n1. Enable ‘desktop mode’ in a web browser (the site is not available for mobile devices) -\n2. Go to this URL: %1$s -\n3. Log in when asked -\n4. Copy the profile URL you were redirected to. - Import YouTube subscriptions from Google takeout: -\n -\n1. Go to this URL: %1$s -\n2. Log in when asked -\n3. Click on ‘All data included’, then on ‘Deselect all’, then select only ‘subscriptions’ and click ‘OK’ -\n4. Click on ‘Next step’ and then on ‘Create export’ -\n5. Click on the ‘Download’ button after it appears -\n6. Click on IMPORT FILE below and select the downloaded .zip file -\n7. [If the .zip import fails] Extract the .csv file (usually under ‘YouTube and YouTube Music/subscriptions/subscriptions.csv’), click on IMPORT FILE below and select the extracted csv file + Import a SoundCloud profile by typing either the URL or your ID: \n \n1. Enable ‘desktop mode’ in a web browser (the site is not available for mobile devices) \n2. Go to this URL: %1$s \n3. Log in when asked \n4. Copy the profile URL you were redirected to. + Import YouTube subscriptions from Google takeout: \n \n1. Go to this URL: %1$s \n2. Log in when asked \n3. Click on ‘All data included’, then on ‘Deselect all’, then select only ‘subscriptions’ and click ‘OK’ \n4. Click on ‘Next step’ and then on ‘Create export’ \n5. Click on the ‘Download’ button after it appears \n6. Click on IMPORT FILE below and select the downloaded .zip file \n7. [If the .zip import fails] Extract the .csv file (usually under ‘YouTube and YouTube Music/subscriptions/subscriptions.csv’), click on IMPORT FILE below and select the extracted csv file Press ‘Done’ when solved - This video is age restricted. -\n -\nTurn on ‘%1$s’ in the settings if you want to see it. + This video is age restricted. \n \nTurn on ‘%1$s’ in the settings if you want to see it. YouTube provides a ‘Restricted Mode’ which hides potentially mature content Turn on YouTube’s ‘Restricted Mode’ Show tip when pressing the background or the pop-up button in video ‘Details:’ Show ‘Hold to append’ tip Show ‘Play with Kodi’ option - Did you mean ‘%1$s’\? + Did you mean ‘%1$s’? Tap the magnifying glass to get started. Channel’s avatar thumbnail Time after last update before a subscription is considered outdated – %s Start playback automatically – %s Action when switching to other app from main video player – %s Default action when opening content – %s - Whether you have ideas of; translation, design changes, code cleaning, or real heavy code changes – help is always welcome. The more is done, the better it gets! + Whether you have ideas of; translation, design changes, code cleaning, or real heavy code changes – help is always welcome. The more is done, the better it gets! Switch to Main Switch to Pop-up Switch to Background @@ -51,20 +36,8 @@ Video and audio Player Cancel - This content is not yet supported by NewPipe. -\n -\nHopefully, it will be supported in a future version. - Do you think feed loading is too slow\? If so, try enabling fast loading (you can change it in settings or by pressing the button below). -\n -\nNewPipe offers two feed loading methods: -\n• Fetching the whole subscription channel, which is slow but complete. -\n• Using a dedicated service endpoint, which is fast but usually not complete. -\n -\nThe difference between the two is that the fast one usually lacks some information, like the item\'s duration or type (can\'t distinguish between live videos and normal ones) and it may return fewer items. -\n -\nYouTube is an example of a service that offers this fast method with its RSS feed. -\n -\nSo the choice boils down to what you prefer: speed or complete information. + This content is not yet supported by NewPipe. \n \nHopefully, it will be supported in a future version. + Do you think feed loading is too slow? If so, try enabling fast loading (you can change it in settings or by pressing the button below). \n \nNewPipe offers two feed loading methods: \n• Fetching the whole subscription channel, which is slow but complete. \n• Using a dedicated service endpoint, which is fast but usually not complete. \n \nThe difference between the two is that the fast one usually lacks some information, like the item\'s duration or type (can\'t distinguish between live videos and normal ones) and it may return fewer items. \n \nYouTube is an example of a service that offers this fast method with its RSS feed. \n \nSo the choice boils down to what you prefer: speed or complete information. Available in some services, it is usually much faster but may return a limited number of items and often incomplete information (e.g. no duration, item type, no live status). Maximum number of attempts before cancelling the download Read licence @@ -72,14 +45,14 @@ NewPipe’s licence Licences Third-party licences - Downloading to SD card not possible. Reset download folder location\? + Downloading to SD card not possible. Reset download folder location? Behaviour Select your favourite PeerTube instances Continue playing after interruptions (e.g. phone calls) Published on %1$s Report via e-mail Select your favorite night theme – %s - No stream player found. Install VLC\? + No stream player found. Install VLC? Install Okay Open in browser diff --git a/app/src/main/res/values-eo/strings.xml b/app/src/main/res/values-eo/strings.xml index e1b1bede2..61e87cfa4 100644 --- a/app/src/main/res/values-eo/strings.xml +++ b/app/src/main/res/values-eo/strings.xml @@ -8,7 +8,7 @@ Elŝuti Serĉi Agordoj - Ĉu vi signifis \"%1$s\"\? + Ĉu vi signifis \"%1$s\"? Konigi kun Uzi eksteran filmetoludilon Uzi eksteran sonludilon @@ -93,8 +93,7 @@ %s filmeto %s filmetoj - Tiu permeso estas necesa por -\nmalfermi en ŝprucfenestra modo + Tiu permeso estas necesa por \nmalfermi en ŝprucfenestra modo Ludante en ŝprucfenestra modo Malŝatitaj Forviŝi @@ -153,7 +152,7 @@ Meti kiel bildeto de ludlisto Legosigno Ludlisto Forviŝi Legosignon - Ĉu forviŝi ĉi tiun ludliston \? + Ĉu forviŝi ĉi tiun ludliston ? Ludlisto kreita Ludlistita Bildeto de ludlisto ŝanĝiĝita. @@ -165,20 +164,8 @@ 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 tiu retpaĝo: %1$s -\n2. Ensalutu kiam oni petas vin -\n3. Click on \"All data included\", then on \"Deselect all\", then select only \"subscriptions\" and click \"OK\" -\n4. Click on \"Next step\" and then on \"Create export\" -\n5. Click on the \"Download\" button after it appears and -\n6. From the downloaded takeout zip extract the .json file (usually under \"YouTube and YouTube Music/subscriptions/subscriptions.json\") and import it here. - Importu Soundcloud-n profilon tajpante ĉu la ligilon, ĉu vian ID : -\n -\n1. Ebligu komputilon modon en retumilon (la retejo malhaveblas por poŝtelefonoj) -\n2. Iru tien: %1$s -\n3. Ensalutu kiam oni petas vin -\n4. Kopiu la ligilon de profilo ke oni kondikis vin. + Importu Jutubajn abonaĵojn per elŝuti la dosieron de eksporto : \n \n1. Iru ĉe tiu retpaĝo: %1$s \n2. Ensalutu kiam oni petas vin \n3. Click on \"All data included\", then on \"Deselect all\", then select only \"subscriptions\" and click \"OK\" \n4. Click on \"Next step\" and then on \"Create export\" \n5. Click on the \"Download\" button after it appears and \n6. From the downloaded takeout zip extract the .json file (usually under \"YouTube and YouTube Music/subscriptions/subscriptions.json\") and import it here. + Importu Soundcloud-n profilon tajpante ĉu la ligilon, ĉu vian ID : \n \n1. Ebligu komputilon modon en retumilon (la retejo malhaveblas por poŝtelefonoj) \n2. Iru tien: %1$s \n3. Ensalutu kiam oni petas vin \n4. Kopiu la ligilon de profilo ke oni kondikis vin. Bildokaŝmemoro vakigis Vakigi kaŝmemorigitajn metadatumojn Vakigi tutajn kaŝmemorigitajn retpaĝajn datumojn @@ -186,10 +173,10 @@ Neniuj torentoj haveblaj por elŝuti Forviŝi vidohistorion Forviŝi la historion de viditaj filmetojn kaj ludajn poziciojn - Ĉu vi volas forviŝi la tutan historion \? + Ĉ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 \? + Ĉu vi volas forviŝi la totalon de la historio de serĉo ? Historio de serĉo forviŝita Limigi distingumon uzante telefonan retkonekton Minimumigi al ŝprucfenestra ludilo @@ -204,7 +191,7 @@ Sciigo por ĝisdatigo de apo Sciigo por novaj versioj de NewPipe Ekstera konservejo malhavebla - Elŝuti al ekstera SD-karto ne eblas. Ĉu vi volas restarigi la elŝutan dosierujon \? + Elŝuti al ekstera SD-karto ne eblas. Ĉu vi volas restarigi la elŝutan dosierujon ? viciĝita Envicigi Halti @@ -227,7 +214,7 @@ Ludaj pozicioj forviŝitaj Dosiero movita aŭ forviŝita ne povas dispremi la dosieron - Ĉu vi volas forviŝi vian historion de elŝutoj aŭ forviŝi la tutajn elŝutitajn dosierojn\? + Ĉu vi volas forviŝi vian historion de elŝutoj aŭ forviŝi la tutajn elŝutitajn dosierojn? Limigi la elŝutan atendovicon Unu elŝuto ruliĝos en la sama tempo Komenci elŝutojn @@ -238,7 +225,7 @@ La \"Atinga Framo al la Memoro\" ebligas elŝuti al ekstera SD-karto Forviŝi ludajn poziciojn Forviŝi la totalon de ludaj pozicioj - Ĉu vi volas forviŝi ĉiujn ludajn poziciojn \? + Ĉu vi volas forviŝi ĉiujn ludajn poziciojn ? Pardonu, eraro okazis. Pardonon, io mizokasis. Kio okazis: @@ -285,7 +272,7 @@ Neniuj spektoj Neniu filmeto - Ĉu vi volas forviŝi tion eron el la historio de serĉo \? + Ĉu vi volas forviŝi tion eron el la historio de serĉo ? Enhavo de la ĉefpaĝo Malplena Paĝo Kioska Paĝo @@ -336,9 +323,7 @@ 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\? + 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 @@ -349,13 +334,11 @@ 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ĉoj de la Ĝenerala Publika Permesilo de GNU, kiel publikigita per la Free Software Foundation, ĉu en la versio 3, ĉu (se vi volas) ajna posta versio. - Ĉu vi volas ankaŭ importi agordojn\? + Ĉu vi volas ankaŭ importi agordojn? Privateca politiko de NewPipe - La NewPipe projekto serioze respektas vian privatecon. Konsekvence, la apo ne kolektas ajnan datumon sen via konsento. -\nLa privateco politiko de NewPipe detale eksplikas kion datumon estas sendita kaj stokita kiam vi sendas falegosignalon. + La NewPipe projekto serioze respektas vian privatecon. Konsekvence, la apo ne kolektas ajnan datumon sen via konsento. \nLa privateco politiko de NewPipe detale eksplikas kion datumon estas sendita kaj stokita kiam vi sendas falegosignalon. Legi la privatecan politikon - Por konformiĝi al la Ĝenerala Datum-Protekta Regularon (GDPR), ni allogas vian atenton al la privateca politiko de NewPipe. Bonvolu atentive legi ĝin. -\nVi devas akcepti ĝin por sendi la cimsignalon al ni. + Por konformiĝi al la Ĝenerala Datum-Protekta Regularon (GDPR), ni allogas vian atenton al la privateca politiko de NewPipe. Bonvolu atentive legi ĝin. \nVi devas akcepti ĝin por sendi la cimsignalon al ni. Akcepti Rifuzi Neniu limo @@ -411,7 +394,7 @@ Neniu spektas %s spektanto - %s spektantoj + %s spektantoj Neniu aŭskultas @@ -560,7 +543,7 @@ Elekti geston por maldekstra duono de ludil-ekrano Ŝalti \"Limigitan Reĝimon\" de YouTube Rapida reĝimo - Ne eblas rekoni la ligilon. Ĉu malfermi per alia apo\? + Ne eblas rekoni la ligilon. Ĉu malfermi per alia apo? Kuketojn de reCAPTCHA estis forigita Montri enhavon, kiu eble maltaŭgas por infanoj, ĉar ĝi havas aĝo-limon (kiel \"18+\") Novaj fluoj diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 351f9da78..1694d1cbc 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -9,14 +9,14 @@ Descargar Buscar Ajustes - ¿Quisiste decir «%1$s»\? + ¿Quisiste decir «%1$s»? Compartir con Carpeta de descarga de vídeo Los archivos de vídeo descargados se almacenan aquí Elija la carpeta de descarga para los archivos de vídeo Resolución predefinida Reproducir con Kodi - ¿Instalar la aplicación Kode que falta\? + ¿Instalar la aplicación Kode que falta? Mostrar opción «Reproducir con Kodi» Mostrar una opción para reproducir un vídeo a través de Kodi media center Audio @@ -82,8 +82,7 @@ Negro Todo Abrir en modo emergente - Se necesita este permiso -\npara abrir en modo emergente + Se necesita este permiso \npara abrir en modo emergente Reto reCAPTCHA Reto reCAPTCHA requerido Reproduciendo en modo emergente @@ -159,7 +158,7 @@ %s vídeos %s vídeos - ¿Quieres borrar este elemento del historial de búsquedas\? + ¿Quieres borrar este elemento del historial de búsquedas? Contenido de la página principal Página en blanco Página del quiosco @@ -232,7 +231,7 @@ Definir como miniatura de lista de reproducción Marcar lista de reproducción Quitar marcador - ¿Quieres borrar esta lista\? + ¿Quieres borrar esta lista? Lista de reproducción creada Añadido a la lista de reproducción Miniatura de lista de reproducción cambiada. @@ -265,20 +264,10 @@ Exportación anterior No se pudo importar suscripciones No se pudo exportar suscripciones - Importe sus suscripciones de YouTube desde Google Takeout -\n -\n1. Vaya a esta URL: %1$s -\n2. Inicie sesión si es requerido -\n3. Haga clic en \"Se incluyeron todos los datos de Youtube\", después en \"Desmarcar todo\", luego seleccione solamente \"suscripciones\" y haga clic en \"Aceptar\" -\n4. Haga clic en \"Paso siguiente\" y luego en \"Crear exportación\" -\n5. Haga clic en el botón de \"Descargar\" una vez que aparezca -\n6. Haga clic en el botón IMPORTAR ARCHIVO que se muestra abajo y seleccione el archivo zip descargado -\n7. [En caso de que la importación falle] Extraiga el archivo .csv (generalmente dentro de \"Youtube y Youtube Music/suscripciones/suscripciones.csv\"), haga clic en IMPORTAR ARCHIVO y seleccione el archivo csv extraído anteriormente + Importe sus suscripciones de YouTube desde Google Takeout \n \n1. Vaya a esta URL: %1$s \n2. Inicie sesión si es requerido \n3. Haga clic en \"Se incluyeron todos los datos de Youtube\", después en \"Desmarcar todo\", luego seleccione solamente \"suscripciones\" y haga clic en \"Aceptar\" \n4. Haga clic en \"Paso siguiente\" y luego en \"Crear exportación\" \n5. Haga clic en el botón de \"Descargar\" una vez que aparezca \n6. Haga clic en el botón IMPORTAR ARCHIVO que se muestra abajo y seleccione el archivo zip descargado \n7. [En caso de que la importación falle] Extraiga el archivo .csv (generalmente dentro de \"Youtube y Youtube Music/suscripciones/suscripciones.csv\"), haga clic en IMPORTAR ARCHIVO y seleccione el archivo csv extraído anteriormente Importa un perfil de SoundCloud escribiendo la URL o tu ID: \n \n1. Habilita el «modo escritorio» en un navegador web (el sitio no está disponible para dispositivos móviles) \n2. Ve a esta URL: %1$s \n3. Inicia sesión cuando se te pida \n4. Copia la URL del perfil a la que fuiste redireccionado. tuID, soundcloud.com/tuID - Esta operación puede causar un uso intensivo de la red. -\n -\n¿Quieres continuar\? + Esta operación puede causar un uso intensivo de la red. \n \n¿Quieres continuar? Se vació la caché de imágenes Vaciar metadatos en memoria caché Quitar todos los datos guardados de páginas web @@ -294,21 +283,19 @@ Modificar la escala de texto de los subtítulos y los estilos de fondo. Requiere reiniciar la aplicación para que surta efecto Vaciar historial de reproducciones Borra el historial de contenido visto y posiciones de reproducción - ¿Eliminar todo el historial de reproducciones\? + ¿Eliminar todo el historial de reproducciones? Historial de reproducciones borrado Vaciar historial de búsquedas Borra el historial de búsqueda de palabras clave - ¿Borrar todo el historial de búsqueda\? + ¿Borrar todo el historial de búsqueda? Historial de búsquedas borrado Se ha borrado 1 elemento. NewPipe es software libre con copyleft: 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 de 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. - ¿Quieres importar también los ajustes\? + ¿Quieres importar también los ajustes? Política de privacidad de NewPipe - El proyecto NewPipe toma tu privacidad muy en serio. Por ello, la aplicación no recopila ningún dato sin tu consentimiento. -\nLa política de privacidad de NewPipe explica en detalle qué datos se envían y almacenan al enviar un informe de fallo. + El proyecto NewPipe toma tu privacidad muy en serio. Por ello, la aplicación no recopila ningún dato sin tu consentimiento. \nLa política de privacidad de NewPipe explica en detalle qué datos se envían y almacenan al enviar un informe de fallo. Leer política de privacidad - Para cumplir con el «Reglamento general europeo de protección de datos (GDPR)», atraemos su atención sobre la política de privacidad de NewPipe. Por favor léase cuidadosamente. -\nDebe aceptarlo para enviarnos el informe de error. + Para cumplir con el «Reglamento general europeo de protección de datos (GDPR)», atraemos su atención sobre la política de privacidad de NewPipe. Por favor léase cuidadosamente. \nDebe aceptarlo para enviarnos el informe de error. Aceptar Declinar Sin límite @@ -346,7 +333,7 @@ Hay una descarga pendiente con este nombre Mostrar como grilla Mostrar como lista - ¿Quieres vaciar el historial de descargas o borrar todos los ficheros descargados\? + ¿Quieres vaciar el historial de descargas o borrar todos los ficheros descargados? Detener Intentos máximos Cantidad máxima de intentos antes de cancelar la descarga @@ -386,7 +373,7 @@ No es posible descargar a una tarjeta SD externa. ¿Restablecer la ubicación de la carpeta de descarga? No se pudo leer las pestañas guardadas, se usarán las pestañas predefinidas Restaurar valores predefinidos - ¿Quieres restaurar los valores predefinidos\? + ¿Quieres restaurar los valores predefinidos? Número de suscriptores no disponible Qué pestañas aparecen en la página principal Conferencias @@ -409,7 +396,7 @@ Posiciones de reproducción borradas Borrar posiciones de reproducción Borra todas las posiciones de reproducción - ¿Quieres borrar todas las posiciones de reproducción\? + ¿Quieres borrar todas las posiciones de reproducción? Activar/desactivar servicio, seleccionados actualmente: Quiosco predeterminado Nadie está viendo @@ -492,20 +479,8 @@ Disponible para algunos servicios, suele ser más rápido pero puede mostrar una cantidad limitada de ítems y a menudo información incompleta (por ejemplo falta de duración, tipo de ítem o estado) Habilitar modo rápido Deshabilitar modo rápido - ¿Piensas que la carga de contenidos es muy lenta\? Entonces intenta habilitar la carga rápida (puedes cambiarlo en los ajustes o pulsando el botón debajo). -\n -\nNewpipe ofrece dos formas de cargar los contenidos: -\n• Obtener todos los canales con suscripciones, lento pero completo. -\n• Usar un punto dedicado de servicio, más rápido pero usualmente incompleto. -\n -\nLa diferencia es que en la forma rápida usualmente falta algo de información, como la duración o tipo de ítem (no se puede diferenciar entre videos normales y en vivo) y puede que aparezcan menos ítems. -\n -\nYouTube es un ejemplo de un servicio que ofrece este método rápido con su listado de contenidos por RSS. -\n -\nEntonces la elección se limita a qué prefieres: velocidad o información exacta. - Este contenido aún no es soportado por NewPipe. -\n -\nEsperamos que sea soportado en una versión futura. + ¿Piensas que la carga de contenidos es muy lenta? Entonces intenta habilitar la carga rápida (puedes cambiarlo en los ajustes o pulsando el botón debajo). \n \nNewpipe ofrece dos formas de cargar los contenidos: \n• Obtener todos los canales con suscripciones, lento pero completo. \n• Usar un punto dedicado de servicio, más rápido pero usualmente incompleto. \n \nLa diferencia es que en la forma rápida usualmente falta algo de información, como la duración o tipo de ítem (no se puede diferenciar entre videos normales y en vivo) y puede que aparezcan menos ítems. \n \nYouTube es un ejemplo de un servicio que ofrece este método rápido con su listado de contenidos por RSS. \n \nEntonces la elección se limita a qué prefieres: velocidad o información exacta. + Este contenido aún no es soportado por NewPipe. \n \nEsperamos que sea soportado en una versión futura. ∞ vídeos Más de 100 vídeos Artistas @@ -536,7 +511,7 @@ Solo en Wi-Fi Comenzar reproducción automáticamente — %s Reproducir cola - No se pudo reconocer la URL. ¿Abrir con otra aplicación\? + No se pudo reconocer la URL. ¿Abrir con otra aplicación? Poner en cola automáticamente Cambiar de un reproductor a otro puede reemplazar la cola de reproducción La cola de reproducción activa será reemplazada @@ -584,8 +559,7 @@ Este vídeo solo está disponible para los miembros de YouTube Music Premium, por lo que no puede ser transmitido ni descargado por NewPipe. Este contenido es privado, por lo que no puede ser transmitido ni descargado por NewPipe. Este contenido no está disponible en tu país. - Este vídeo tiene restricción de edad. -\nDebido a las nuevas políticas de YouTube con vídeos con restricción de edad, NewPipe no puede acceder a ninguna de sus transmisiones de vídeo, y por lo tanto, no puede reproducirlo. + Este vídeo tiene restricción de edad. \nDebido a las nuevas políticas de YouTube con vídeos con restricción de edad, NewPipe no puede acceder a ninguna de sus transmisiones de vídeo, y por lo tanto, no puede reproducirlo. Radio La descarga ha comenzado Solucionar @@ -663,8 +637,7 @@ Crear una notificación de error Mostrar una barra de error No se ha encontrado un gestor de archivos apropiado para esta acción. \nPor favor, instala un gestor de archivos o intenta deshabilitarlo \'%s\' en los ajustes de la descarga - No se encontró ningún administrador de archivos apropiado para esta acción. -\n Instale un administrador de archivos compatible con Storage Access Framework + No se encontró ningún administrador de archivos apropiado para esta acción. \n Instale un administrador de archivos compatible con Storage Access Framework Comentario fijado LeakCanary no está disponible ExoPlayer valor por defecto @@ -679,7 +652,7 @@ Notificaciones de nuevos directos Notificar de nuevos directos desde las suscripciones Frecuencia de comprobación - ¿Desea borrar del disco todos los archivos descargados\? + ¿Desea borrar del disco todos los archivos descargados? Las notificaciones están deshabilitadas Recibir notificaciones Conmutar todo @@ -717,7 +690,7 @@ Las listas de reproducción que están en gris ya contienen este elemento. Útil, por ejemplo, si está utilizando un auricular con botones físicos rotos Ignorar eventos para botones multimedia de hardware - ¿Eliminar los duplicados\? + ¿Eliminar los duplicados? ¿Quieres eliminar todas las secuencias duplicadas de esta lista de reproducción? Mostrar las siguientes secuencias Mostrar/ocultar secuencias @@ -751,9 +724,7 @@ Ajustes de ExoPlayer Gestiona algunos ajustes de ExoPlayer. Estos cambios requieren reiniciar el reproductor para que surtan efecto Habilita esta opción si tiene problemas con la inicialización del decodificador recurriendo a decodificadores de menor prioridad si el decodificador principal no se inicializa. Esto puede dar como resultado un rendimiento de reproducción más bajo que cuando se usan decodificadores primarios - Esta solución alternativa libera los códecs de video y los vuelve a instanciar cuando cambia la máscara, en lugar de configurar la máscara directamente en el códec. ExoPlayer ya usa esta configuración en algunos dispositivos con este problema y solo afecta a Android 6 y versiones posteriores -\n -\nHabilitar esta opción puede evitar errores de reproducción al cambiar el reproductor de video actual o cambiar al modo de pantalla completa + Esta solución alternativa libera los códecs de video y los vuelve a instanciar cuando cambia la máscara, en lugar de configurar la máscara directamente en el códec. ExoPlayer ya usa esta configuración en algunos dispositivos con este problema y solo afecta a Android 6 y versiones posteriores \n \nHabilitar esta opción puede evitar errores de reproducción al cambiar el reproductor de video actual o cambiar al modo de pantalla completa Posición de las pestañas principales Mover el selector de la pestaña principal a la parte inferior Como se sabe que este dispositivo no es compatible con la tunelización de medios, esta función está desactivada de forma predeterminada. @@ -798,8 +769,7 @@ Miniaturas Compartir la lista de la dirección URL Compartir con los títulos - %1$s -\n%2$s + %1$s \n%2$s Compartir la lista de reproducción - %1$s: %2$s @@ -817,8 +787,7 @@ Restablecer todos los ajustes descartará todos sus ajustes preferidos y reiniciará la aplicación. \n \n¿Estás seguro que quieres continuar? Sí No - NewPipe puede buscar automáticamente nuevas versiones de vez en cuando y notificarle cuando estén disponibles. -\n¿Quieres habilitar esto? + NewPipe puede buscar automáticamente nuevas versiones de vez en cuando y notificarle cuando estén disponibles. \n¿Quieres habilitar esto? Los ajustes de la exportación que se importa utiliza un formato vulnerable que quedó obsoleto desde NewPipe 0.27.0. Asegúrese de que la exportación que se está importando provenga de una fuente confiable y prefiera usar solo exportaciones obtenidas de NewPipe 0.27.0 o posterior en el futuro. La compatibilidad con la importación de configuraciones en este formato vulnerable pronto se eliminará por completo y, luego, las versiones antiguas de NewPipe ya no podrán importar configuraciones de exportaciones desde las nuevas versiones. secundaria Compartir como lista de reproducción temporal de YouTube @@ -877,4 +846,6 @@ NewPipe dejará de soportar Android 5 Desafortunadamente, NewPipe depende de algunas bibliotecas que dejaron de soportar Android 5.0 y 5.1. La próxima versión de NewPipe sólo funcionará en dispositivos con Android 6 o superior, tristemente. Lea más en el artículo de nuestro blog. Artículo + Podcasts + Cursos diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 122914e09..a1272854f 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -2,7 +2,7 @@ Alustamiseks toksa suurendusklaasi ikooni. Avaldatud %1$s - Voogesituseks puudub pleier. Kas paigaldame VLC\? + Voogesituseks puudub pleier. Kas paigaldame VLC? Voogesituseks puudub pleier (selleks saad paigaldada VLC). Paigalda Tühista @@ -13,7 +13,7 @@ Laadi voog alla Otsi Seadistused - Kas mõtlesid: \"%1$s\"\? + Kas mõtlesid: \"%1$s\"? Jaga Kasuta välist videopleierit Eemaldab audio mõnedel lahutustel @@ -41,7 +41,7 @@ Kuva kõrgemaid lahutusi Ainult mõned seadmed suudavad esitada 2K/4K videoid Esita Kodi abil - Kas paigaldame puuduva Kore rakenduse\? + Kas paigaldame puuduva Kore rakenduse? Kuva valik \"Esita Kodi abil\" Kuva valik video esitamiseks Kodi meediakeskuse kaudu Heli @@ -110,11 +110,11 @@ Ekspordi ajalugu, tellimused, esitusloendid ja sätted Puhasta vaatamiste ajalugu Kustutab vaadatud voogude ajaloo ja taasesituse asukohad - Kas kustutada kogu vaatamiste ajalugu\? + Kas kustutada kogu vaatamiste ajalugu? Vaatamiste ajalugu kustutati Kustuta otsinguajalugu Kustutab otsisõnade ajaloo - Kas kustutada kogu otsinguajalugu\? + Kas kustutada kogu otsinguajalugu? Otsinguajalugu kustutati Viga Võrgu viga @@ -185,8 +185,7 @@ Palun oota… Kopeeriti lõikepuhvrisse Vali määra allalaadimiste kataloog hiljem sätetes - Need õigused on vajalikud -\nhüpikakna avamiseks + Need õigused on vajalikud \nhüpikakna avamiseks 1 üksus kustutatud. Laadi alla Lubatud tähemärgid failinimedes @@ -209,7 +208,7 @@ Loe litsentsi Ajalugu Ajalugu - Kas kustutame selle kirje otsinguajaloost\? + Kas kustutame selle kirje otsinguajaloost? Viimati esitatud Enim esitatud Avalehe sisu @@ -251,7 +250,7 @@ Määra esitusloendi pisipildiks Lisa esitusloend järjehoidjaks Eemalda järjehoidja - Kas kustutame selle esitusloendi\? + Kas kustutame selle esitusloendi? Esitusloend loodud Lisasime esitusloendisse Esitusloendi pisipilt on muudetud. @@ -272,18 +271,8 @@ Eelmine eksport Tellimuste import nurjus Tellimuste eksport nurjus - Impordi YouTube tellimused Google väljavõttest: -\n -\n1. Ava aadress: %1$s -\n2. Logi sisse, kui seda küsitakse. -\n3. Klõpsa \"Kõigi andmetega\", vali \"Tühista kõik\", vali ainult \"Tellimused\" ja klõpsa \"OK\". -\n4. Klõpsa \"Järgmine samm\" ja seejärel \"Loo eksport\". -\n5. Klõpsa nupul \"Laadi alla\" siis, kui ta ilmub. -\n6. Klõpsi siitsamast \"Impordi fail\" linki ning vali allalaaditud .zip fail. -\n7. Kui .zip faili importimine ei toimi, siis paki .csv fail lahti (tavaliselt on see fail \"YouTube ja YouTube Muusika/tellimused/tellimused\" või \"YouTube and YouTube Music/subscriptions/subscriptions\") ja klõpsi siitsamast \"Impordi fail\" linki ning vali lahtipakitud csv fail. - See toiming võib põhjustada suurt võrguliiklust. -\n -\nKas jätkata? + Impordi YouTube tellimused Google väljavõttest: \n \n1. Ava aadress: %1$s \n2. Logi sisse, kui seda küsitakse. \n3. Klõpsa \"Kõigi andmetega\", vali \"Tühista kõik\", vali ainult \"Tellimused\" ja klõpsa \"OK\". \n4. Klõpsa \"Järgmine samm\" ja seejärel \"Loo eksport\". \n5. Klõpsa nupul \"Laadi alla\" siis, kui ta ilmub. \n6. Klõpsi siitsamast \"Impordi fail\" linki ning vali allalaaditud .zip fail. \n7. Kui .zip faili importimine ei toimi, siis paki .csv fail lahti (tavaliselt on see fail \"YouTube ja YouTube Muusika/tellimused/tellimused\" või \"YouTube and YouTube Music/subscriptions/subscriptions\") ja klõpsi siitsamast \"Impordi fail\" linki ning vali lahtipakitud csv fail. + See toiming võib põhjustada suurt võrguliiklust. \n \nKas jätkata? Taasesituse kiiruse juhtimine Tempo Nõustu @@ -305,12 +294,7 @@ NewPipe võtab privaatsust väga tõsiselt. Seetõttu ei kogu rakendus ilma nõusolekuta mingeid andmeid. \nNewPipe\'i andmekaitsepõhimõtted selgitavad üksikasjalikult, milliseid andmeid saadetakse ja kogutakse veateate saatmisel. NewPipe on vaba ja avatud lähtekoodiga tarkvara. Seda võid kasutada, uurida, jagada ja parandada nii, nagu õigemaks pead. Täpsemalt - seda võid levitada ja/või muuta vastavalt Vaba Tarkvara Sihtasutuse avaldatud GNU Üldise Avaliku Litsentsi v.3 (või sinu valikul hilisema versiooni) tingimustele. Teavita elutsüklist väljas vigadest - Impordi SoundCloudi profiil trükkides URL või oma ID: -\n -\n1. Luba \"töölaua režiim\" veebilehitsejas (mobiilsete seadmete jaoks leht pole kättesaadav) -\n2. Ava URL: %1$s -\n3. Logi sisse -\n4. Kopeeri suunatud profiili URL. + Impordi SoundCloudi profiil trükkides URL või oma ID: \n \n1. Luba \"töölaua režiim\" veebilehitsejas (mobiilsete seadmete jaoks leht pole kättesaadav) \n2. Ava URL: %1$s \n3. Logi sisse \n4. Kopeeri suunatud profiili URL. sinu_ID, soundcloud.com/sinu_id Toon Lahuta ühendus (võib põhjustada moonutusi) @@ -332,10 +316,10 @@ Rakenduse värskenduse teavitus Teavitus NewPipe\'i uuetest versioonidest Väline andmekandja pole saadaval - Allalaadimine välisele SD-kaardile ei ole võimalik. Kas lähtestada allalaadimiste kataloogi asukoht\? + Allalaadimine välisele SD-kaardile ei ole võimalik. Kas lähtestada allalaadimiste kataloogi asukoht? Tõrge salvestatud vahekaaride lugemisel; kasutatakse vaikeväärtusi Taasta vaikeväärtused - Kas soovid taastada vaikeväärtused\? + Kas soovid taastada vaikeväärtused? Tellijate arv pole saadaval Esilehel kuvatavad vahekaardid Konverentsid @@ -381,7 +365,7 @@ Otsi endale meeldivaid aadressilt %s Vali PeerTube lemmikisendid PeerTube isendid - URLi tuvastamine nurjus. Kas avada mõne teise rakendusega\? + URLi tuvastamine nurjus. Kas avada mõne teise rakendusega? Automaatesitus Puhasta andmed Kuva esituskohtade indikaatorid esitusloendites @@ -451,7 +435,7 @@ Võta kasutusele YouTube\'i „Piiratud režiim“ Faili asukoht on muutunud või on ta kustutatud Taasesituste asukohad on kustutatud - Kas kustutame kõik taasesituste asukohad\? + Kas kustutame kõik taasesituste asukohad? Kustutab kõik taasesituse käigus salvestatud asukohad Kustuta taasesituste asukohad Kustuta küpsised, mille NewPipe on reCAPTCHA vastamise ajal salvestanud @@ -462,11 +446,8 @@ Albumid Laulud Videod - Sellel videol on vanusepiirang. -\nVastavalt YouTube uuetele reeglitele, mis käitlevad vanusepiirangutega materjali, NewPipe ei saa seda kätte ning vastavalt ei suuda seda ka esitada. - Sellel videol on vanusepiirang. -\n -\nKui sa soovid seda näha, siis lülita seadistustest „%1$s“ sisse. + Sellel videol on vanusepiirang. \nVastavalt YouTube uuetele reeglitele, mis käitlevad vanusepiirangutega materjali, NewPipe ei saa seda kätte ning vastavalt ei suuda seda ka esitada. + Sellel videol on vanusepiirang. \n \nKui sa soovid seda näha, siis lülita seadistustest „%1$s“ sisse. YouTube\'is leiduv „Piiratud režiim“ peidab võimaliku täiskasvanutele mõeldud sisu Näita sisu, mis vanusepiirangu tõttu ilmselt ei sobi lastele (näiteks 18+) Sa saad kasutada vaid HTTPS-urle @@ -495,7 +476,7 @@ 100+ videot Sulge Kustuta allalaaditud failid - Kas sa soovid kustutada allalaadimiste ajaloo või allalaaditud failid\? + Kas sa soovid kustutada allalaadimiste ajaloo või allalaaditud failid? Kustuta allalaadimiste ajalugu Seda allalaadimist ei saa uuesti alustada Ühendus aegus @@ -536,14 +517,13 @@ Eemalda vaadatud videod Kasuta süsteemi keelt Rakenduse keel - Alati küsime kuhu kausta soovid faile alla laadida. -\nKui soovid salvestada välisele SD kaardile, siis võta kasutusele süsteemi kaustavalija (system folder picker ehk SAF) + Alati küsime kuhu kausta soovid faile alla laadida. \nKui soovid salvestada välisele SD kaardile, siis võta kasutusele süsteemi kaustavalija (system folder picker ehk SAF) Küsi allalaaditavate failide salvestamise kausta Peata allalaadimised Alusta allalaadimistega Kopeeri vormindatud aruanne Näita vaid rühmitamata tellimus - Kas sa soovid selle kanalite rühma kustutada\? + Kas sa soovid selle kanalite rühma kustutada? Rühmal puudub nimi ExoPlayer\'i piirangute tõttu seadistasime otsingusammu %d sekundile Luba korraga vaid üks allalaadimine @@ -553,9 +533,7 @@ Lülita meedia tunneldamine välja juhul, kui esitamisel tekib must ekraan või pildi kuvamine on katkendlik. Lülita meedia tunneldamine välja Vaheta teenust, hetkel on kasutusel: - NewPipe hetkel sellist võimaluist ei toeta. -\n -\nAga loodetavasti jõuame sellise võimaluse tulevasse versiooni lisada. + NewPipe hetkel sellist võimaluist ei toeta. \n \nAga loodetavasti jõuame sellise võimaluse tulevasse versiooni lisada. Kanali tunnuspilt Looja: %s Näita pisipilte @@ -643,10 +621,8 @@ Teavitused vigadest informeerimiseks Tekkis viga, vaata vastavat teadet Koosta veateade - Selle tegevuse jaoks ei leidunud sobilikku failihaldurit. -\nPalun paigalda nutiseadmesse failihaldur või proovi allalaadimiste seadistustest „%s“ välja lülitada - Selle tegevuse jaoks ei leidunud sobilikku failihaldurit. -\nPalun paigalda nutiseadmesse failihaldur, mis järgib Storage Access Framework reeglistikku + Selle tegevuse jaoks ei leidunud sobilikku failihaldurit. \nPalun paigalda nutiseadmesse failihaldur või proovi allalaadimiste seadistustest „%s“ välja lülitada + Selle tegevuse jaoks ei leidunud sobilikku failihaldurit. \nPalun paigalda nutiseadmesse failihaldur, mis järgib Storage Access Framework reeglistikku Esiletõstetud kommentaar LeakCanary pole saadaval ExoPlayer\'i vaikimisi väärtused @@ -654,7 +630,7 @@ Teavitused pole kasutusel Kontrollimise sagedus Tellimuste-kohaste uute meedivoogude teavitused - Kas kustutame kõik allalaaditud failid andmekandjalt\? + Kas kustutame kõik allalaaditud failid andmekandjalt? Teavitused Seadista hetkel esitatava meediavoo teavitusi Uued meediavood @@ -699,8 +675,8 @@ Kasulik näiteks kui olukorras kui kõrvaklappide nupud on katki Eira nutiseadmes asuvate või seotud seadmete meedianuppude vajutusi Eemalda topeltkirjed - Kas eemaldame topeltkirjed\? - Kas sa soovid eemaldada kõik topelt meediavood sellest esitusloendist\? + Kas eemaldame topeltkirjed? + Kas sa soovid eemaldada kõik topelt meediavood sellest esitusloendist? Näita järgmisi meediavooge Näita/peida meediavood Tulemas @@ -732,9 +708,7 @@ ExoPlayer\'i seadistused Järgnevas saad hallata mõningaid ExoPlayer\'i seadistusi. Need muudatused vajavad jõustumiseks meediamängija uuesti käivitamist Kasuta seda võimalust, kui põhidekooder ei käivitu korralikult. Selle asemel laaditakse alternatiivne dekooder, kuid tulemuseks võib olla kehvem taasesituse kvaliteet - Video väljundpinna muutumisel see alternatiivne lahendus eemaldab videokodekid kasutusest ja laadib nad uuesti ega ürita videokodeke uue väljundpinnaga sobitada. See seadistus toimib vaid Android 6 ja uuemates versioonides ning mõne seadme puhul on juba automaatselt kasutusel -\n -\nSelle valiku kasutamine hoiab ära mõned vea, mis tekivad ekraani pööramisel ja täisekraanivaate kasutamisel + Video väljundpinna muutumisel see alternatiivne lahendus eemaldab videokodekid kasutusest ja laadib nad uuesti ega ürita videokodeke uue väljundpinnaga sobitada. See seadistus toimib vaid Android 6 ja uuemates versioonides ning mõne seadme puhul on juba automaatselt kasutusel \n \nSelle valiku kasutamine hoiab ära mõned vea, mis tekivad ekraani pööramisel ja täisekraanivaate kasutamisel Tõsta põhiline vahekaartide valija alla äärde Vahekaartide põhiline asukoht Kuna on teada, et see seade ei toeta meedia tunneldamist, siis on see funktsionaalsus vaikimisi välja lülitatud. @@ -779,8 +753,7 @@ Otseeeter Jaga url\'ide loendina Jagamisel lisa pealkirjad - %1$s -\n%2$s + %1$s \n%2$s Jaga esitusloendit - %1$s: %2$s Näita veel @@ -795,9 +768,7 @@ Lähtesta seadistused Lähtesta kõik seadistused nende vaikimisi väärtusteks Seadmes pole enam piisavalt vaba ruumi - Kui lähtestad kõik seadistused, siis kõik sinu muudetud seadistused asendatakse vaikimisi väärtustega ja rakendus käivitub uuesti. -\n -\nKas sa soovid jätkata? + Kui lähtestad kõik seadistused, siis kõik sinu muudetud seadistused asendatakse vaikimisi väärtustega ja rakendus käivitub uuesti. \n \nKas sa soovid jätkata? Jah Ei Imporditavad andmed kasutavad turvaprobleemidega vormingut, mida alates versioonist 0.27.0 NewPipe enam kasutada ei suuda. Palun kontrolli, et impordifail on loodud usaldusväärse osapoole poolt ning eelista ekspordifaile, mis on loodud NewPipe\'i versiooniga 0.27.0 või uuemaga. Tugi sellise vana vormingu kasutamisele kaob õige pea ja seejärel NewPipe\'i uuemad ja vanemad versioonid ei saa omavahel andmeid enam vahetada. diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index f48835460..ee518d0a7 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -29,7 +29,7 @@ Desatseginak Atseginak Ez da igorpen-erreproduzigailurik aurkitu. VLC instalatu? - \"%1$s\" esan nahi al zenuen\? + \"%1$s\" esan nahi al zenuen? Erabili kanpo bideo-erreproduzitzailea Erabili kanpo audio-erreproduzitzailea Atzeko planoan erreproduzitzen @@ -97,8 +97,7 @@ Itxaron mesedez… Arbelera kopiatuta Ezarri deskargetarako karpeta bat ezarpenetan geroago - Baimen hau beharrezkoa da -\nlaster-leiho moduan irekitzeko + Baimen hau beharrezkoa da \nlaster-leiho moduan irekitzeko reCAPTCHA erronka reCAPTCHA erronka eskatu da NewPipe-i buruz @@ -280,9 +279,7 @@ Inportatu YouTube harpidetzak Google takeout-etik: \n \n1. Joan URL honetara: %1$s \n2. Hasi saioa eskatzen zaizunean \n3. Hautatu «Datu guztiak barne», gero «Kendu hautapen guztiak», eta hautatu «harpidetzak» soilik eta egin klik «Ados» botoian \n4. Egin klik «Hurrengo pausua» eta «Sortu esportazioa» botoietan \n5. Egin klik «Deskargatu» botoian agertzen denean \n6. Egin klik INPORTATU FITXATEGIA botoian eta hautatu deskargatutako .zip fitxategia \n7. [.zip inportazioak huts egiten badu] Erauzi .csv fitxategia deskargatutako takeout zip-etik (normalean «Youtube eta Youtube Music/harpidetzak/harpidetzak.csv»), egin klik INPORTATU FITXATEGIA botoian eta hautatu erauzitako csv fitxategia Inportatu SoundCloud profila URL-a edo zure ID-a idatziz: \n \n1. Gaitu «mahaigain modua» web nabigatzailean (gunea ez dabil mugikorretan) \n2. Joan URL honetara: %1$s \n3. Hasi saioa eskatzen zaizunean \n4. Kopiatu profilaren URL-a eraman zaizun orritik. zureID,soundcloud.com/zureid - Eragiketa honek sarearen erabilera handia egin lezake. -\n -\nJarraitu nahi duzu? + Eragiketa honek sarearen erabilera handia egin lezake. \n \nJarraitu nahi duzu? Erreprodukzio-abiaduraren kontrolak Tempoa Tonua @@ -319,7 +316,7 @@ Aplikazioaren eguneraketen jakinarazpena NewPipe aplikazioaren bertsio berrien jakinarazpena Kanpoko biltegiratzea ez dago eskuragarri - Ezin da SD txartel batera deskargatu. Deskargen karpeta berrezarri nahi duzu\? + Ezin da SD txartel batera deskargatu. Deskargen karpeta berrezarri nahi duzu? Ezin izan dira gordetako fitxak irakurri, lehenetsitakoak erabiltzen Berrezarri lehenetsitakoak Lehenetsitako balioak berrezarri nahi dituzu? @@ -386,8 +383,7 @@ Hasi deskargak Pausatu deskargak Galdetu non deskargatu - Non gorde galdetuko zaizu deskarga bakoitzean. -\nGaitu sistemaren karpeta hautatzailea (SAF) kanpoko SD txartel batera deskargatu nahi baduzu + Non gorde galdetuko zaizu deskarga bakoitzean. \nGaitu sistemaren karpeta hautatzailea (SAF) kanpoko SD txartel batera deskargatu nahi baduzu Ez dago inor ikusten Ikusle %s @@ -434,17 +430,7 @@ %d segundo ExoPlayer-en mugak direla eta bilaketaren iraupena %d segundotan ezarri da - Jarioaren karga motelegia dela uste duzu\? Hala bada, saiatu karga azkarra gaitzen (ezarpenetan edo beheko botoia sakatzen aldatu dezakezu). -\n -\nNewPipe jarioak kargatzeko bi estrategia eskaintzen ditu: -\n• Harpidetza kanal osoa eskuratu, motela baina osoa. -\n• Amaiera-puntu dedikatua erabiliz, arina baina ez osatua. -\n -\nBien arteko diferentzia arinak normalean informazioa falta dela da, elementuaren iraupena edo mota adibidez (ezin du bideo normalen eta zuzenekoen artean bereizi) eta elementu gutxiago buelta ditzake. -\n -\nYouTube da bere RSS jarioaren bidez metodo azkarra eskaintzen duen zerbitzu bat adibidez. -\n -\nBeraz aukerak zure nahietara murrizten dira: abiadura edo informazio zehatza. + Jarioaren karga motelegia dela uste duzu? Hala bada, saiatu karga azkarra gaitzen (ezarpenetan edo beheko botoia sakatzen aldatu dezakezu). \n \nNewPipe jarioak kargatzeko bi estrategia eskaintzen ditu: \n• Harpidetza kanal osoa eskuratu, motela baina osoa. \n• Amaiera-puntu dedikatua erabiliz, arina baina ez osatua. \n \nBien arteko diferentzia arinak normalean informazioa falta dela da, elementuaren iraupena edo mota adibidez (ezin du bideo normalen eta zuzenekoen artean bereizi) eta elementu gutxiago buelta ditzake. \n \nYouTube da bere RSS jarioaren bidez metodo azkarra eskaintzen duen zerbitzu bat adibidez. \n \nBeraz aukerak zure nahietara murrizten dira: abiadura edo informazio zehatza. Desgaitu modu azkarra Gaitu modu azkarra Zerbitzu batzuetan eskuragarri, normalean askoz azkarragoa da, baina elementu kopuru mugatu eta osatu gabeko informazioa itzuli dezake (adib. iraupenik ez, elementu mota, zuzeneko egoerarik ez) @@ -454,7 +440,7 @@ Jarioaren eguneratze atalasea Jarioa Berria - Talde hau ezabatu nahi duzu\? + Talde hau ezabatu nahi duzu? Talde izena hutsik %d hautatuta @@ -513,7 +499,7 @@ Adinez mugatuta dagoen eta haurrentzako desegokia izan daitezkeen edukia erakutsi (+18 adibidez) YouTube-ren «Modu mugatua» helduentzako edukia izan daitekeen edukia ezkutatzen du Gaitu YouTube-ren «Modu mugatua» - Ezin izan da URL-a ezagutu. Beste aplikazio batekin ireki\? + Ezin izan da URL-a ezagutu. Beste aplikazio batekin ireki? Auto-ilaratzea Erreprodukzio-ilara aktiboa ordezkatuko da Erreproduzitzaile batetik beste batera aldatzeak ilara ordezkatu dezake @@ -563,8 +549,7 @@ Eduki hau ez dago eskuragarri zure herrialdean. Aplikazioa kraskatu Ebatzi - Bideo hau adinez mugatua dago. -\nAdinez mugatutako bideoekiko YouTube-ren politika berriengatik, NewPipe-k ezin ditu bideoen igorpen hauek atzitu eta erreproduzitu. + Bideo hau adinez mugatua dago. \nAdinez mugatutako bideoekiko YouTube-ren politika berriengatik, NewPipe-k ezin ditu bideoen igorpen hauek atzitu eta erreproduzitu. Deskarga hasi da Behean gaueko gai gogokoena hautatu dezakezu Hautatu zure gaueko gai gogokoena — %s @@ -586,9 +571,7 @@ Desgaitu deskribapenaren testu-hautaketa Deskribapenaren testu-hautaketa gaitu Orain deskribapenaren barruko testua hauta dezakezu. Kontuan izan orrialdea keinuka hasi dezakela eta estekak ezin direla klikatu hautaketa moduan zauden bitartean. - Egilearen kontua itxi da. -\nNewPipe-k ezingo du etorkizunean jario hau kargatu. -\nKanal honetatik harpidetza kendu nahi duzu\? + Egilearen kontua itxi da. \nNewPipe-k ezingo du etorkizunean jario hau kargatu. \nKanal honetatik harpidetza kendu nahi duzu? Ezin izan da \'%s\' jarioa kargatu. Errorea jarioa kargatzean Android 10etik aurrera \'Biltegiaren Sarrera Framework\'a soilik onartzen da @@ -633,13 +616,11 @@ Bilatu eguneraketak Bilatu bertsio berriak eskuz Elementu berriak jarioan - Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. -\nMesedez, instalatu Storage Access Framework-ekin bateragarria den fitxategi kudeatzaile bat + Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. \nMesedez, instalatu Storage Access Framework-ekin bateragarria den fitxategi kudeatzaile bat Ainguratutako iruzkina Erreproduzitzailea kraskatu Eguneraketak bilatzen… - Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. -\nMesedez, instalatu fitxategi kudeatzaile bat edo saiatu \'%s\' desgaitzen deskarga ezarpenetan + Ez da fitxategi kudeatzaile bat aurkitu ekintza honetarako. \nMesedez, instalatu fitxategi kudeatzaile bat edo saiatu \'%s\' desgaitzen deskarga ezarpenetan Erreproduzitzailea erabiltzean kraskadura aukera erakusten du Erakutsi errore barra bat Sortu errore jakinarazpen bat @@ -655,7 +636,7 @@ , Txandakatu denak Harpidetzen igorpen berriei buruz jakinarazi - Ezabatu deskargatutako fitxategi guztiak biltegitik\? + Ezabatu deskargatutako fitxategi guztiak biltegitik? Harpidetzen igorpen berrien jakinarazpenak Igorpenaren xehetasunak kargatzen… @@ -694,7 +675,7 @@ Ezikusi hardware multimedia-botoien gertaerak Erabilgarria, adibidez, botoi fisiko hautsiak dituen entzungailua erabiltzen ari bazara Kendu bikoiztuak - Kendu bikoiztuak\? + Kendu bikoiztuak? Igorpen bikoiztu guztiak kendu nahi dituzu zerrenda honetatik? Erakutsi hurrengo igorpenak Erakutsi/Ezkutatu igorpenak @@ -754,21 +735,15 @@ \? Inportatzen den esportazioko ezarpenek NewPipe 0.27.0 geroztik zaharkituta zegoen formatu ahula erabiltzen dute. Ziurtatu inportatzen ari den esportazioa iturri fidagarri batekoa dela, eta etorkizunean NewPipe 0.27.0 edo berriagoa den esportazioak soilik erabili. Formatu ahul honetan ezarpenak inportatzeko euskarria erabat kenduko da laster, eta NewPipe-ren bertsio zaharrek ezin izango dituzte bertsio berrietatik esportazioen ezarpenak inportatu. - %1$s: %2$s - %1$s -\n%2$s + %1$s \n%2$s Bai Babeskopia eta berrezarpena - NewPipe-k bertsio berriak bilatu ditzake eta eskuragarri daudenean jakinarazi. -\nHau gaitu nahi duzu? + NewPipe-k bertsio berriak bilatu ditzake eta eskuragarri daudenean jakinarazi. \nHau gaitu nahi duzu? Berrezarri ezarpenak Berrezarri ezarpen guztiak lehenetsitako baliotara - Ezarpenak berrezartzeak zure ezarpen gogokoenak baztertzen ditu eta aplikazioa berrabiarazten du. -\n -\nAurrera egin nahi duzu? + Ezarpenak berrezartzeak zure ezarpen gogokoenak baztertzen ditu eta aplikazioa berrabiarazten du. \n \nAurrera egin nahi duzu? Ez dago leku libre nahikorik gailuan - Konponbide honek azal aldaketa bat gertatzean bideo kodekak askatu eta berrezartzen ditu, azalaren kodeka zuzenean ezarri ordez. ExoPlayer-ek dagoeneko erabiltzen du arazoak dituzten gailu batzuetan. Ezarpen honek Android 6 eta berriagotan funtzionatzen du soilik -\n -\nAukera hau gaitzeak erreprodukzio erroreak saihestu ditzake bideo-erreproduktorea aldatzean edo pantaila osoan jartzean + Konponbide honek azal aldaketa bat gertatzean bideo kodekak askatu eta berrezartzen ditu, azalaren kodeka zuzenean ezarri ordez. ExoPlayer-ek dagoeneko erabiltzen du arazoak dituzten gailu batzuetan. Ezarpen honek Android 6 eta berriagotan funtzionatzen du soilik \n \nAukera hau gaitzeak erreprodukzio erroreak saihestu ditzake bideo-erreproduktorea aldatzean edo pantaila osoan jartzean bikoiztua Bideoak Pistak diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index 5367b640c..1a11ff337 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -222,7 +222,7 @@ تاریخچه تماشا تاریخچه و انباره اشکال‌زدایی - به‌روز رسانی‌ها + به‌روز رسانی‌ها گشودن در حالت تصویردرتصویر وضوح پیش‌گزیدهٔ تصویردرتصویر تصویردرتصویر @@ -278,8 +278,7 @@ چی:\nدرخواست:\nزبان محتوا:\nکشور محتوا:\nزبان اپ:\nخدمت:\nزمان GMT\nپکیج:T:\nنسخه:\nنسخه‌اندروید: چالش ری‌کپچا نیاز به چالش ری‌کپچا است - این اجازه برای گشودن در حالت -\nتصویر در تصویر لازم است + این اجازه برای گشودن در حالت \nتصویر در تصویر لازم است نمایش در حالت تصویر در تصویر پروانه‌های شخص سوم © %1$s توسط %2$s تحت %3$s @@ -313,24 +312,9 @@ پرونده موجود نیست و یا مجوز خواندن یا نوشتن روی آن وجود ندارد وارد کردن پرونده صادرکردن قبلی - درون‌ریزی اشتراک‌های یوتوب از بیرون‌بری گوگل: -\n -\n۱. به این نشانی بروید: %1$s -\n۲. در صورت نیاز، وارد شوید -\n۳. روی All data included و سپس Deselect all کیلک کنید. سپس تنها subscriptions را گزیده و OK را بزنید -\n۴. روی Next step و سپس Create export کلیک کنید -\n۵.پس از ظاهر شدن دکمهٔ Download رویش کلیک کنید -\n۶. درون‌ریزی پرونده را در زیر زده و پروندهٔ فشردهٔ بارگیری شده را برگزینید -\n۷. [اگر درون‌ریزی شکست خورد] پروندهٔ ‪.csv‬ را (معمولاً زیر YouTube and YouTube Music/subscriptions/subscriptions.csv) استخراج کنید، روی درون‌ریزی پرونده در زیر زده و پروندهٔ csv استخراج شده را برگزینید - وارد کردن نمایه ساندکلاد با وارد کردن نشانی یا ID شما: -\n -\n۱. حالت میزکار را در مرورگر وب فعال کنید (سایت برای دستگاه‌های همراه در دسترس نیست) -\n۲. به این نشانی بروید: %1$s -\n۳. در صورت لزوم، وارد شوید -\n۴. نشانی نمایه‌ای که به آن هدایت شده‌اید را کپی کنید. - در نظر داشته باشید که این عملیات می‌تواند داده زیادی مصرف کند. -\n -\nادامه می‌دهید؟ + درون‌ریزی اشتراک‌های یوتوب از بیرون‌بری گوگل: \n \n۱. به این نشانی بروید: %1$s \n۲. در صورت نیاز، وارد شوید \n۳. روی All data included و سپس Deselect all کیلک کنید. سپس تنها subscriptions را گزیده و OK را بزنید \n۴. روی Next step و سپس Create export کلیک کنید \n۵.پس از ظاهر شدن دکمهٔ Download رویش کلیک کنید \n۶. درون‌ریزی پرونده را در زیر زده و پروندهٔ فشردهٔ بارگیری شده را برگزینید \n۷. [اگر درون‌ریزی شکست خورد] پروندهٔ ‪.csv‬ را (معمولاً زیر YouTube and YouTube Music/subscriptions/subscriptions.csv) استخراج کنید، روی درون‌ریزی پرونده در زیر زده و پروندهٔ csv استخراج شده را برگزینید + وارد کردن نمایه ساندکلاد با وارد کردن نشانی یا ID شما: \n \n۱. حالت میزکار را در مرورگر وب فعال کنید (سایت برای دستگاه‌های همراه در دسترس نیست) \n۲. به این نشانی بروید: %1$s \n۳. در صورت لزوم، وارد شوید \n۴. نشانی نمایه‌ای که به آن هدایت شده‌اید را کپی کنید. + در نظر داشته باشید که این عملیات می‌تواند داده زیادی مصرف کند. \n \nادامه می‌دهید؟ پاک کردن فرادادهٔ کش شده فراداده‌های کش شده پاکش شدند تندا @@ -342,8 +326,7 @@ پاک کردن تاریخچه جریان‌های پخش شه و موقعیت‌های پخش نیوپایپ یک نرم‌افزار آزاد کپی‌لفتی است: می‌توانید به دلخواه خود استفاده، بررسی، هم‌رسانی و بهترش کنید. به طور خاص می‌توانید ذیل نگارش ۳ یا هر نگارش بالاتری از پروانهٔ جامع همگانی گنو که به دست بنیاد نرم‌افزار آزاد منتشر شده، تغییر و بازنشرش دهید. پروژهٔ نیوپایپ محرمانگیتان را بسیار جدی می‌گیرد. برای همین کاره هیچ داده‌ای را بدون رضایتتان جمع‌آوری نمی‌کند.\nسیاست محرمانگی نیوپایپ با جزییات توضیح می‌دهد که هنگام گزارش فروپاشی چه داده‌هایی فرستاده و ذخیره می‌شوند. - به منظور هماهنگی با مقرّرات حفاظت دادهٔ عمومی اروپا (GDPR) توجهتان را به سیاست محرمانگی نیوپایپ جلب می‌کنیم. لطفاً به دقّت مطالعه‌اش کنید. -\nبرای فرستادن گزارش مشکل باید بپذیریدش. + به منظور هماهنگی با مقرّرات حفاظت دادهٔ عمومی اروپا (GDPR) توجهتان را به سیاست محرمانگی نیوپایپ جلب می‌کنیم. لطفاً به دقّت مطالعه‌اش کنید. \nبرای فرستادن گزارش مشکل باید بپذیریدش. کیفیت را در زمان استفاده از داده همراه محدود کن پرش به جلو حین سکوت بازنشانی @@ -389,8 +372,7 @@ شروع بارگیری‌ها مکث بارگیری‌ها محل بارگیری را سوال کن - برای ذخیرهٔ هر بارگیری از شما پرسیده خواهد شد. -\nاگر می‌خواهید رو ی کارت SD خارجی بارگیری کنید، شاخه‌گزین سامانه (SAF) را به کار بیندازید + برای ذخیرهٔ هر بارگیری از شما پرسیده خواهد شد. \nاگر می‌خواهید رو ی کارت SD خارجی بارگیری کنید، شاخه‌گزین سامانه (SAF) را به کار بیندازید استفاده از شاخه‌بردار سامانه (SAF) «چارچوب دسترسی ذخیره» اجازهٔ بارگیری روی کارت SD خارجی را می‌دهد حذف موقعیت‌های پخش @@ -416,9 +398,7 @@ کمینه کردن به هنگام تغییر برنامه توسط %s ایجاد شده توسط %s - این محتوا هنوز توسط نیوپایپ پشتیبانی می‌شود. -\n -\nامیدواریم در نسخه‌های آینده مورد پشتیبانی قرار گیرد. + این محتوا هنوز توسط نیوپایپ پشتیبانی می‌شود. \n \nامیدواریم در نسخه‌های آینده مورد پشتیبانی قرار گیرد. غیرفعال‌سازی حالت سریع فعال‌سازی حالت سریع خوراک @@ -501,17 +481,7 @@ صفحه فهرست پخش ویدیوهایی که پیش و‌ پس از افزوده شدن به سیاههٔ پخش دیده شده‌اند حذف خواهند شد. \nمطمئنید؟ گزارش اجباری خطاهای Rx غیرقابل تحویل خارج از چرخه حیات فعالیت یا بخش پس از اتمام - فکر می‌کنید دریافت خوراک بیش از حد آهسته است؟ اگر چنین است، بارگیری سریع را فعالی کنید (می‌توانید آن را در تنظیمات یا با فشردن دکمه زیر تغییر دهید) -\n -\nنیوپایپ دو راهبرد برای بارگیری خوراک عرضه می‌کند: -\n• دریافت تمام کانال‌های مشترک شده، که آهسته اما کامل است. -\n• استفاده از خدمت اختصاصی، که سریع اما معمولا ناقص است. -\n -\nتفاوت بین این دو در این است که راهکار سریع، غالبا فاقد برخی اطلاعات مانند طول زمان یا نوع است و مثلا نمی‌تواد بین ویدئوهای زنده و عادی تمایز قائل شود و ممکن است تعداد کم‌تری ویدئو را دریافت کند. -\n -\nیوتیوب نمونه‌ای از یک خدمت است که چنین روش سریعی را از طریق خوراک RSS ارائه می‌دهد. -\n -\nدر نتیجه انتخاب به این بر می‌گردد که کدام یک برای‌تان ترجیح داشته باشد: سرعیت یا اطلاعات دقیق. + فکر می‌کنید دریافت خوراک بیش از حد آهسته است؟ اگر چنین است، بارگیری سریع را فعالی کنید (می‌توانید آن را در تنظیمات یا با فشردن دکمه زیر تغییر دهید) \n \nنیوپایپ دو راهبرد برای بارگیری خوراک عرضه می‌کند: \n• دریافت تمام کانال‌های مشترک شده، که آهسته اما کامل است. \n• استفاده از خدمت اختصاصی، که سریع اما معمولا ناقص است. \n \nتفاوت بین این دو در این است که راهکار سریع، غالبا فاقد برخی اطلاعات مانند طول زمان یا نوع است و مثلا نمی‌تواد بین ویدئوهای زنده و عادی تمایز قائل شود و ممکن است تعداد کم‌تری ویدئو را دریافت کند. \n \nیوتیوب نمونه‌ای از یک خدمت است که چنین روش سریعی را از طریق خوراک RSS ارائه می‌دهد. \n \nدر نتیجه انتخاب به این بر می‌گردد که کدام یک برای‌تان ترجیح داشته باشد: سرعیت یا اطلاعات دقیق. در برخی خدمات دردسترس است، معمولا خیلی سریع‌تر است، ولی ممکن است مواردی محدودتر و اغلب با اطلاعات ناقص (مثلا بدون طول زمان، نوع مورد و یا وضعیت زنده بود) ارائه دهد دریافت از خوراک اختصاصی هر زمان که در دسترس باشد همواره به‌روز شود @@ -592,9 +562,7 @@ گشودن با نشانه به عنوان دیده شده درخواست از اندروید برای سفارشی‌سازی رنگ آگاهی براساس رنگ اصلی در بندانگشتی (توجّه داشته باشید که روی همهٔ افزاره‌ها در دسترس نیست) - این ویدیو محدود به سن است. -\n -\nاگر می‌خواهید ببینیدش، «%1$s» را در تنظیمات روشن کنید. + این ویدیو محدود به سن است. \n \nاگر می‌خواهید ببینیدش، «%1$s» را در تنظیمات روشن کنید. نمایش محتوایی که احتمالاً به خاطر محدودیت سنیشان (مثل ۱۸+) برای کودکان مناسب نیستند یوتوب یک «حالت محدود» دارد کهه محتوای احتمالاً بالغانه را پنهان می‌کند کوکی‌های ری‌کپچا پاک‌سازی شدند @@ -604,24 +572,21 @@ برای نهفتن جعبه‌های فرااطَلاعات با اطّلاعات اضافی دربارهٔ ایجادگر جریان، محتوای جریان یا درخواست جست‌وجو، خاموش کنید برای نهفتن شرح ویدیو و اطّلاعات اضافی، خاموش کنید هیچ کاره‌ای روی افزاره‌تان نمی‌تواند بگشایدش - این ویدیو محدود به سن است. -\nبنا به سیاست‌های جدید یوتوب دربارهٔ ویدیوهای محدود به سن، نیوپایپ نمی‌تواند به هیچ یک از جریان‌های ویدیوییش دست پیدا کرده و بنابراین در پخش آن، ناتوان است. + این ویدیو محدود به سن است. \nبنا به سیاست‌های جدید یوتوب دربارهٔ ویدیوهای محدود به سن، نیوپایپ نمی‌تواند به هیچ یک از جریان‌های ویدیوییش دست پیدا کرده و بنابراین در پخش آن، ناتوان است. این محتوا در کشورتان قابل دسترسی نیست. این قطعه، لااقل در کشور شما، یک قطعهٔ گوپلاس سوندکلود است. پس نمی‌تواند به دست نیوپایپ جریان یافته یا بارگیری شود. این محتوا خصوصی است. پس نمی‌تواند به دست نیوپایپ جریان یافته یا بارگیری شود. این ویدیو فقط برای اعضای ویژهٔ آهنگ‌های یوتوب در دسترس است. پس نمی‌تواند به دست نیوپایپ جریان یافته یا بارگیری شود. این محتوا فقط برای کاربرانی که پول داده‌اند در دسترس است. پس نمی‌تواند به دست نیوپایپ جریان یافته یا بارگیری شود. زمینهٔ شب محبوبتان را برگزینید — %s - در زیر می‌توانید زمینهٔ شب محبوبتان را برگزینید + می‌توانید زمینهٔ شب دلخواهتان را در زیر بگزینید اگر هنگام پخش ویدیو با صفحهٔ سیاه یا وقفه مواجه شدید، تونل‌زنی رسانه را از کار بیندازید. اکنون می‌توانید متن درون شرخ را برگزینید. به یاد داشته باشید که در حالت گزینش، ممکن است صفحه چشمک زده و پیوندها قابل کلیک نباشند. هنوز شاخهٔ بارگیری‌ای تنظیم نشده. اکنون شاخهٔ بارگیری پیش‌گزیده را برگزینید برای ذخیرهٔ هر بارگیری از شما پرسیده خواهد شد از اندروید ۱۰، تنها «چارچوب دسترسی ذخیره» پشتیبانی می‌شود نتوانست خوراک را برای «%s» بار کند. - حساب این نگارنده نابود شده است. -\nنیوپایپ قادر به بار کردن این خوراک در آینده نیست. -\nمی‌خواهید اشتراک این کانال را لغو کنید؟ + حساب این نگارنده نابود شده است. \nنیوپایپ قادر به بار کردن این خوراک در آینده نیست. \nمی‌خواهید اشتراک این کانال را لغو کنید؟ حالت خوراک سریع، اطَلاعات بیش‌تری در این باره نمی‌دهد. پیش‌نمایش بندانگشتی نوار جویش قلب‌شده به دست ایجادگر @@ -650,14 +615,12 @@ فروپاشی پخش‌کننده نمایش یک گزینهٔ فروپاشی هنگام استفاده از پخش کننده نمایش «فروپاشی پخش کننده» - مدیر پروندهٔ مناسبی برای این کنش یافت نشد. -\nلطفاً مدیر پرونده‌ای نصب کرده یا در تنظیمات بارگیری، «%s» را خاموش کنید + مدیر پروندهٔ مناسبی برای این کنش یافت نشد. \nلطفاً مدیر پرونده‌ای نصب کرده یا در تنظیمات بارگیری، «%s» را خاموش کنید آگاهی گزارش خطا آگاهی برای گزارش‌خطاها نمایش یک نوار خطا ایجاد یک آگاهی خطا - مدیر پروندهٔ مناسبی برای این کنش یافت نشد. -\nلطفاً مدیر پرونده‌ای سازگار با چارچوب‌دسترسی ذخیره‌ساز نصب کنید + مدیر پروندهٔ مناسبی برای این کنش یافت نشد. \nلطفاً مدیر پرونده‌ای سازگار با چارچوب‌دسترسی ذخیره‌ساز نصب کنید نیوپایپ به خطایی برخورد. برای گزارش، بزنید خطایی رخ داد. آگاهی را ببینید نظر سنجاق شده @@ -774,7 +737,7 @@ برای نمونه اگر از گوشی‌ای با دکمه‌های خراب استفاده می‌کنید مفید است بازنشانی همهٔ تنظیمات همهٔ تنظیمات ترجیحیتان را دور اندعخته و کاره را دوباره آغاز می‌کند.\n\nمطمئنید که می‌خواهید ادامه دهید؟ استفاده از ویژگی پشتیبان کدگشای اگزوپلیر - زبانه‌های نشان داده شده روی صفحه‌های کانال + زبانه‌های نشان داده شده روی صفحه‌های کانال تغییر جهت صفحه بار نکردن تصویرها هم‌رسانی سیاههٔ نشانی @@ -784,14 +747,14 @@ استفادهٔ همیشگی از دور زدن تنظیمات سطح خروجی ویدیوی اگزوپلیر موقعیت زبانه‌های اصلی واکشی زبانه‌های کانال - گزینش قطعهٔ صوتی برای پخش کننده‌های خارجی + گزینش قطعهٔ صوتی برای پخش کننده‌های خارجی %s پاسخ %s پاسخ هم‌رسانی با عنوان‌ها گزینش قطعهٔ صوتی با شرح برای افزار کم‌بینا در صورت وجود - ترجیح صدای شرح دهنده + ترجیح صدای شرح دهنده گزینش کنش ژست نیمهٔ راست صفحه تعداد %d بار تکرار شده چهرک‌های بارکننده @@ -802,7 +765,7 @@ این روش دور زدن مشکل به جای تنظیم مستقیم سطح روی رمزینه، آن‌ها را هنگام تغییر سطح آزاد کرده و دوباره راه‌اندازی می‌کند. این تنظیم که از پیش روی برخی افزاره‌ها به دست اگزوپلیر استفاده می‌شد فقط روی اندروید ۶ و بالاتر تأثیر دارد\n\nبه کار انداختن این گزینه می‌تواند از خطاهای پخش هنگام تغییر پخش‌کنندهٔ ویدیوی کنونی یا تغییر به حالت تمام‌صفحه جلوگیری کند مدیریت برخی تنظیمات اگزوپلیر. اعمال این تغییرات نیازمند آغاز دوبارهٔ پخش‌کننده است سیاهه‌های پخشی که خاکستری شده‌اند این مورد را از پیش دارند. - ویرایش هر کنش آگاهی زیر با زدن رویش. سه کنش نخست (پخش/مکث، پیشین و بعدی) به دست سامانه تنظیم شده و قابل سفارشی سازی نیستند. + ویرایش هر کنش آگاهی زیر با زدن رویش. سه کنش نخست (پخش/مکث، پیشین و بعدی) به دست سامانه تنظیم شده و قابل سفارشی سازی نیستند. گزینش کنش ژست نیمهٔ چپ صفحه گزینش قطعهٔ صوتی اصلی فارغ از زبان نیوپایپ می‌تواند گه‌گاه به صورت خودکار نگارش‌های جدید را بررسی کرده و از وجودشان آگاهتان کند.\nمی‌خواهید به کارش بیندازید؟ @@ -838,16 +801,16 @@ ۵۰ صفحهٔ برتر سوندکلود برداشته شد «اجازهٔ نمایش روی دیگر کاره‌ها» - برون ریختن %d اشتراک… - برون ریختن %d اشتراک… + برون ریختن %d اشتراک… + برون ریختن %d اشتراک… بار کردن %d اشتراک… بار کردن %d اشتراک… - درون ریختن %d اشتراک… - درون ریختن %d اشتراک… + درون ریختن %d اشتراک… + درون ریختن %d اشتراک… حساب از بین رفت\n\n‫%1$s این دلیل را گفته: %2$s درون‌ریزی اشتراک‌ها از برون‌ریزی پیشین ‪.json‬ @@ -859,4 +822,6 @@ دوره‌ها سوندکلود جدول ۵۰ اثر برتر اصلی را متوقّف کرد. زبانهٔ متناظر از صفحهٔ اصلیتان برداشته شد. یوتوب از تاریخ ۳ مرداد ۱۴۰۴، صفحهٔ داغ‌های ترکیبی را متوقّف کرده است. نیوپایپ صفحهٔ داغ پیش‌گزیده را با پخش زنده‌های داغ جایگزین کرده است.\n\nهمچنین می‌توانید صفحات داغ مختلف را در «تنظیمات > محتوا > محتوای صفحه اصلی» بگزینید. + هنگام پخش کردن از کارساز خطای ۴۰۳ گرفته شد. احتمالاً به خاطر مشکلات رفع ابهام نشانی جریان یا انسداد آی‌پی + هنگام پخش کردن از کارساز خطای ۴۰۳ گرفته شد. احتمالاً به خاطر انقضای نشانی جریان یا انسداد آی‌پی diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index f5736c949..b104504f9 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -2,7 +2,7 @@ Aloita napauttamalla suurennuslasia. Julkaistu %1$s - Ei löytynyt suoratoistosoitinta. Asennetaanko VLC\? + Ei löytynyt suoratoistosoitinta. Asennetaanko VLC? Asenna Peruuta Avaa selaimessa @@ -11,7 +11,7 @@ Lataus Hae Asetukset - Tarkoititko ”%1$s”\? + Tarkoititko ”%1$s”? Jaa Käytä ulkoista videosoitinta Ääni saattaa lakata toimimasta joillakin resoluutioilla @@ -36,7 +36,7 @@ Näytä korkeammat resoluutiot Vain jotkin laitteet voivat toistaa 2K/4K-videota Toista Kodissa - Asennetaanko puuttuva Kore-sovellus\? + Asennetaanko puuttuva Kore-sovellus? Näytä ”Toista Kodissa”-vaihtoehto Näyttää vaihtoehdon videon toistamiseen Kodi-mediasoittimessa Ääni @@ -130,8 +130,7 @@ Odota… Kopioitu leikepöydälle Määritä latauskansio myöhemmin asetuksissa - Tämä käyttöoikeus tarvitaan -\nponnahdusikkunatilan käyttämiseksi + Tämä käyttöoikeus tarvitaan \nponnahdusikkunatilan käyttämiseksi reCAPTCHA Haaste reCAPTCHA-haaste pyydetty Lataukset @@ -215,11 +214,11 @@ Vie historia, tilaukset, soittolistat ja asetukset Poista katseluhistoria Poistaa toistohistorian ja toistokohdat - Poista koko katseluhistoria\? + Poista koko katseluhistoria? Katseluhistoria poistettu Poista hakuhistoria Poistaa historian haetuista videoista - Poista koko hakuhistoria\? + Poista koko hakuhistoria? Hakuhistoria poistettu Ulkoiset soittimet eivät tue tämänkaltaisia linkkejä Suoratoistovideoita ei löytynyt @@ -265,7 +264,7 @@ Aseta soittolistan kuvakkeeksi Tallenna soittolista kirjanmerkkeihin Poista kirjanmerkki - Poistetaanko tämä soittolista\? + Poistetaanko tämä soittolista? Soittolista luotu Lisätty soittolistaan Soittolistan kuvake muutettu. @@ -288,25 +287,10 @@ Edellinen vienti Tilauksia ei voitu tuoda Tilauksia ei voitu viedä - Tuo YouTube-tilaukset Google Takeoutista: -\n -\n1. Mene osoitteeseen: %1$s -\n2. Kirjaudu sisään pyydettäessä -\n3. Klikkaa \"Kaikki Youtube-data valittuna\", sitten \"Poista kaikki valinnat\", sitten ainoastaan \"tilaukset\" ja klikkaa \"OK\" -\n4. Klikkaa \"Seuraava vaihe\" ja \"Luo vienti\" -\n5. Klikkaa \"Lataa\"-painiketta tämän ilmestyessä -\n6. Klikkaa TUO TIEDOSTO alhaalta ja valitse ladattu .zip-tiedosto -\n7. [Jos zip-tiedoston tuonti epäonnistuu] Pura .csv-tiedosto (yleensä sijainnissa \"Youtube ja Youtube Musiikki/tilaukset/tilaukset.csv\") ja klikkaa TUO TIEDOSTO alhaalta ja valitse purettu csv-tiedosto - Tuo SoundCloud-profiili kirjoittamalla joko osoite tai ID:si: -\n -\n1. Laita päälle työpöytämoodi selaimessasi (tai käytä tietokonetta, tämä sivu ei toimi mobiilisivuna) -\n2. Mene tähän osoitteeseen: %1$s -\n3. Kirjaudu sisään kysyttäessä. -\n4. Kopioi se nettiosoite johon sinut ohjattiin. + Tuo YouTube-tilaukset Google Takeoutista: \n \n1. Mene osoitteeseen: %1$s \n2. Kirjaudu sisään pyydettäessä \n3. Klikkaa \"Kaikki Youtube-data valittuna\", sitten \"Poista kaikki valinnat\", sitten ainoastaan \"tilaukset\" ja klikkaa \"OK\" \n4. Klikkaa \"Seuraava vaihe\" ja \"Luo vienti\" \n5. Klikkaa \"Lataa\"-painiketta tämän ilmestyessä \n6. Klikkaa TUO TIEDOSTO alhaalta ja valitse ladattu .zip-tiedosto \n7. [Jos zip-tiedoston tuonti epäonnistuu] Pura .csv-tiedosto (yleensä sijainnissa \"Youtube ja Youtube Musiikki/tilaukset/tilaukset.csv\") ja klikkaa TUO TIEDOSTO alhaalta ja valitse purettu csv-tiedosto + Tuo SoundCloud-profiili kirjoittamalla joko osoite tai ID:si: \n \n1. Laita päälle työpöytämoodi selaimessasi (tai käytä tietokonetta, tämä sivu ei toimi mobiilisivuna) \n2. Mene tähän osoitteeseen: %1$s \n3. Kirjaudu sisään kysyttäessä. \n4. Kopioi se nettiosoite johon sinut ohjattiin. sinun käyttäjänimesi, soundcloud.com/<sinun käyttäjänimesi> - Ota huomioon että tämä operaatio voi käyttää paljon dataa. -\n -\nHaluatko jatkaa\? + Ota huomioon että tämä operaatio voi käyttää paljon dataa. \n \nHaluatko jatkaa? Toistonopeuden säätimet Nopeus Sävelkorkeus @@ -314,8 +298,7 @@ Kelaa eteenpäin hiljaisissa kohdissa Askel Nollaa - Noudattaaksemme EU:n yleistä tietosuoja-asetusta (GDPR), meidän pitää muistuttaa sinua lukemaan NewPipen tietosuojakäytäntö. Lue se tarkkaan. -\nSinun pitää myös hyväksyä se, jotta voit lähettää virheraportin. + Noudattaaksemme EU:n yleistä tietosuoja-asetusta (GDPR), meidän pitää muistuttaa sinua lukemaan NewPipen tietosuojakäytäntö. Lue se tarkkaan. \nSinun pitää myös hyväksyä se, jotta voit lähettää virheraportin. Hyväksy Hylkää Ei rajaa @@ -352,11 +335,11 @@ Tilaajien lukumäärä ei saatavilla Kytke palvelu, tällä hetkellä valittuna: Myönnä käyttöoikeus näyttää muiden sovellusten päällä - Haluatko palauttaa oletusarvot\? + Haluatko palauttaa oletusarvot? Palauta oletusarvot Ei voitu lukea talletettuja välilehtiä, joten käytetään oletusvälilehtiä Tiedosto siirretty tai poistettu - Lataaminen ulkoiselle SD-kortille ei ole mahdollista. Nollataanko latauskansion sijainti\? + Lataaminen ulkoiselle SD-kortille ei ole mahdollista. Nollataanko latauskansion sijainti? Ulkoinen tallennustila ei käytettävissä Ilmoitukset uusista NewPipe-versioista Sovelluspäivitysilmoitus @@ -366,9 +349,7 @@ Kappaleet Tapahtumat Videot - Tämä video on ikärajoitettu. -\n -\nSalli ”%1$s” asetuksissa katsoaksesi. + Tämä video on ikärajoitettu. \n \nSalli ”%1$s” asetuksissa katsoaksesi. Ota käyttöön YouTuben ”Rajoitettu tila” Päivitykset Instanssi on jo olemassa @@ -385,7 +366,7 @@ Palvelujen alkuperäiset tekstit näkyvät suoratoistettavassa sisällössä Poista käytöstä piilottaaksesi kommentit Toistokohdat poistettu - Poistetaanko kaikki toistokohdat\? + Poistetaanko kaikki toistokohdat? Poistaa kaikki toistokohdat Poista toistokohdat Näytä toistokohtien osoittimet listoissa @@ -398,27 +379,15 @@ Tyhjennä lataushistoria Sulje Poista ladatut tiedostot - Haluatko tyhjentää lataushistoriasi vai poistaa kaikki ladatut tiedostot\? + Haluatko tyhjentää lataushistoriasi vai poistaa kaikki ladatut tiedostot? Ei kommentteja Näytä kommentit Kanavan hahmokuvake Kenen toimesta: %s - Onko syötteen lataaminen mielestäsi liian hidas\? Voit koittaa ottaa käyttöön nopean lataamisen (voit vaihtaa sen asetuksista tai painamalla alla olevaa painiketta). -\n -\nNewPipe tarjoaa kaksi tapaa ladata syöte: -\n• Koko tilatun kanavan lataaminen, mikä on hidasta, mutta lataa syötteen kokonaisuudessaan. -\n• Erityisen palvelu-endpointin käyttö, mikä on nopeaa, mutta yleensä ei lataa syötettä kokonaisuudessaan. -\n -\nNäiden kahden välinen ero on, että nopean tavan lataamista tiedoista yleensä puuttuu esim. sisällön kesto tai tyyppi (ei voi erotella livevideoita ja tavallisia) tai se ei lataa kaikkea sisältöä. -\n -\nYouTube on esimerkki palvelusta, joka tarjoaa nopean tavan RSS-syötteen avulla. -\n -\nValinta riippuu siitä, mitä halutaan: nopeutta vai tarkkoja tietoja. + Onko syötteen lataaminen mielestäsi liian hidas? Voit koittaa ottaa käyttöön nopean lataamisen (voit vaihtaa sen asetuksista tai painamalla alla olevaa painiketta). \n \nNewPipe tarjoaa kaksi tapaa ladata syöte: \n• Koko tilatun kanavan lataaminen, mikä on hidasta, mutta lataa syötteen kokonaisuudessaan. \n• Erityisen palvelu-endpointin käyttö, mikä on nopeaa, mutta yleensä ei lataa syötettä kokonaisuudessaan. \n \nNäiden kahden välinen ero on, että nopean tavan lataamista tiedoista yleensä puuttuu esim. sisällön kesto tai tyyppi (ei voi erotella livevideoita ja tavallisia) tai se ei lataa kaikkea sisältöä. \n \nYouTube on esimerkki palvelusta, joka tarjoaa nopean tavan RSS-syötteen avulla. \n \nValinta riippuu siitä, mitä halutaan: nopeutta vai tarkkoja tietoja. Oletuskioski %s:n luoma - NewPipe ei vielä tue tätä sisältöä. -\n -\nToivottavasti sitä tuetaan myöhemmässä versiossa. + NewPipe ei vielä tue tätä sisältöä. \n \nToivottavasti sitä tuetaan myöhemmässä versiossa. Poista nopea tila käytöstä Ota nopea tila käyttöön Saatavilla joissakin palveluissa, on yleensä paljon nopeampi, mutta voi palauttaa rajallisen määrän sisältöä ja usein epätäydelliset tiedot (esim. ei kestoa, ei sisällön tyyppiä, ei livestatusta) @@ -428,7 +397,7 @@ Syötteen päivitysväli Syöte Uusi - Haluatko poistaa tämän ryhmän\? + Haluatko poistaa tämän ryhmän? Tyhjä ryhmän nimi %d valittu @@ -464,8 +433,7 @@ Valitse instanssi \'Storage Access Framework\' sallii lataukset ulkoiselle SD-kortille Ota SAF käyttöön - Jokaisen latauksen kohde kysytään. -\nSalli SAF, jos haluat tallentaa ulkoiselle SD-kortille + Jokaisen latauksen kohde kysytään. \nSalli SAF, jos haluat tallentaa ulkoiselle SD-kortille Kysy mihin ladataan Aloita lataukset Salli vain yksi lataus kerrallaan @@ -528,7 +496,7 @@ Vain Wi-Fi-verkossa Aloita toisto automaattisesti — %s Toistojono - Ei tunnistettu URL:ää. Avataanko toisessa sovelluksessa\? + Ei tunnistettu URL:ää. Avataanko toisessa sovelluksessa? Automaattinen jonoon lisääminen Aktiivisen soittimen jono korvataan Soittimesta toiseen vaihtaminen saattaa korvata jonosi @@ -585,8 +553,7 @@ Ratkaise Ilmoitukset videon hajautuksen etenemisestä Videon hajautusilmoitus - Tämä video on ikärajoitettu. -\nYouTuben uusien ikärajoitusperiaatteiden mukaisesti NewPipella ei ole pääsyä videoon eikä sitä voida toistaa. + Tämä video on ikärajoitettu. \nYouTuben uusien ikärajoitusperiaatteiden mukaisesti NewPipella ei ole pääsyä videoon eikä sitä voida toistaa. Yöteema Poista käytöstä tekstinvalinta kuvauskentän sisältä Voit nyt valita tekstin kuvauskentän sisältä. Huomioithan, että valintatilan aikana sivu voi vilkkua ja linkit eivät ehkä ole klikattavia. @@ -614,9 +581,7 @@ Kategoria Salli tekstin valinta kuvauksessa Tili suljettu - Tekijän käyttäjätili on suljettu. -\nNewPipe ei pysty lataamaan tätä syötettä tulevaisuudessa. -\nHaluatko poistaa kanavan tilauksesta\? + Tekijän käyttäjätili on suljettu. \nNewPipe ei pysty lataamaan tätä syötettä tulevaisuudessa. \nHaluatko poistaa kanavan tilauksesta? Ei voitu ladata syötettä hakusanalle \'%s\'. Virhe syötteen lataamisessa Sinulta kysytään joka kerta, minne tiedosto ladataan @@ -655,10 +620,8 @@ LeakCanary ei ole saatavilla Näytä \"Kaada soitin\" Kaada soitin - Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa. -\nAsenna tiedostonhallintaohjelma, joka on yhteensopiva Storage Access Frameworkin kanssa. - Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa. -\nAsenna tiedostonhallintaohjelma tai kokeile asettaa \'%s\' pois käytöstä latausasetuksista + Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa. \nAsenna tiedostonhallintaohjelma, joka on yhteensopiva Storage Access Frameworkin kanssa. + Toiminnolle ei löytynyt sopivaa tiedostonhallintaohjelmaa. \nAsenna tiedostonhallintaohjelma tai kokeile asettaa \'%s\' pois käytöstä latausasetuksista Näytä soitinta käytettäessä soittimen kaatamisen vaihtoehto Näytä virheen ponnahdusilmoitus Uudet syötteet @@ -697,7 +660,7 @@ Tuntematon Ilmoitukset uusista streameista Mitä välilehtiä kanavasivuilla näytetään - Poistetaanko kaksoiskappaleet\? + Poistetaanko kaksoiskappaleet? Näytä/piilota streamit Jaa URL-luettelo @@ -749,7 +712,7 @@ Ulkoisille soittimille ei ole saatavilla äänistreameja Kelaa taaksepäin Noudettavat välilehdet syötettä päivitettäessä. Tällä valinnalla ei ole vaikutusta, jos kanava päivitetään käyttämällä nopeaa tilaa. - Poistetaanko kaikki ladatut tiedostot levyltä\? + Poistetaanko kaikki ladatut tiedostot levyltä? Keskilaatu Lataajan avatarit Prosentti @@ -780,7 +743,7 @@ Olet nyt tilannut tämän kanavan Edellinen stream Live - Haluatko poistaa kaikki ylimääräiset identtiset suoratoistot tästä soittolistasta\? + Haluatko poistaa kaikki ylimääräiset identtiset suoratoistot tästä soittolistasta? Suoratoistot, joita lataaja ei vielä tue, ei näytetä %s vastaus @@ -791,14 +754,11 @@ Kanavan välilehdet Kyllä Ei - Kaikkien asetusten nollaaminen hävittää kaikki valitsemasi asetukset ja käynnistää sovelluksen uudelleen. -\n -\nOletko varma, että haluat jatkaa? + Kaikkien asetusten nollaaminen hävittää kaikki valitsemasi asetukset ja käynnistää sovelluksen uudelleen. \n \nOletko varma, että haluat jatkaa? Varmuuskopiointi ja palauttaminen Nollaa asetukset Palauta kaikki asetukset oletusarvoihin - NewPipe voi automaattisesti tarkistaa päivitysten saatavuuden silloin tällöin ja ilmoittaa kun niitä on saatavilla. -\nHaluatko ottaa tämän käyttöön? + NewPipe voi automaattisesti tarkistaa päivitysten saatavuuden silloin tällöin ja ilmoittaa kun niitä on saatavilla. \nHaluatko ottaa tämän käyttöön? Laitteella ei ole riittävästi vapaata tilaa Jaa tilapäisenä YouTube-soittolistana Raidat diff --git a/app/src/main/res/values-fil/strings.xml b/app/src/main/res/values-fil/strings.xml index abb13644a..1f5a8881c 100644 --- a/app/src/main/res/values-fil/strings.xml +++ b/app/src/main/res/values-fil/strings.xml @@ -2,7 +2,7 @@ Pindutin ang magnifying glass para magsimula. Inilathala noong %1$s - Walang nakitang stream player. I-install ang VLC\? + Walang nakitang stream player. I-install ang VLC? Walang nakitang stream player (pwede mong i-install ang VLC para ma-play ito). I-install Kanselahin @@ -13,7 +13,7 @@ I-download ang stream file Maghanap Mga Setting - \"%1$s\" ba ang tinutukoy mo\? + \"%1$s\" ba ang tinutukoy mo? Ibahagi sa Gumamit ng ibang video player Nawawala ang tunog sa ilang resolusyon @@ -97,7 +97,7 @@ Tandaan ang mga property ng popup Panimulang linaw ng popup Mape-play lang ng ilang device ang mga video na 2K/4K - I-install ang nawawalang Kode app\? + I-install ang nawawalang Kode app? I-scale ang thumbnail sa 1:1 aspect ratio I-scale ang thumbnail ng video sa abiso mula 16:9 papuntang 1:1 aspect ratio (pwedeng magkaroon ng distortion) Unang action button @@ -122,8 +122,7 @@ Naka-bukas Wika ng App Tungkol dito - Ang video na ito ay may paghihigpit sa edad. -\nDahil sa mga bagong polisiya ng Youtube, hindi maaring ma-access ng NewPipe ang mga video streams nito, kaya hindi ito maipapalabas. + Ang video na ito ay may paghihigpit sa edad. \nDahil sa mga bagong polisiya ng Youtube, hindi maaring ma-access ng NewPipe ang mga video streams nito, kaya hindi ito maipapalabas. Notipikasyon sa NewPipe %s nakikinig @@ -141,7 +140,7 @@ Laman ng pangunahing pahina Live Palagi - Gusto mo bang burahin ito sa kasaysayan ng paghanap\? + Gusto mo bang burahin ito sa kasaysayan ng paghanap? Laman %d oras @@ -217,11 +216,9 @@ Huwag buksan ang mga video sa mini player at dumiretso na sa fullscreen mode kung naka-lock ang awto rotasyon. Magagamit mo pa rin ang mini player kung aalis ka sa fullscreen Ipakita ang tip ng \"I-hold para ipila\" Ipakita ang tip tuwing pinpindot ang background o ang buttong pumapop-up sa video na \"Details:\" - Hindi makilala ang URL. Buksan sa ibang app\? + Hindi makilala ang URL. Buksan sa ibang app? Mga instansya ng PeerTube - Ang video na ito ay may paghihigpit sa edad. -\n -\nBuksan ang \"%1$s\" sa ayos ng app kung gusto mong makita ito. + Ang video na ito ay may paghihigpit sa edad. \n \nBuksan ang \"%1$s\" sa ayos ng app kung gusto mong makita ito. Magdagdag ng mga instansya Hindi maberipika ang instansya Naidagdag na ang instansyang iyan diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 6d49fa2f7..932377d36 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -2,14 +2,14 @@ Annuler Résolution par défaut - Vouliez-vous dire « %1$s » \? + Vouliez-vous dire « %1$s » ? Télécharger Dossier de téléchargement vidéo Choisissez le dossier de téléchargement pour les fichiers vidéos Les vidéos téléchargées sont stockées ici Installer - Installer l’application Kore manquante \? - Aucun lecteur de flux trouvé. Installer VLC \? + Installer l’application Kore manquante ? + Aucun lecteur de flux trouvé. Installer VLC ? Ouvrir dans le navigateur Lire avec Kodi Chercher @@ -17,12 +17,12 @@ Partager Partager avec Afficher une option pour lire une vidéo via Kodi - Afficher l’option « Lire avec Kodi » + Afficher l’option « Lire avec Kodi » Publiée le %1$s Audio Format audio par défaut Télécharger - Afficher les vidéos « Suivantes » et « Similaires » + Afficher les vidéos « Suivantes » et « Similaires » URL non pris en charge Vidéo et audio Lecture vidéo, durée : @@ -53,10 +53,10 @@ Impossible de charger toutes les miniatures Désolé, cela n’aurait pas dû se produire. Signaler par courriel - Information : - Ce qui s’est passé : - Votre commentaire (en anglais) : - Détails : + Information : + Ce qui s’est passé : + Votre commentaire (en anglais) : + Détails : Vidéo Audio Réessayer @@ -86,9 +86,8 @@ Ouvrir en mode flottant Lecture en mode flottant Désactivés - Quoi :\nRequest :\nContent Language :\nContent Country :\nApp Language :\nService :\nGMT Time :\nPackage :\nVersion :\nOS version : - Cette autorisation est nécessaire pour -\nutiliser le mode flottant + Quoi :\nRequest :\nContent Language :\nContent Country :\nApp Language :\nService :\nGMT Time :\nPackage :\nVersion :\nOS version : + Cette autorisation est nécessaire pour \nutiliser le mode flottant Arrière-plan Flottant Résolution par défaut du pop-up @@ -118,7 +117,7 @@ Lettres et chiffres À propos de NewPipe © %1$s par %2$s sous %3$s - Que vous ayez des idées concernant la traduction, des modifications de conception, le nettoyage du code ou des modifications techniques importantes, votre aide est toujours la bienvenue. Plus on y met du nôtre, meilleurs sont les résultats ! + Que vous ayez des idées concernant la traduction, des modifications de conception, le nettoyage du code ou des modifications techniques importantes, votre aide est toujours la bienvenue. Plus on y met du nôtre, meilleurs sont les résultats ! Impossible de modifier l’abonnement Impossible d’actualiser l’abonnement Continuer la lecture après les interruptions (ex. : appels téléphoniques) @@ -159,7 +158,7 @@ %s vidéos Caractères spéciaux - Voulez-vous supprimer cet élément de l’historique de recherche \? + Voulez-vous supprimer cet élément de l’historique de recherche ? Contenu de la page principale Page blanche Chaîne @@ -174,7 +173,7 @@ Retirer Détails Paramètres audios - Afficher l\'astuce « Maintenir pour ajouter à la file » + Afficher l\'astuce « Maintenir pour ajouter à la file » Affiche l’astuce lors de l’appui des boutons « Arrière-plan » ou « Flottant » sur la page de détails d’une vidéo [Inconnu] Récupération depuis l’erreur du lecteur @@ -212,7 +211,7 @@ Exporté Importé Fichier ZIP non valide - Avertissement : impossible d’importer tous les fichiers. + Avertissement : impossible d’importer tous les fichiers. Cela effacera vos paramètres actuels. Afficher les infos Playlists enregistrées @@ -231,7 +230,7 @@ Définir comme miniature de la liste de lecture Enregistrer la liste de lecture Supprimer le signet - Voulez-vous supprimer cette liste de lecture ? + Voulez-vous supprimer cette liste de lecture ? Liste de lecture créée Ajouté à la liste de lecture Miniature de la liste de lecture changée. @@ -249,7 +248,7 @@ Aucun fichier ou contenu de ce type Le fichier n’existe pas ou n’est pas accessible en lecture ou en écriture Le nom du fichier ne peut pas être vide - Une erreur est survenue : %1$s + Une erreur est survenue : %1$s Télécharger le flux Ajouter le stream suivant automatiquement Continue la file de lecture (non répétitive) en ajoutant un flux lié @@ -268,25 +267,10 @@ Exportation précédente Impossible d’importer les abonnements Impossible d’exporter les abonnements - Importez vos abonnements YouTube depuis Google Takeout : -\n -\n1. Suivez ce lien : %1$s -\n2. Connectez-vous à votre compte -\n3. Cliquez sur « Toutes les données YouTube sont incluses », puis sur « Tout désélectionner », puis sélectionnez uniquement « abonnements » et cliquez sur « OK » -\n4. Cliquez sur « Étape suivante » et ensuite sur « Créer une exportation » -\n5. Cliquez sur le bouton « Télécharger » après qu’il soit apparut -\n6.Cliquez sur IMPORTER LE FICHIER en dessous et sélectionnez le fichier zip téléchargé -\n7. [Si l\'importation à échoué] Extrayez le fichier .csv (généralement sous « YouTube and YouTube Music/subscriptions/subscriptions.csv »), cliquez sur IMPORTER LE FICHIER en dessous et sélectionnez le ficher csv extrait - Veuillez importer un profil SoundCloud en saisissant l’URL de votre profil ou votre identifiant. -\n -\n1. Activez le « mode bureau » dans votre navigateur Web (le site n’est pas disponible pour les appareils mobiles). -\n2. Suivez ce lien : %1$s. -\n3. Connectez-vous à votre compte. -\n4. Copiez le lien du profil vers lequel vous venez d’être redirigé. + Importez vos abonnements YouTube depuis Google Takeout : \n \n1. Suivez ce lien : %1$s \n2. Connectez-vous à votre compte \n3. Cliquez sur « Toutes les données YouTube sont incluses », puis sur « Tout désélectionner », puis sélectionnez uniquement « abonnements » et cliquez sur « OK » \n4. Cliquez sur « Étape suivante » et ensuite sur « Créer une exportation » \n5. Cliquez sur le bouton « Télécharger » après qu’il soit apparut \n6.Cliquez sur IMPORTER LE FICHIER en dessous et sélectionnez le fichier zip téléchargé \n7. [Si l\'importation à échoué] Extrayez le fichier .csv (généralement sous « YouTube and YouTube Music/subscriptions/subscriptions.csv »), cliquez sur IMPORTER LE FICHIER en dessous et sélectionnez le ficher csv extrait + Veuillez importer un profil SoundCloud en saisissant l’URL de votre profil ou votre identifiant. \n \n1. Activez le « mode bureau » dans votre navigateur Web (le site n’est pas disponible pour les appareils mobiles). \n2. Suivez ce lien : %1$s. \n3. Connectez-vous à votre compte. \n4. Copiez le lien du profil vers lequel vous venez d’être redirigé. votre identifiant, soundcloud.com/votreidentifiant - Cette opération peut charger énormément la connexion réseau. -\n -\nVoulez-vous continuer \? + Cette opération peut charger énormément la connexion réseau. \n \nVoulez-vous continuer ? Contrôles de vitesse de lecture Cadence Détacher (peut causer des déformations) @@ -298,23 +282,21 @@ Ton Effacer 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 \? + Voulez-vous supprimer entièrement l’historique des vues ? Historique des vues supprimé Supprimer l’historique de recherche Supprime l’historique des mots-clés de recherche - Voulez-vous supprimer entièrement l’historique de recherche \? + Voulez-vous supprimer entièrement l’historique de recherche ? Historique de recherche supprimé 1 élément supprimé. - NewPipe est un logiciel libre sous licence copyleft : vous pouvez l\'utiliser, l\'étudier, le partager et l\'améliorer à votre guise. Plus précisément, vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence publique générale GNU telle que publiée par la Free Software Foundation, soit la version 3 de la licence, soit (à votre choix) toute version ultérieure. + NewPipe est un logiciel libre sous licence copyleft : vous pouvez l\'utiliser, l\'étudier, le partager et l\'améliorer à votre guise. Plus précisément, vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence publique générale GNU telle que publiée par la Free Software Foundation, soit la version 3 de la licence, soit (à votre choix) toute version ultérieure. Politique de confidentialité de NewPipe Consultez notre politique de confidentialité - Voulez-vous également importer les paramètres \? + Voulez-vous également importer les paramètres ? Accepter Refuser - Le projet NewPipe prend votre vie privée très à cœur. Par conséquent, l’application n’envoie aucune donnée sans votre consentement. -\nLa politique de confidentialité de NewPipe explique en détail quelles données sont envoyées et stockées lorsque vous envoyez un rapport de plantage. - Afin de se conformer au Règlement Général sur la Protection des Données (RGPD), nous attirons ici votre attention sur la politique de confidentialité de NewPipe. Veuillez la lire attentivement. -\nVous devez l’accepter pour nous envoyer le rapport de bogue. + Le projet NewPipe prend votre vie privée très à cœur. Par conséquent, l’application n’envoie aucune donnée sans votre consentement. \nLa politique de confidentialité de NewPipe explique en détail quelles données sont envoyées et stockées lorsque vous envoyez un rapport de plantage. + Afin de se conformer au Règlement Général sur la Protection des Données (RGPD), nous attirons ici votre attention sur la politique de confidentialité de NewPipe. Veuillez la lire attentivement. \nVous devez l’accepter pour nous envoyer le rapport de bogue. Sans limite Résolution limite en utilisant les données mobiles Chaînes @@ -337,18 +319,18 @@ Notifications pour des nouvelles versions de NewPipe Stockage externe indisponible Restaurer les valeurs par défaut - Voulez-vous restaurer les valeurs par défaut \? + Voulez-vous restaurer les valeurs par défaut ? Compteur du nombre d’abonnés indisponible Arrêter Évènements - Impossible de télécharger dans la carte mémoire externe. Voulez-vous réinitialiser l’emplacement du dossier de téléchargement \? + Impossible de télécharger dans la carte mémoire externe. Voulez-vous réinitialiser l’emplacement du dossier de téléchargement ? Choisir quels onglets seront visibles sur la page principale Mises à jour Afficher une notification pour proposer une mise à jour de l’application lorsqu’une nouvelle version est disponible Liste Grille Auto - Une mise à jour de NewPipe est disponible ! + Une mise à jour de NewPipe est disponible ! Terminé En attente en pause @@ -378,7 +360,7 @@ Le post-traitement a échoué Nombre d’essais maximum Nombre d’essais maximum avant annulation du téléchargement - Impossible de lire les onglets enregistrés ; utilisation des onglets par défaut + Impossible de lire les onglets enregistrés ; utilisation des onglets par défaut Le serveur n’accepte pas les téléchargements multifils, veuillez réessayer avec @string/msg_threads = 1 Afficher les commentaires Désactiver pour masquer les commentaires @@ -394,24 +376,23 @@ NewPipe a été fermé alors qu’il travaillait sur le fichier Aucun espace disponible sur l’appareil Progression perdue car le fichier a été supprimé - Voulez-vous effacer l’historique de téléchargement ou supprimer tous les fichiers téléchargés \? + Voulez-vous effacer l’historique de téléchargement ou supprimer tous les fichiers téléchargés ? Limiter la file d’attente de téléchargement Un seul téléchargement aura lieu en même temps Démarrer les téléchargements Mettre les téléchargements en pause Demander où télécharger - Vous allez être interrogé·e sur l’emplacement d’enregistrement de chaque téléchargement. -\nAutorisez le sélecteur de dossier système si vous voulez télécharger vers une carte SD externe + Vous allez être interrogé·e sur l’emplacement d’enregistrement de chaque téléchargement. \nAutorisez le sélecteur de dossier système si vous voulez télécharger vers une carte SD 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 de lecture supprimées Utiliser le sélecteur de dossier système - L’« Infrastructure d’accès au stockage » permet le téléchargement sur une carte mémoire SD externe + L’« Infrastructure d’accès au stockage » permet le téléchargement sur une carte mémoire SD externe 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 \? - Basculer le service, actuellement sélectionné : + Voulez-vous supprimer toutes les positions de reprise de lecture ? + Basculer le service, actuellement sélectionné : Kiosque par défaut Personne ne regarde @@ -476,8 +457,8 @@ Nouveautés Groupes de chaînes - Dernière mise à jour du flux : %s - Pas chargés : %d + Dernière mise à jour du flux : %s + Pas chargés : %d Chargement du flux… Traitement du flux… Choisir les abonnements @@ -488,7 +469,7 @@ %d sélectionnés Nom de groupe vide - Voulez-vous supprimer ce groupe \? + Voulez-vous supprimer ce groupe ? Nouveau Flux Seuil de mise à jour du flux @@ -498,32 +479,18 @@ Disponible dans certains services, c’est généralement beaucoup plus rapide mais cela peut renvoyer un nombre limité d’éléments et souvent avec des informations incomplètes (p. ex. aucune durée, de type d’élément ou de statut en direct) Activer le mode rapide Désactiver le mode rapide - Pensez-vous que le chargement du flux est trop lent \? Si c’est le cas, essayez le chargement rapide (vous pouvez le modifier dans les paramètres ou en pressant le bouton ci-dessous). -\n -\nNewPipe propose deux stratégies de chargement de flux : -\n• Récupérer la totalité de la chaîne d’abonnement, ce qui est lent mais complet. -\n• Utiliser un service dédié, ce qui est rapide mais souvent incomplet. -\n -\nLa différence entre les deux est que la méthode rapide manque souvent de quelques informations, comme la durée d’un élément ou le type (pas de distinction possible entre les vidéos en direct et les autres), et elle pourrait retourner moins d’éléments. -\n -\nYouTube est un exemple de service qui offre une méthode rapide avec son flux RSS. -\n -\nDonc le choix se résume à ce que vous préférez : la rapidité ou des informations précises. - Ce contenu n’est pas encore pris en charge par NewPipe. -\n -\nNous espérons qu’il le sera dans une future version. + Pensez-vous que le chargement du flux est trop lent ? Si c’est le cas, essayez le chargement rapide (vous pouvez le modifier dans les paramètres ou en pressant le bouton ci-dessous). \n \nNewPipe propose deux stratégies de chargement de flux : \n• Récupérer la totalité de la chaîne d’abonnement, ce qui est lent mais complet. \n• Utiliser un service dédié, ce qui est rapide mais souvent incomplet. \n \nLa différence entre les deux est que la méthode rapide manque souvent de quelques informations, comme la durée d’un élément ou le type (pas de distinction possible entre les vidéos en direct et les autres), et elle pourrait retourner moins d’éléments. \n \nYouTube est un exemple de service qui offre une méthode rapide avec son flux RSS. \n \nDonc le choix se résume à ce que vous préférez : la rapidité ou des informations précises. + Ce contenu n’est pas encore pris en charge par NewPipe. \n \nNous espérons qu’il le sera dans une future version. Albums ∞ vidéos 100+ vidéos Artistes Chansons - Cette vidéo dispose d’une limite d’âge. -\n -\nActivez « %1$s » dans les paramètres si vous voulez la voir. + Cette vidéo dispose d’une limite d’âge. \n \nActivez « %1$s » dans les paramètres si vous voulez la voir. Supprimer les vidéos visionnées Oui ainsi que les vidéos partiellement visionnées - Les flux visionnés avant et après leur ajout à la playlist seront supprimés.\nÊtes-vous sûr ? - Supprimer les flux visionnés ? + Les flux visionnés avant et après leur ajout à la playlist seront supprimés.\nÊtes-vous sûr ? + Supprimer les flux visionnés ? Miniature de l\'avatar de la chaine De %s Créé par %s @@ -537,13 +504,13 @@ Veuillez vérifier si un ticket concernant votre problème existe déjà. Lorsque vous créez des tickets dupliqués, cela nous prend du temps que nous pourrions passer à résoudre effectivement le problème. Signaler sur GitHub Copier le rapport formaté - Affichage des résultats pour : %s + Affichage des résultats pour : %s Basculer d’un lecteur à un autre peut remplacer votre file de lecture Jamais Uniquement en Wi-Fi - Démarrer la lecture automatiquement — %s + Démarrer la lecture automatiquement — %s File de lecture - Impossible de reconnaitre l’URL fournie. Voulez-vous l’ouvrir avec une autre application \? + Impossible de reconnaitre l’URL fournie. Voulez-vous l’ouvrir avec une autre application ? Ajout auto. à la file La file de lecture du lecteur actif sera remplacée Confirmer avant de supprimer une file de lecture @@ -551,7 +518,7 @@ Chargement Lire aléatoirement Répéter - Vous pouvez sélectionner au maximum trois actions à faire figurer dans la notification compacte ! + Vous pouvez sélectionner au maximum trois actions à faire figurer dans la notification compacte ! Modifiez chaque action de notification ci-dessous en appuyant dessus. Sélectionnez jusqu’à trois d’entre elles pour les faire apparaître dans la notification compacte en utilisant les cases à cocher à droite. Cinquième bouton d’action Quatrième bouton d’action @@ -566,7 +533,7 @@ Effacer les cookies que NewPipe garde lorsque vous résolvez un reCAPTCHA Les cookies reCAPTCHA ont été effacés Effacer les cookies reCAPTCHA - YouTube dispose d’un « Mode restreint » qui cache le contenu potentiellement inapproprié + YouTube dispose d’un « Mode restreint » qui cache le contenu potentiellement inapproprié Affiche du contenu probablement inapproprié pour les enfants Coloriser la notification Demander à Android de personnaliser la couleur de la notification en fonction de la couleur principale de la miniature (noter que cela n’est pas disponible sur tous les appareils) @@ -592,8 +559,7 @@ Cette vidéo n’est disponible que pour les membres de YouTube Music Premium, elle ne peut donc pas être diffusée en continu ni téléchargée par NewPipe. Ce contenu est privé, il ne peut donc pas être diffusé en continu ni téléchargé par NewPipe. Ceci est une piste SoundCloud Go+, au moins dans votre pays, elle ne peut donc pas être diffusée ou téléchargée par NewPipe. - Cette vidéo est soumise à une limite d’âge. -\nEn raison des nouvelles politiques de YouTube concernant les vidéos soumises à une limite d’âge, NewPipe ne peut accéder à aucun de ses flux vidéo et ne peut donc pas les lire. + Cette vidéo est soumise à une limite d’âge. \nEn raison des nouvelles politiques de YouTube concernant les vidéos soumises à une limite d’âge, NewPipe ne peut accéder à aucun de ses flux vidéo et ne peut donc pas les lire. Radio Présentés Résoudre @@ -628,10 +594,8 @@ Désactivé Activé Mode tablette - Le compte de l’auteur a été résilié. -\nNewPipe ne sera plus en mesure de charger ce flux à l’avenir. -\nSouhaitez-vous vous désabonner de cette chaîne \? - À partir d’Android 10, seule « l’Infrastructure d’accès au stockage  » est prise en charge + Le compte de l’auteur a été résilié. \nNewPipe ne sera plus en mesure de charger ce flux à l’avenir. \nSouhaitez-vous vous désabonner de cette chaîne ? + À partir d’Android 10, seule « l’Infrastructure d’accès au stockage » est prise en charge Le mode flux rapide ne fournit pas plus d’info à ce sujet. Les commentaires sont désactivés Ne pas afficher @@ -670,11 +634,9 @@ NewPipe a rencontré une erreur, appuyez pour la signaler Une erreur s\'est produite, voir la notification Créer une notification d\'erreur - Aucun gestionnaire de fichiers approprié n\'a été trouvé pour cette action. -\nVeuillez installer un gestionnaire de fichiers compatible avec l\'Infrastructure d\'accès au stockage + Aucun gestionnaire de fichiers approprié n\'a été trouvé pour cette action. \nVeuillez installer un gestionnaire de fichiers compatible avec l\'Infrastructure d\'accès au stockage Afficher une barre d’erreur - Aucun gestionnaire de fichiers approprié n\'a été trouvé pour cette action. -\nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver « %s » dans les paramètres de téléchargement + Aucun gestionnaire de fichiers approprié n\'a été trouvé pour cette action. \nVeuillez installer un gestionnaire de fichiers ou essayez de désactiver « %s » dans les paramètres de téléchargement Commentaire épinglé LeakCanary n\'est pas disponible Valeur par défaut d’ExoPlayer @@ -693,7 +655,7 @@ Vous vous êtes maintenant abonné à cette chaîne Notification du Lecteur Notifications pour de nouveaux flux des abonnements - Supprimer tous les fichiers téléchargés du disque \? + Supprimer tous les fichiers téléchargés du disque ? Exécuter la vérification de nouveaux flux Notifications pour de nouveaux flux N\'importe quel réseau @@ -713,7 +675,7 @@ Taille de l\'intervalle de chargement de la lecture Foire aux questions Consulter sur le site web - Si vous rencontrez des difficultés avec l\'application, n\'hésitez pas à consulter ces réponses aux questions fréquentes ! + Si vous rencontrez des difficultés avec l\'application, n\'hésitez pas à consulter ces réponses aux questions fréquentes ! Trier Mode rapide Importer ou exporter des abonnements à partir du menu @@ -725,8 +687,8 @@ Carte Utile si, par exemple, vous utilisez un casque avec des boutons dysfonctionnels Effacer les doublons - Effacer les doublons \? - Voulez-vous retirer tous les doublons de cette liste \? + Effacer les doublons ? + Voulez-vous retirer tous les doublons de cette liste ? Afficher les flux suivants Entièrement vu Partiellement vu @@ -758,9 +720,7 @@ original doublée descriptif - Cette solution de contournement libère et ré-instancie les codecs vidéo lorsqu\'un changement de surface se produit, au lieu de définir la surface du codec directement. Déjà utilisé par ExoPlayer sur certains appareils présentant ce problème, ce paramètre n\'a d\'effet que sur Android 6 et les versions ultérieures. -\n -\nL\'activation de cette option peut éviter les erreurs de lecture lors du changement de lecteur vidéo ou du passage en mode plein écran + Cette solution de contournement libère et ré-instancie les codecs vidéo lorsqu\'un changement de surface se produit, au lieu de définir la surface du codec directement. Déjà utilisé par ExoPlayer sur certains appareils présentant ce problème, ce paramètre n\'a d\'effet que sur Android 6 et les versions ultérieures. \n \nL\'activation de cette option peut éviter les erreurs de lecture lors du changement de lecteur vidéo ou du passage en mode plein écran Sélectionner une piste audio comportant des descriptions destinées aux personnes malvoyantes, si disponible Sélectionner la piste audio pour les lecteurs externes Activez cette option si vous rencontrez des problèmes d\'initialisation des décodeurs, ce qui permet de revenir à des décodeurs moins prioritaires si l\'initialisation des décodeurs primaires échoue. Les performances de lecture peuvent être moins bonnes que lors de l\'utilisation des décodeurs primaires @@ -796,10 +756,9 @@ Onglets de chaîne à récupérer Onglets à récupérer lors de la mise à jour du flux. Cette option n’a aucun effet si une chaîne est mise à jour en utilisant le mode rapide. Partager une liste d\'URLs - %1$s -\n%2$s + %1$s \n%2$s Partager la liste de lecture - - %1$s : %2$s + - %1$s : %2$s Choisir quels onglets seront visibles sur les pages de chaîne Changer l’orientation de l’écran Basculer en plein écran @@ -822,13 +781,10 @@ Afficher moins Réinitialiser tous les paramètres à leurs valeurs par défaut Non - La réinitialisation de tous les paramètres va supprimer toutes vos préférences de paramètres et redémarrer l\'application. -\n -\nÊtes-vous sûr de vouloir poursuivre ? + La réinitialisation de tous les paramètres va supprimer toutes vos préférences de paramètres et redémarrer l\'application. \n \nÊtes-vous sûr de vouloir poursuivre ? Sauvegarde et restauration Oui - NewPipe peut automatiquement vérifier la disponibilité de nouvelles versions de temps en temps et vous notifier lorsqu\'elles sont disponibles. -\nVoulez-vous activer cette vérification ? + NewPipe peut automatiquement vérifier la disponibilité de nouvelles versions de temps en temps et vous notifier lorsqu\'elles sont disponibles. \nVoulez-vous activer cette vérification ? Réinitialiser les paramètres Pas assez d\'espace disponible sur l\'appareil Les paramètres de l\'export en cours d\'importation utilisent un format vulnérable qui a été déprécié depuis NewPipe 0.27.0. Assurez-vous que l\'export en cours d\'importation provient d\'une source fiable. Privilégiez les exports obtenues à partir de NewPipe 0.27.0 ou des versions plus récentes à l\'avenir. Le support pour l\'importation des paramètres dans ce format vulnérable sera bientôt complètement supprimé et les anciennes versions de NewPipe ne pourront plus importer les paramètres des exports des nouvelles versions. @@ -844,7 +800,7 @@ Page SoundCloud Top 50 supprimée SoundCloud a abandonné le classement original du Top 50. L\'onglet correspondant a été supprimé de votre page d\'accueil. Suppression des tendances combinées sur YouTube - YouTube a supprimé la page des tendances combinées depuis le 21 juillet 2025. NewPipe a remplacé la page des tendances par défaut par les diffusions en direct les plus populaires.\n\nVous pouvez également sélectionner différentes pages de tendances dans « Paramètres > Contenu > Contenu de la page principale ». + YouTube a supprimé la page des tendances combinées depuis le 21 juillet 2025. NewPipe a remplacé la page des tendances par défaut par les diffusions en direct les plus populaires.\n\nVous pouvez également sélectionner différentes pages de tendances dans « Paramètres > Contenu > Contenu de la page principale ». Tendances jeu vidéo Tendances podcasts Tendances films et séries @@ -853,16 +809,16 @@ %sM %sB Pour utiliser le lecteur contextuel, veuillez sélectionner %1$s dans le menu des paramètres Android suivant et activer %2$s. - « Autoriser l\'affichage sur d\'autres applications » + « Autoriser l\'affichage sur d\'autres applications » Supprimer le fichier Supprimer l\'entrée Entrée supprimée - Compte fermé\n\n%1$s fournit la raison suivante : %2$s + Compte fermé\n\n%1$s fournit la raison suivante : %2$s Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par l\'expiration de l\'URL de streaming ou une interdiction d\'IP Erreur HTTP %1$s reçue du serveur pendant la lecture Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par un bannissement d\'IP ou des problèmes de désobfuscation de l\'URL de streaming %1$s a refusé de fournir des données et a demandé un identifiant pour confirmer que l\'auteur de la requête n\'est pas un robot.\n\nVotre adresse IP a peut-être été temporairement bloquée par %1$s. Vous pouvez patienter ou essayer une autre adresse IP (par exemple, en activant/désactivant un VPN ou en passant du Wi-Fi aux données mobiles).\n\nPour plus d\'informations, veuillez consulter cette FAQ. - Ce contenu n\'est pas disponible pour le pays actuellement sélectionné.\n\nModifiez votre sélection dans « Paramètres > Contenu > Pays par défaut ». + Ce contenu n\'est pas disponible pour le pays actuellement sélectionné.\n\nModifiez votre sélection dans « Paramètres > Contenu > Pays par défaut ». En août 2025, Google a annoncé qu\'à compter de septembre 2026, l\'installation d\'applications nécessiterait une vérification par le développeur pour toutes les applications Android sur les appareils certifiés, y compris celles installées en dehors du Play Store. Les développeurs de NewPipe refusant cette exigence, NewPipe ne fonctionnera plus sur les appareils Android certifiés après cette date. Détails Solution diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index 36e8b7250..f4b083cd4 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -2,28 +2,28 @@ Prema na lupa para comezar. Publicado o día %1$s - Non foi encontrado ningún reprodutor. Quere instalar o VLC\? + Non foi encontrado ningún reprodutor. Quere instalar o VLC? Non se atopou ningún reprodutor de transmisión (podes instalar VLC para reproducilo). Instalar Cancelar - Abrir no navegador + Abir no navegador Abrir no modo popup Compartillar - Descarregar + Descargar Descargar o ficheiro de emisión - Procurar - Opcións - Non querería dicir \"%1$s\"\? + Busca + Configuración + Non querería dicir \"%1$s\"? Compartillar con - Usar un reprodutor de vídeo externo - Elimina o audio con algunhas resolucións - Usar un reprodutor externo de audio + Usar reprodutor de vídeo externo + Elimina o son nalgunhas resolucións + Usear reprodutor de son externo Subscribir Subscrito Xa non está subscrito ao canal Non se pode modificar a subscrición Non se pode actualizar a subscrición - Mostrar información + Amosar información Subscricións Listas de reprodución marcadas Novidades @@ -36,39 +36,39 @@ Cartafol de descarga de audio Os audios descargados están gardados aquí Elixa un cartafol para descargar os audios - Resolución predeterminada - Resolución predeterminada do popup - Mostrar resolucións máis altas - Só algúns dispositivos poden reproducir vídeos en 2K/4K + Resolución por defecto + Resolución predeterminada da xanela emerxente + Amosar resolucións máis altas + Só algúns dispositivos poden reproducir vídeos 2K/4K Reproducir co Kodi - Quere instalar o aplicativo Kore que falta\? + Quere instalar o aplicativo Kore que falta? Mostrar a opción «Reproducir co Kodi» - Mostrar unha opción para reproducir o vídeo co Kodi Media Center + Amosar unha opción para reproducir un vídeo a través do centro multimedia Kodi Audio - Formato de audio predeterminado + Formato de son predeterminado Formato de vídeo predeterminado Tema Claro Escuro Negro - Lembrar o tamaño e a posición do «popup» - Lembrar o tamaño e a posición anteriores do «popup» - Usar un salto inexacto mais inexacto - A busca inexacta permite ao reprodutor procurar posicións máis rápidas con precisión reducida. A busca de 5, 15 ou 25 segundos non funciona con isto + Lembrar as propiedades da xanela emerxente + Lembrar o último tamaño e posición da ventá emerxente + Usar busca rápida e inexacta + A busca inexacta permítelle ao reprodutor desprazarse a posicións con maior rapidez, mais cunha precisión reducida. A busca de 5, 15 ou 25 segundos non funciona con esta opción A caché de imaxes foi limpada Limpar metadatos da cache Eliminar todos os datos de páxinas en caché Os metadatos da caché foron eliminados - Colocar a seguinte emisión na fila automaticamente - Continúa rematando (non se repite) a cola de reprodución engadindo unha transmisión relacionada + Engadir a seguinte transmisión á cola automaticamente + Continuar a finalización da cola de reprodución (non repetitiva) engadindo unha transmisión relacionada Suxestións de procura Escolla suxestións a mostrar ao procurar Historial de procura Gardar os termos de pesquisa localmente Ver o historial Gardar historial de vídeos vistos - Retormar o vídeo reproducíndoo - Continuar reproducindo o vídeo despois das interrupcións (como, por exemplo, as chamadas) + Retomar a reprodución + Continuar a reprodución despois das interrupcións (por exemplo, chamadas telefónicas) Descarregar Mostrar vídeos \"seguintes\" e \"semellantes\" Mostrar a suxestión \"Manteña presionado para engadir á fila\" @@ -77,10 +77,10 @@ País predeterminado para o contido Reprodutor Comportamento - Vídeo e audio + Vídeo e son Historial e caché - Aparencia - Depuración + Apariencia + Depurar Reproducindo en segundo plano Reproducindo en modo «popup» Contido @@ -114,11 +114,11 @@ Exportar historial, subscricións, listas de reprodución e configuración Limpar historial de reproducións Elimina o historial de transmisións reproducidas e as posicións da reprodución - Eliminar todo o historial de reproducións\? + Eliminar todo o historial de reproducións? O historial de reproducións foi eliminado Limpar o historial de procura Elimina o historial de termos procurados - Eliminar todo o historial de procura\? + Eliminar todo o historial de procura? O historial de procuras foi eliminado Erro Erro de rede @@ -141,7 +141,7 @@ Non hai emisións para descargar Deculpe, isto non debería ter acontecido. Informar por correo electrónico - Desculpe, algo foi mal. + Desculpe, algo saíu mal. Informe Información: Que ocorreu: @@ -189,12 +189,11 @@ Por favor, agarde… Copiado para o portarretallos Selecciona un cartafol de descarga máis tarde na configuración - Esta permisión é necesaria -\npara abrir o vídeo no modo «popup» + Esta permisión é necesaria \npara abrir o vídeo no modo «popup» 1 elemento foi eliminado. Desafío reCAPTCHA ReCAPTCHA reto solicitado - Descarregar + Descargar Caracteres permitidos nos nomes de ficheiros Os caracteres inválidos serán substituídos por este valor Carácter de substitución @@ -215,12 +214,11 @@ Páxina web Visita o sitio web de NewPipe para obter máis información e novas. Política de Privacidade de NewPipe - O proxecto NewPipe dá moita importancia á súa privacidade. Por tanto, non recolle ningún dato sen o seu consentimento. -\nA política de privacidade do NewPipe explica con máis detalle que datos son enviados e gardados cando envía un relatorio de erros. + O proxecto NewPipe tómase moi en serio a túa privacidade. Polo tanto, a aplicación non recompila ningún dato sen o teu consentimento.\nA política de privacidade de NewPipe explica en detalle que datos se envían e almacenan cando envías un informe de erro. Le a política de privacidade Licenza de NewPipe - NewPipe é un software libre copyleft: Pode usar, estudar compartillar e melloralo a vontade. En concreto, pode redistribuír e / ou modificala segundo os termos da Licenza Pública Xeral GNU publicada pola Free Software Foundation, xa sexa a versión 3 da licenza, ou (na súa opción) calquera outra versión posterior. - Ler a licenza + NewPipe é software libre con copyleft: podes usalo, estudalo, compartilo e melloralo como queiras. En concreto, podes redistribúilo e/ou modificalo segundo os termos da Licenza Pública Xeral de GNU, tal e como a publica a Free Software Foundation, xa sexa na versión 3 da Licenza ou (a túa elección) en calquera versión posterior. + Ler licenza Historial Historial Desexa eliminar este elemento do historial de procura? @@ -254,7 +252,7 @@ Acción predeterminada ao abrir o contido — %s Reprodutor de vídeo Reprodutor en segundo plano - Reprodutor en popup + Reprodutor emerxente Preguntar sempre Obtendo información… Carregando o contido solicitado @@ -265,7 +263,7 @@ Estabelecer como miniatura da lista de reprodución Gardar a lista de reprodución nos marcadores Eliminar o marcador - Eliminar esta lista de reprodución\? + Eliminar esta lista de reprodución? A lista de reprodución foi creada Lista de reprodución A miniatura da lista de reprodución foi modificada. @@ -274,11 +272,11 @@ Encher Zoom Xerado automaticamente - Lenda - Modificar a escala de texto da lenda e os estilos de segundo plano do reprodutor. Para ter efecto, é preciso reiniciar o aplicativo - A monitorización de fugas de memoria pode facer que o aplicativo deixe de responder cando hai vertedura da pila + Subtítulos + Modifica a escala do texto da lenda do reprodutor e os estilos do fondo. É necesario reiniciar a aplicación para que os cambios teñan efecto + A monitorización de fugas de memoria pode facer que a aplicación deixe de responder ao realizar un volcado da memoria dinámica (heap dump) Informar de erros fóra do ciclo de vida - Forzar a comunicación de excepcións Rx non entregábeis fóra do ciclo de vida do fragmento ou actividade após o descarte + Forzar a notificación de excepcións Rx non entregables fóra do ciclo de vida dun fragmento ou actividade, tras a súa eliminación Importar Importar de Exportar a @@ -288,25 +286,10 @@ Exportación anterior Non foi posíbel importar as subscricións Non foi posíbel exportar as subscricións - Importe as súas subscricións de Google takeout: -\n -\n1. Acceda ao URL %1$s -\n2. Inicie a sesión cando lle for solicitado -\n3. Faga click en \"Todos os datos incluídos\", logo en \"Desmarcar todo\", escolla só \"subscricións\", e prema \"OK\" -\n4. Pulse en \"Próximo paso\" e escolla \"Crear exportación\" -\n5. Faga click no botón de \"Decarregar\" despois de que apareza -\n6. Faga click en IMPORTAR ARQUIVO abaixo e seleccione o ficheiro .zip descarregado -\n7. [Se a importación do .zip fallar] Extraia o ficheiro .csv (xeralmente en Youtube e Youtube Music/subscriptions/subscriptions.csv), e faga click en IMPORTAR FICHEIRO abaixo e seleccione o .csv extraído - Pode importar un perfil do SoundCloud escribindo o URL ou o seu ID: -\n -\n1. Active o «modo desktop» nun navegador da Internet (o sitio non está dispoñíbel para dispositivos móbiles) -\n2. Acceda ao URL %1$s -\n3. Inicie a sesión cando lle for solicitado -\n4. Copie o URL de perfil a que foi redirixido. + Importe as súas subscricións de Google takeout: \n \n1. Acceda ao URL %1$s \n2. Inicie a sesión cando lle for solicitado \n3. Faga click en \"Todos os datos incluídos\", logo en \"Desmarcar todo\", escolla só \"subscricións\", e prema \"OK\" \n4. Pulse en \"Próximo paso\" e escolla \"Crear exportación\" \n5. Faga click no botón de \"Decarregar\" despois de que apareza \n6. Faga click en IMPORTAR ARQUIVO abaixo e seleccione o ficheiro .zip descarregado \n7. [Se a importación do .zip fallar] Extraia o ficheiro .csv (xeralmente en Youtube e Youtube Music/subscriptions/subscriptions.csv), e faga click en IMPORTAR FICHEIRO abaixo e seleccione o .csv extraído + Pode importar un perfil do SoundCloud escribindo o URL ou o seu ID: \n \n1. Active o «modo desktop» nun navegador da Internet (o sitio non está dispoñíbel para dispositivos móbiles) \n2. Acceda ao URL %1$s \n3. Inicie a sesión cando lle for solicitado \n4. Copie o URL de perfil a que foi redirixido. oseuID, soundcloud.com/oseuid - Teña en conta que esta operación pode consumir moitos recursos de rede. -\n -\nDesexa continuar? + Teña en conta que esta operación pode consumir moitos recursos de rede. \n \nDesexa continuar? Controis de velocidade da reprodución A tempo Ton @@ -314,17 +297,16 @@ Avanzar rápido durante os momentos de silencio Paso Reiniciar - Para cumprirmos co Regulamento Xeral Europeo de Protección de Datos (GDPR), chamamos a súa atención sobre a nova política de privacidade do NewPipe. Por favor, léaa con coidado. -\nDebe aceptala para nos enviar un relatorio de erro. + Para cumprirmos co Regulamento Xeral Europeo de Protección de Datos (GDPR), chamamos a súa atención sobre a nova política de privacidade do NewPipe. Por favor, léaa con coidado. \nDebe aceptala para nos enviar un relatorio de erro. Aceptar Recusar Sen límite Limitar a resolución ao usar datos móbiles - Minimizar cando se mude de aplicativo + Minimizar ao cambiar de aplicación Acción ao cambiar a outro aplicativo do reprodutor de vídeo principal - %s - Ningunha + Ningún Minimizar ao reprodutor en segundo plano - Minimizar o reprodutor popup + Minimizar a un reprodutor emerxente Limitado Só son compatibles os URLs HTTPS Desactiva para agochalos comentarios @@ -333,20 +315,8 @@ Por %s Creado por %s Miniatura do avatar da canle - NewPipe aínda non é compatible con este contido. -\n -\nCon toda esperanza será compatible cunha futura versión. - Cres que a carga de contidos é demasiado lenta? En caso afirmativo, intente habilitar a carga rápida (pode cambiala na configuración ou premendo o botón a continuación). -\n -\nNewPipe ofrece dúas estratexias de carga de fontes: -\n• Obtendo toda a canle de subscrición, que é lenta pero completa. -\n• Usar un punto final de servizo dedicado, rápido pero normalmente non completo. -\n -\nA diferenza entre ambos é que o rápido normalmente carece de información, como a duración ou o tipo do elemento (non pode distinguir entre os vídeos en directo e os normais) e pode devolver menos elementos. -\n -\nYouTube é un exemplo dun servizo que ofrece este método rápido coa súa fonte RSS. -\n -\nDe modo que a elección redúcese ao que prefires: velocidade ou información precisa. + NewPipe aínda non é compatible con este contido. \n \nCon toda esperanza será compatible cunha futura versión. + Cres que a carga de contidos é demasiado lenta? En caso afirmativo, intente habilitar a carga rápida (pode cambiala na configuración ou premendo o botón a continuación). \n \nNewPipe ofrece dúas estratexias de carga de fontes: \n• Obtendo toda a canle de subscrición, que é lenta pero completa. \n• Usar un punto final de servizo dedicado, rápido pero normalmente non completo. \n \nA diferenza entre ambos é que o rápido normalmente carece de información, como a duración ou o tipo do elemento (non pode distinguir entre os vídeos en directo e os normais) e pode devolver menos elementos. \n \nYouTube é un exemplo dun servizo que ofrece este método rápido coa súa fonte RSS. \n \nDe modo que a elección redúcese ao que prefires: velocidade ou información precisa. Desactivar o modo rápido Activa o modo rápido Dispoñible nalgúns servizos, normalmente é moito máis rápido pero pode devolver unha cantidade limitada de elementos e moitas veces información incompleta (por exemplo, sen duración, tipo de elemento, sen estado en directo) @@ -357,7 +327,7 @@ Transmisión Amosar só as subscricións non agrupadas Novo - Quere eliminar este grupo\? + Quere eliminar este grupo? Nome do grupo vacío %d seleccionado @@ -396,8 +366,7 @@ Elixir unha instancia O \'Framework Access Framework\' permite a descarga a unha tarxeta SD externa Usar selector de cartafois do sistema (SAF) - Preguntaralle onde gardar cada descarga. -\nPermita o Sistema de Escolla de Cartafois (SAF) se desexar descarregar para un SD externo + Preguntaralle onde gardar cada descarga. \nPermita o Sistema de Escolla de Cartafois (SAF) se desexar descarregar para un SD externo Pregunta onde se descarga Parar as descagas Comezar as descargas @@ -410,7 +379,7 @@ Reintento máximo Parar Eliminar os ficheiros descargados - Quere limpar o seu historial de descargas ou eliminar todos os ficheiros descargados\? + Quere limpar o seu historial de descargas ou eliminar todos os ficheiros descargados? Borrar o historial de descargas Non se pode recuperar esta descarga O tempo de espera da conexión @@ -446,13 +415,13 @@ A actualización de NewPipe está dispoñible! Automático Mostra os indicadores de posición de reprodución nas listas - Rede - Lista - Modo de visualización da lista + Grella + Listaxe + Modo de vista de lista Amosar unha notificación para solicitar a actualización do aplicativo cando unha nova versión estea dispoñible Actualizacións Os textos orixinais dos servizos serán visibles nos elementos do fluxo - Amosar o tempo orixinal anterior nos elementos + Mostrar o tempo transcorrido orixinal nos elementos Xerado automaticamente (non se atopou ningún cargador) Non silenciar Silenciar @@ -485,14 +454,14 @@ Reportar en GitHub Copia o informe con formato Dar permiso para mostrar noutros aplicativos - Quere restaurar os valores predeterminados\? + Quere restaurar os valores predeterminados? Restaurar os valores predeterminados Non se puideron ler as pestanas gardadas, polo que usar as predeterminadas Ficheiro movido ou eliminado - Non é posible descargar na tarxeta SD externa. Restaurar a localización do cartafol de descarga\? + Non é posible descargar na tarxeta SD externa. Restaurar a localización do cartafol de descarga? Non hai dispoñible almacenamento externo Elimináronse as posicións de reprodución - Eliminas todas as posicións de reprodución\? + Eliminas todas as posicións de reprodución? Elimina todas as posicións de reprodución Elimina as posicións de reprodución Notificacións para as novas versións de NewPipe @@ -503,9 +472,7 @@ Cancións Eventos Vídeos - Este vídeo está restrinxido por idade. -\n -\nSe desexa visualizalo, habilite \"%1$s\" nas opcións. + Este vídeo está restrinxido por idade. \n \nSe desexa visualizalo, habilite \"%1$s\" nas opcións. Activar modo restrinxido de YouTube Actualizacións A instancia xa existe @@ -521,7 +488,7 @@ Posicións nas listas Restaurar a última posición de reprodución Ensinalos comentarios - Duración da busca rápida cara a adiante / cara atrás + Duración do salto ao avanzar/retroceder Elixir lapela Darse de baixa Amosando resultados para: %s @@ -536,7 +503,7 @@ Cortar a miniatura do vídeo amosado na notificación da relación de aspecto 16:9 a 1:1 Cortar miniatura á relación de aspecto 1:1 Apagado - Modo tableta + Modo de tableta Abrir sitio Web Interno Privado @@ -551,20 +518,18 @@ Deshabilitar a selección do texto da descrición Habilitar a selección do texto na descrición Agora pode seleccionar o texto na descrición. Teña en conta que a páxina pode cintilar e as ligazóns poden non ser clicábeis no modo selección. - Automático (Tema do dispositivo) + Automático (tema do dispositivo) Radio Este contido non está dispoñíbel no seu país. Capítulos Recentes Mostrar miniatura - A conta do autor foi eliminada. -\nNewPipe non poderá acceder a ela no futuro. -\nQueres desubscribirte da canle\? + A conta do autor foi eliminada. \nNewPipe non poderá acceder a ela no futuro. \nQueres desubscribirte da canle? Nunca - Só con Wi-Fi + Só na Wi-Fi Iniciar reprodución automaticamente — %s - A aplicación deixou de funcionar - Pór na cola + Falla a aplicación + Poñer na cola Mostrar detalles da canle Reproducir cola Resolver @@ -574,19 +539,18 @@ As cookies reCAPTCHA foron borradas Limpar cookies reCAPTCHA Notificación do \"hash\" do vídeo - Este vídeo ten restrición de idade. -\nDebido ás novas políticas de Youtube cos vídeos con restrición de idade, NewPipe non pode acceder ás transmisións do vídeo, polo que non pode reproducilo. + Este vídeo ten restrición de idade. \nDebido ás novas políticas de Youtube cos vídeos con restrición de idade, NewPipe non pode acceder ás transmisións do vídeo, polo que non pode reproducilo. Youtube ten un \"Modo Restrinxido\" que oculta contido potencialmente só para adultos - URL non recoñecido. Abrir con outra aplicación\? + URL non recoñecido. Abrir con outra aplicación? Mostrar metainformación Desactíveo para ocultar a descrición do vídeo e a información adicional Ver descrición - Pedir confirmación antes de baleirar unha cola - Tema escuro + Solicitar confirmación antes de baleirar unha cola + Tema nocturno Nada Abrir con Non listado - Pode seleccionar o seu tema escuro favorito abaixo + Podes seleccionar o teu tema nocturno favorito a continuación Seleccione o seu tema escuro favorito — %s Este vídeo só está disponíbel para membros de YouTube Music Premium, polo que non pode ser transmitido nin descarregado polo NewPipe. Este contido é privado, polo que non pode ser transmitido nin descarregado polo NewPipe. @@ -595,15 +559,15 @@ Os comentarios están desactivados Mostrar contido potencialmente non apto para menores porque ten unha limitación de idade (como +18) Definir cor da notificación - Prendido + Acendido Provedor Destacado Este contido só está dispoñíbel para usuarios que pagaran por el, así que non pode ser transmitido ou descarregado por NewPipe. Será preguntado onde desexa gardar cada descarga - Non mostrar + Non amosar Baixa calidade (máis pequeno) - Alta calidade (maior) - Mostrar perdas de memoria + Alta calidade (máis grande) + Amosar fugas de memoria Desactivar para ocultar información adicional sobre o creador da emisión, do contido, ou da petición de procura Permitir a Android personalizar a cor da notificación conforme a cor principal da miniatura (esta opción non está dispoñíbel en todos os dispositivos) Marcar como visto @@ -620,9 +584,9 @@ Descarga finalizada %s descargas finalizadas - Miniatura na barra de busca - Desactive o túnel multimedia se experimentar unha pantalla en negro ou interrupcións na reprodución. - Desactivar túnel multimedia + Vista previa en miniatura na barra de progreso + Desactiva o «media tunneling» se experimentas unha pantalla negra ou interrupcións durante a reprodución de vídeo. + Desactivar o túnel multimedia Engadido á cola Cartafol de descarga aínda non definido, escolla o cartafol agora A calcular hash @@ -631,17 +595,15 @@ Suxestións de procura locais Suxestións de procura remotas A cola de reprodución activa será substituída - Cambiar dun reprodutor a outro pode substituír a súa cola + Cambiar dun reprodutor a outro pode substituír a túa cola Barallar Edite cada acción da notificación premendo nela. Seleccione ata tres delas para seren mostradas na notificación compacta usando as checkboxes da dereita. Enfileirar o seguinte vídeo - Inciar reprodutor principal en pantalla completa - Non iniciar vídeos no reprodutor mini, mais cambiar a pantalla completa directamente, se a rotación estiver bloqueada. Aínda pode acceder o reprodutor mini ao saír da pantalla completa + Iniciar o reprodutor principal en pantalla completa + Non inicies os vídeos no minirreprodutor; pasa directamente ao modo de pantalla completa se a rotación automática está bloqueada. Podes acceder ao minirreprodutor saíndo da pantalla completa Deslice os elementos para removelos - Non se atopou ningún xestor de ficheiros axeitado para esta acción. -\nPor favor instala un xestor de ficheiros ou intenta desactivar \'%s\' na configuración de descarga - Non se atopou ningún xestor de ficheiros axeitado para esta acción. -\nPor favor instala un xestor de ficheiros compatible con Storage Access Framework + Non se atopou ningún xestor de ficheiros axeitado para esta acción. \nPor favor instala un xestor de ficheiros ou intenta desactivar \'%s\' na configuración de descarga + Non se atopou ningún xestor de ficheiros axeitado para esta acción. \nPor favor instala un xestor de ficheiros compatible con Storage Access Framework Valorado polo creador Ocorreu un erro, vexa a notificación Auto-enfileirar @@ -658,12 +620,12 @@ Procesando... Pode devagar un momento Crear unha notificación de erro Novos elementos - Predefinido do ExoPlayer + ExoPlayer predeterminado Amosar \"Travar o reprodutor\" - Amosar un snackbar de erro - Amosa unha opción de travamento ao usar o reprodutor + Mostrar unha barra de mensaxes de erro + Mostra unha opción de peche inesperado ao usar o reprodutor Travar o reprodutor - LeakCanary non está dispoñíbel + LeakCanary non está dispoñible Notificacións sobre novas emisións para subscricións Frecuencia de verificación Conexión á rede necesaria @@ -680,11 +642,11 @@ Notificación do reprodutor Novas emisións Carregando detalles da emisión… - Verifique se hai novas emisións + Comprobar se hai novas emisións Configurar a notificación da emisión actual Notificacións Calquera rede - Desexa eliminar todos os ficheiros descarregados do disco\? + Desexa eliminar todos os ficheiros descarregados do disco? As notificacións están desactivadas Recibir notificacións Agora está subscrito a esta canle @@ -692,13 +654,13 @@ Seleccione a calidade para reprodutores externos Formato descoñecido Calidade descoñecida - Tamaño do intervalo de carregamento da reprodución + Tamaño do intervalo de carga da reprodución As emisións seleccionadas non son soportadas polos reprodutores externos Non hai emisións de vídeo dispoñíbeis para reprodutores externos Non hai emisións de audio dispoñíbeis para reprodutores externos - Ver na páxina web - Preguntas máis frecuentes - Se tes problemas para usala aplicación, asegúrate de consultar estas respostas ás preguntas comúns! + Ver no sitio web + Preguntas frecuentes + Se tes dificultades para usar a aplicación, bótalle unha ollada a estas respostas a preguntas frecuentes! Ordenar Modo rápido Estás executando a última versión de NewPipe @@ -711,18 +673,18 @@ As listas de reprodución que se atopan atenuadas xa conteñen este elemento. Duplicado engadido %d vez/veces Mostrar/Ocultar emisións - Ignorar eventos con botóns multimedia físicos - Útil, por exemplo, se estiver usando un auricular con botóns rotos + Ignorar os eventos dos botóns multimedia de hardware (físicos) + Útil, por exemplo, se estás a usar uns auriculares con botóns físicos estragados Eliminar duplicados - Eliminar duplicados\? - Desexa eliminar todas as emisións duplicadas nesta lista de reprodución\? + Eliminar duplicados? + Desexa eliminar todas as emisións duplicadas nesta lista de reprodución? Mostrar os seguintes vídeos Completamente visto Parcialmente visto Proximamente - Escolla o xesto para a metade dereita da pantalla do reprodutor - Acción do xesto para a dereita - Acción do xesto na esquerda + Escolle un xesto para a metade dereita da pantalla do reprodutor + Acción do xesto á dereita + Acción do xesto á esquerda Brillo Volume Ningún @@ -731,24 +693,24 @@ Xa debe existir unha faixa de audio nesta emisión Selecione a faixa de áudio para reprodutores externos Descoñecida - Configuracións ExoPlayer - Xestione algunhas configuracións de ExoPlayer. É necesario reiniciar o reprodutor para aplicar os cambios - Use a función fallback do decodificador do ExoPlayer - Habilite esta opción se ten problemas na inciciación do decodificador. Usaranse decodificadores de menor prioridade se os primarios fallan. Isto pode resultar nun menor rendemento comparado co dos primarios - Usar sempre Explayer como alternativa de saída de vídeo + Configuración de ExoPlayer + Xestiona algunha configuración de ExoPlayer. Estes cambios requiren reiniciar o reprodutor para que teñan efecto + Utiliza a función de alternativa de decodificador de ExoPlayer + Activa esta opción se tes problemas coa inicialización do decodificador; isto permite recorrer a decodificadores de menor prioridade no caso de que falle a inicialización dos principais. Isto pode dar lugar a un rendemento de reprodución inferior ao que se obtería utilizando os decodificadores principais + Utiliza sempre a solución alternativa de ExoPlayer para a configuración da superficie de saída de vídeo %1$s %2$s orixinal dobrado descritivo Altera o tamaño do intervalo de carregamento progresivo (o actual é %s). Un valor menor pode acelerar o carregamento inicial do vídeo - Preferir o audio orixinal - Seleccionar o audio orixinal independentemente do idioma - Seleciona o audio con descrición para persoas con dificuldades de visión, se estar dispoñíbel - Prefirir o audio descritivo - Escolla o xesto para a metade esquerda da pantalla do reprodutor - Mova o selector da lapela principal para a parte inferior - Posición prinicipal das lapelas - A tunelización da multimedia foi deshabilitada por defecto, porque o seu modelo de dispositivo carece de soporte. + Prefiro o son orixinal + Selecciona a pista de son orixinal, independentemente do idioma + Selecciona unha pista de son con descricións para persoas con discapacidade visual, se está dispoñible + Prefiro a audiodescrición + Escolle un xesto para a metade esquerda da pantalla do reprodutor + Mover o selector da lapela principal ao fondo + Posición das lapelas principais + O «media tunneling» desactivouse de forma predeterminada no teu dispositivo, xa que se sabe que o modelo do teu dispositivo non o admite. Sen emisións Sen emisións en directo Miniaturas @@ -767,8 +729,7 @@ Compartillar lista de reprodución Compartillar os títulos - %1$s: %2$s - %1$s -\n%2$s + %1$s \n%2$s Amosar máis %s resposta @@ -779,11 +740,10 @@ Avatar da subcanle Subscritores A cargar metadatos… - Copia de seguranza e restauración + Copia de seguridade e restauración Si Non - NewPipe pode revisar automaticamente por actualizacións periodicamente e notificalo unha vez estean dispoñíbeis. -\nDesexa habilitar isto? + NewPipe pode revisar automaticamente por actualizacións periodicamente e notificalo unha vez estean dispoñíbeis. \nDesexa habilitar isto? Restaurar configuracións Restabelecer todas as configuracións aos seus valores por defecto Non hai espazo suficiente no dispositivo @@ -811,7 +771,7 @@ A configuración da exportación a ser importada emprega un formato vulnerable que fica obsoleto dende NewPipe 0.27.0. Comprobe que a exportación que está a importar proveña dunha fonte fiable e preferibelmente empregue exportacións de NewPipe 0.27.0 ou posterior. A compatibilidade coa importación deste formato vulnerable será eliminada por completo próximamente e as versión antigas de NewPipe non poderán importar configuracións de exportacións dende novas versións. Pistas Lapelas a recuperar ao actualizar o feed. Esta opción non ten efecto se a canle se actualiza no modo rápido. - Esta solución alternativa libera os códecs de video e os re-instancia cando muda a máscara, no canto de configurar a máscara directamente no códec. ExoPlayer xa emprega esta configuración nalgúns dispositivos con este problema e só afecta a Android 6 e versións posteriores.\n\nActivar esta opción pode minimizar erros de reprodución ao mudar o reprodutor de video actual ou mudar ao modo de pantalla completa + Esta solución alternativa libera e volve instanciar os códecs de vídeo cando se produce un cambio na superficie, en lugar de asignar a superficie directamente ao códec. Esta configuración, que xa utiliza ExoPlayer nalgúns dispositivos que presentan este problema, só ten efecto en Android 6 e versións posteriores.\n\nActivar esta opción pode evitar erros de reprodución ao cambiar o reprodutor de vídeo actual ou ao pasar ao modo de pantalla completa %sK %sM %sMM @@ -866,4 +826,6 @@ NewPipe deixa de ser compatible con Android 5 Desafortunadamente, NewPipe depende dalgunhas bibliotecas que deixaron de ser compatible con Android 5.0 e 5.1. Polo tanto, a próxima versión de NewPipe só funcionará en dispositivos con Android 6 ou superior. Le máis na publicación do blog. Publicación do blog + Podcasts + Cursos diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index 637fc9bf8..ed4ed2146 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -53,7 +53,7 @@ બાહ્ય વિડિઓ પ્લેયરનો ઉપયોગ કરો સાથે શેર કરો %s માટે પરિણામો બતાવી રહ્યું છે - શું તમારો મતલબ %1$s છે\? + શું તમારો મતલબ %1$s છે? સેટિંગ્સ શોધો સ્ટ્રીમ ફાઇલ ડાઉનલોડ કરો @@ -65,7 +65,7 @@ રદ કરો સ્થાપિત કરો કોઈ સ્ટ્રીમ પ્લેયર મળ્યો નથી (તમે તેને ચલાવવા માટે VLC ઇન્સ્ટોલ કરી શકો છો). - કોઈ સ્ટ્રીમ પ્લેયર મળ્યો નથી. વીએલસી સ્થાપિત કરીએ\? + કોઈ સ્ટ્રીમ પ્લેયર મળ્યો નથી. વીએલસી સ્થાપિત કરીએ? %1$s પર પ્રકાશિત પ્રારંભ કરવા માટે વિપુલ - દર્શક કાચને ટેપ કરો. જોયેલું તરીકે ચિહ્નિત કરો diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index e54663a4f..79339803c 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -2,7 +2,7 @@ יש לגעת בזכוכית המגדלת כדי להתחיל. פורסם ב־%1$s - לא נמצאו נגני הזרמה, להתקין VLC\? + לא נמצאו נגני הזרמה, להתקין VLC? התקנה ביטול פתיחה בדפדפן @@ -11,7 +11,7 @@ הורדה חיפוש הגדרות - כוונתך הייתה „%1$s”\? + כוונתך הייתה „%1$s”? שיתוף עם שימוש בנגן סרטונים חיצוני בחלק מהרזולוציות השמע יוסר @@ -29,7 +29,7 @@ הצגת רזולוציות גבוהות יותר רק חלק מהמכשירים יכולים לנגן סרטונים ב־2K/4K נגינה ב־Kodi - להתקין את יישומון Kode החסר\? + להתקין את יישומון Kode החסר? הצגת האפשרות לניגון עם Kodi הצגת אפשרות לנגן סרטון דרך מרכז המדיה Kodi שמע @@ -116,21 +116,18 @@ מנוי אחד שני מנויים - %s מנויים %s מנויים אין צפיות צפייה אחת שתי צפיות - %s צפיות %s צפיות אין סרטונים סרטון %s %s סרטונים - %s סרטונים %s סרטונים התחלה @@ -146,8 +143,7 @@ נא להמתין… הועתק ללוח נא לציין תיקיית הורדה בהגדרות בהמשך - הרשאה זו נדרשת לטובת -\nפתיחה בחלון צף + הרשאה זו נדרשת לטובת \nפתיחה בחלון צף אתגר reCAPTCHA התקבלה בקשה לאתגר reCAPTCHA הורדה @@ -174,7 +170,7 @@ הצגת הרישיון היסטוריה היסטוריה - למחוק את הפריט הזה מהיסטוריית החיפושים\? + למחוק את הפריט הזה מהיסטוריית החיפושים? תוכן הדף הראשי עמוד ריק עמוד גישה מזדמנת @@ -236,7 +232,7 @@ הוספה לרשימת נגינה הוספת רשימת נגינה לסימניות הסרת סימנייה - למחוק רשימת נגינה זו\? + למחוק רשימת נגינה זו? רשימת הנגינה נוצרה נוסף לרשימת הנגינה תמונת רשימת הנגינה הוחלפה. @@ -252,15 +248,7 @@ ייצוא קודם לא ניתן לייבא את המינויים לא ניתן לייצא את המינויים - כדי לייבא את רשימת המינויים שלך מ־YouTube עליך להוריד את קובץ הייצוא: -\n -\n1. לעבור לכתובת הזו: %1$s -\n2. להיכנס אם נתבקשת -\n3. ללחוץ על „All data included”, ואז על „Deselect all”, לאחר מכן לבחור רק את „subscriptions” וללחוץ על „OK” -\n4. ללחוץ על „Next step” ואז על „Create export” -\n5. ללחוץ על כפתור ה־„Download” כשהוא מופיע -\n6. ללחוץ על „ייבוא קובץ” להלן ולבחור בקובץ ה־‎.zip שהורדת -\n7. (אם ייבוא ה־‎.zip נכשל) יש לחלץ את קובץ ה־‎.csv (בדרך כלל תחת „YouTube and YouTube Music/subscriptions/subscriptions.csv”), ללחוץ על „ייבוא קובץ” להלן וללחוץ על קובץ ה־csv שחולץ + כדי לייבא את רשימת המינויים שלך מ־YouTube עליך להוריד את קובץ הייצוא: \n \n1. לעבור לכתובת הזו: %1$s \n2. להיכנס אם נתבקשת \n3. ללחוץ על „All data included”, ואז על „Deselect all”, לאחר מכן לבחור רק את „subscriptions” וללחוץ על „OK” \n4. ללחוץ על „Next step” ואז על „Create export” \n5. ללחוץ על כפתור ה־„Download” כשהוא מופיע \n6. ללחוץ על „ייבוא קובץ” להלן ולבחור בקובץ ה־‎.zip שהורדת \n7. (אם ייבוא ה־‎.zip נכשל) יש לחלץ את קובץ ה־‎.csv (בדרך כלל תחת „YouTube and YouTube Music/subscriptions/subscriptions.csv”), ללחוץ על „ייבוא קובץ” להלן וללחוץ על קובץ ה־csv שחולץ קצב שימוש בחיפוש מהיר ולא מדויק חיפוש גס מאפשר לנגן לחפש נקודת זמן מהר יותר, ברמת דיוק נמוכה יותר. חיפוש של 5, 15 או 25 שניות לא עובד עם ההגדרה הזאת @@ -274,9 +262,9 @@ רשימות נגינה רצועות משתמשים - למחוק את כל היסטוריית הצפייה\? + למחוק את כל היסטוריית הצפייה? מחיקת היסטוריית מילות החיפוש - למחוק את כל היסטוריית החיפוש\? + למחוק את כל היסטוריית החיפוש? לא נמצאו תזרימי וידאו לא נמצאו תזרימי שמע אין תיקייה כזו @@ -284,15 +272,14 @@ אירעה שגיאה: %1$s אין תזרימים זמינים להורדה מדיניות הפרטיות של NewPipe - מיזם NewPipe שומר על הפרטיות שלך בצורה מאוד קפדנית. לפיכך, היישומון אינו אוסף נתונים ללא הסכמתך. -\nמדיניות הפרטיות של NewPipe מסבירה בפרטי פרטים אילו נתונים נשלחים ומאוחסנים בעת שליחת דיווח על תקלה. + מיזם NewPipe שומר על הפרטיות שלך בצורה מאוד קפדנית. לפיכך, היישומון אינו אוסף נתונים ללא הסכמתך. \nמדיניות הפרטיות של NewPipe מסבירה בפרטי פרטים אילו נתונים נשלחים ומאוחסנים בעת שליחת דיווח על תקלה. הצגת מדיניות הפרטיות NewPipe הוא יישומון חופשי בהתאם לרישיון קופילפט: מותר לך להשתמש, לחקור, לשתף ולשפר בכל דרך שנראית לך. במיוחד מותר לך להפיץ מחדש ו/או לשנות תחת תנאי הרישיון הציבורי הכללי של GNU כפי שמופץ על ידי קרן התכנה החופשית, בין אם גרסה 3 של הרישיון או (לשיקולך) כל גרסה עדכנית יותר שלו. התנגנו אחרונים הכי נצפים אזהרה: ייבוא חלק מהקבצים נכשל. פעולה זו תדרוס את ההגדרות הקיימות. - לייבא גם הגדרות\? + לייבא גם הגדרות? פתיחת מגירה סגירת מגירה פעולת ‚פתיחה’ מועדפת @@ -304,9 +291,7 @@ שינוי גודל כותרת הנגן וסגנונות הרקע. נדרשת הפעלה מחדש כדי ששינויים אלה יכנסו לתוקף מעקב אחר זליגת זיכרון עשויה לגרום ליישומון להיות בלתי זמין בזמן העתקת תוכן הזיכרון לקובץ המזהה שלך, soundcloud.com/המזהה שלך - נא לשים לב כי פעולה זו עשויה להעמיס על תקשורת הנתונים. -\n -\nלהמשיך\? + נא לשים לב כי פעולה זו עשויה להעמיס על תקשורת הנתונים. \n \nלהמשיך? ניתוק קשר (עלול ליצור עיוות) להאיץ קדימה כאשר שקט צעד @@ -326,27 +311,21 @@ התראת עדכון יישומון התראות על גרסאות חדשות של NewPipe האחסון החיצוני אינו זמין - אין אפשרות להוריד לכרטיס SD. לאפס את מיקום תיקיית ההורדה\? + אין אפשרות להוריד לכרטיס SD. לאפס את מיקום תיקיית ההורדה? לא ניתן לקרוא לשוניות שמורות, לכן נעשה שימוש באלו של ברירת המחדל שחזור ברירת מחדל - לשחזר ברירת מחדל\? + לשחזר ברירת מחדל? מספר המנויים אינו זמין אילו לשוניות תופענה בעמוד הראשי אירועים כנסים דיווח על שגיאות שמחוץ למחזור החיים אילוץ דיווח על חריגות מחוץ למקטעים או למחזור חיי הפעילות לאחר ההשלכה בתשדורת יוצאת - ניתן לייבא פרופיל SoundCloud על ידי הקלדת הכתובת או המזהה שלך: -\n -\n1. עליך להפעיל „מצב שולחן עבודה” בדפדפן שלך (האתר לא זמין למכשירים ניידים) -\n2. לעבור לכתובת הזו: %1$s -\n3. להיכנס אם נתבקשת -\n4. להעתיק את כתובת הפרופיל אליו הועברת. + ניתן לייבא פרופיל SoundCloud על ידי הקלדת הכתובת או המזהה שלך: \n \n1. עליך להפעיל „מצב שולחן עבודה” בדפדפן שלך (האתר לא זמין למכשירים ניידים) \n2. לעבור לכתובת הזו: %1$s \n3. להיכנס אם נתבקשת \n4. להעתיק את כתובת הפרופיל אליו הועברת. בקרי מהירות נגינה גובה צליל הגבלת הרזולוציה בעת שימוש בנתונים סלולריים - כדי לעמוד בדרישות האסדרה הכללית להגנה על מידע (GDPR), אנו מפנים את תשומת לבך למדיניות הפרטיות של NewPipe. נא לקרוא אותה בעיון רב. -\nעליך לאשר את הסכמתך למדיניות כדי לשלוח לנו דיווחים על תקלות. + כדי לעמוד בדרישות האסדרה הכללית להגנה על מידע (GDPR), אנו מפנים את תשומת לבך למדיניות הפרטיות של NewPipe. נא לקרוא אותה בעיון רב. \nעליך לאשר את הסכמתך למדיניות כדי לשלוח לנו דיווחים על תקלות. עדכונים הצגת התראה כדי להודיע על עדכון ליישומון כשיוצאת גרסה חדשה לאור מצב תצוגת רשימה @@ -401,32 +380,29 @@ לא נשאר מקום במכשיר התהליך אבד כיוון שהקובץ נמחק החיבור המתין זמן רב מדי - למחוק את היסטוריית ההורדות שלך או למחוק את כל הקבצים שהורדת\? + למחוק את היסטוריית ההורדות שלך או למחוק את כל הקבצים שהורדת? הגבלת תור ההורדה רק הורדה אחת תרוץ בו־זמנית התחלת הורדות השהיית הורדות לשאול לאן להוריד - תופיע שאלה לאן לשמור כל הורדה. -\nיש להפעיל את בוחר התיקיות של המערכת (SAF) כדי להוריד לכרטיס SD חיצוני + תופיע שאלה לאן לשמור כל הורדה. \nיש להפעיל את בוחר התיקיות של המערכת (SAF) כדי להוריד לכרטיס SD חיצוני שימוש בבוחר התיקיות של המערכת (SAF) ‚תשתית גישה לאחסון’ מאפשרת הורדות לכרטיס SD חיצוני מחיקת מיקומי נגינה מחיקת כל מיקומי הנגינה - למחוק את מיקומי הנגינה\? + למחוק את מיקומי הנגינה? הפעלה/כיבוי שירות, בחירה נוכחית: אין צופים צופה %s %s צופים - %s צופים %s צופים אין מאזינים מאזין %s %s מאזינים - %s מאזינים %s מאזינים קיוסק ברירת מחדל @@ -457,7 +433,6 @@ שנייה אחת שתי שניות - %d שניות %d שניות עקב מגבלות של ExoPlayer מגבלות טווחי החיפוש הוגדרו לכדי %d שניות @@ -466,19 +441,16 @@ דקה שתי דקות - %d דקות %d דקות שעה שעתיים - %d שעות %d שעות יום יומיים - %d ימים %d ימים קבוצות ערוצים @@ -489,7 +461,7 @@ בחירת מינויים לא נבחר מינוי שם הקבוצה ריק - למחוק את הקבוצה הזאת\? + למחוק את הקבוצה הזאת? חדשה הזנה סף עדכון ההזנה @@ -499,34 +471,19 @@ נבחר אחד %d נבחרו - %d נבחרו %d נבחרו הזמן לאחר העדכון האחרון בטרם מינוי נחשב לבלתי עדכני — %s לקבל מהזנה ייעודית כשניתן זמין בחלק מהשירותים, האפשרות הזאת בדרך כלל מהירה יותר אך עשויה להחזיר כמות מוגבלת של פריטים ולעתים פרטים חלקיים (למשל: חסר משך הפרק, סוג הפריט, אין מצב חי) - לדעתך הטעינה אטית מדי\? אם זה המצב אצלך, כדאי לנסות להפעיל טעינה מהירה (ניתן לשנות בהגדרות או על ידי לחיצה על הכפתור שלהלן). -\n -\nהיישומון NewPipe מציע שתי אסטרטגיות לטעינת הזנה: -\n• הורדת כל ערוץ המינוי, אטי אבל שלם. -\n• באמצעות נקודת קצה ייעודית, מהיר אבל חלקי. -\n -\nההבדל בין השתיים הוא שבמהירה חסרים פרטים, כמו משך הפריט או סוגו (אין אפשרות להבדיל בין סרטונים חיים לרגילים) והיא עשויה להחזיר פחות פריטים. -\n -\nYouTube זאת דוגמה לשירות שמציע את השיטה המהירה הזאת עם הזנת ה־RSS שלו. -\n -\nלכן עומדת בפניך הבחירה: מהירות או דיוק בפרטים. - תוכן זה לא נתמך עדיין על ידי NewPipe. -\n -\nאנו מקווים שתתווסף תמיכה בגרסאות עתידיות. + לדעתך הטעינה אטית מדי? אם זה המצב אצלך, כדאי לנסות להפעיל טעינה מהירה (ניתן לשנות בהגדרות או על ידי לחיצה על הכפתור שלהלן). \n \nהיישומון NewPipe מציע שתי אסטרטגיות לטעינת הזנה: \n• הורדת כל ערוץ המינוי, אטי אבל שלם. \n• באמצעות נקודת קצה ייעודית, מהיר אבל חלקי. \n \nההבדל בין השתיים הוא שבמהירה חסרים פרטים, כמו משך הפריט או סוגו (אין אפשרות להבדיל בין סרטונים חיים לרגילים) והיא עשויה להחזיר פחות פריטים. \n \nYouTube זאת דוגמה לשירות שמציע את השיטה המהירה הזאת עם הזנת ה־RSS שלו. \n \nלכן עומדת בפניך הבחירה: מהירות או דיוק בפרטים. + תוכן זה לא נתמך עדיין על ידי NewPipe. \n \nאנו מקווים שתתווסף תמיכה בגרסאות עתידיות. ∞ סרטונים למעלה מ־100 סרטונים אמנים אלבומים שירים - סרטון זה מוגבל לצפייה מגיל מסוים. -\n -\nיש להפעיל את „%1$s” בהגדרות כדי לצפות בו. + סרטון זה מוגבל לצפייה מגיל מסוים. \n \nיש להפעיל את „%1$s” בהגדרות כדי לצפות בו. כן, לרבות סרטונים שהפסקתי באמצע תזרימים שלאחר שצפית בהם לפני ואחרי שנוספו לרשימת הנגינה יוסרו. \nלהמשיך? הסרת נצפו @@ -549,7 +506,7 @@ רק עם רשת אלחוטית להתחיל לנגן אוטומטית — %s תור נגינה - לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר\? + לא ניתן לזהות את הכתובת. לפתוח אותה ביישומון אחר? סידור אוטומטי בתור התור מהנגן הפעיל יוחלף מעבר מנגן אחד למשנהו עלול להחליף את התור שלך @@ -599,8 +556,7 @@ זה תוכן פרטי, לכן לא ניתן להזרים או להוריד אותו עם NewPipe. רצועה זו של SoundCloud Go+‎ מוגבלת, לפחות במדינה שלך, לכן לא ניתן להזרים או להוריד אותה עם NewPipe. תוכן זה אינו זמין במדינה שלך. - הצפייה בסרטון הזה מוגבלת בגיל. -\nעקב מדיניות חדשה ב־YouTube בנוגע לסרטונים מוגבלי גיל, ל־NewPipe אין אפשרות לגשת לתזרימי הווידאו של השירות ולכן אין אפשרות לנגן אותם. + הצפייה בסרטון הזה מוגבלת בגיל. \nעקב מדיניות חדשה ב־YouTube בנוגע לסרטונים מוגבלי גיל, ל־NewPipe אין אפשרות לגשת לתזרימי הווידאו של השירות ולכן אין אפשרות לנגן אותם. ההורדה החלה באפשרותך לבחור את ערכת העיצוב הלילית המועדפת עליך להלן נא לבחור את ערכת העיצוב הלילית המועדפת עליך — %s @@ -627,9 +583,7 @@ השבתת בחירת טקסט בתיאור הפעלת בחירת טקסט בתיאור מעתה ניתן לבחור טקסט בתוך התיאור. נא לשים לב שהעמוד עשוי להבהב והקישורים לא יהיו לחיצים בזמן מצב הבחירה. - חשבון היוצר הושמד. -\nל־NewPipe לא תהיה אפשרות להוריד את ההזנה הזאת בעתיד. -\nלהסיר את המינוי מהערוץ הזה\? + חשבון היוצר הושמד. \nל־NewPipe לא תהיה אפשרות להוריד את ההזנה הזאת בעתיד. \nלהסיר את המינוי מהערוץ הזה? פתיחת האתר החשבון הושמד מצב ההזנה המהירה לא מספק מידע נוסף על כך. @@ -653,13 +607,11 @@ הורדה אחת נמחקה %1$s הורדות נמחקו - %1$s הורדות נמחקו %1$s הורדות נמחקו הורדה הסתיימה %s הורדות הסתיימו - %s הורדות הסתיימו %s הורדות הסתיימו ניתן להחליק פריטים להסרתם @@ -680,11 +632,9 @@ יצירת התראת שגיאה NewPipe נתקל בשגיאה, לחיצה תדווח על כך אירעה שגיאה, נא לקרוא את ההתראה - לא נמצא מנהל קבצים מתאים לפעולה זו. -\nנא להתקין מנהל קבצים או לנסות להשבית את ‚%s’ בהגדרות ההורדה + לא נמצא מנהל קבצים מתאים לפעולה זו. \nנא להתקין מנהל קבצים או לנסות להשבית את ‚%s’ בהגדרות ההורדה התראת דיווח שגיאה - לא נמצאו מנהלי קבצים שמתאימים לפעולה הזאת. -\nנא להתקין מנהל קבצים שתומך בתשתית גישה לאחסון + לא נמצאו מנהלי קבצים שמתאימים לפעולה הזאת. \nנא להתקין מנהל קבצים שתומך בתשתית גישה לאחסון הערה ננעצה LeakCanary אינה זמינה ברירת מחדל של ExoPlayer @@ -698,7 +648,6 @@ תזרים חדש %s תזרימים חדשים - %s תזרימים חדשים %s תזרימים חדשים פרטי התזרים נטענים… @@ -709,7 +658,7 @@ תזרימים חדשים התראות נגן רשת כלשהי - למחוק את כל הקבצים שהורדו מהכונן\? + למחוק את כל הקבצים שהורדו מהכונן? התראות מושבתות נרשמת לערוץ הזה אחוז @@ -742,14 +691,14 @@ פעולת מחווה ימנית עוצמת שמע בלי - להסיר את כל השידורים הכפולים ברשימת הנגינה\? + להסיר את כל השידורים הכפולים ברשימת הנגינה? נצפו חלקית בקרוב בהירות נא לבחור מחווה לחצי השמאלי של מסך הנגן נא לבחור מחווה לחצי הימני של מסך הנגן הסרת כפילויות - להסיר כפילויות\? + להסיר כפילויות? נצפו במלואם להציג את השידורים הבאים להציג/להסתיר שידורים @@ -771,9 +720,7 @@ שינוי גודל מרווח הטעינה (כרגע %s). ערך נמוך יותר עשוי להאיץ את טעינת הווידאו הראשונית יש להפעיל את האפשרות הזאת אם נתקלת בבעיות עם אתחול מפענח, מה שגורם להנחתה למפענחים עם עדיפות נמוכה יותר אם אתחול המפענחים העיקריים נכשל. עלול לגרום לביצועי נגינה נחותים לעומת מפענחים ראשיים תמיד להשתמש במעקף הגדרות משטח פלט הווידאו של ExoPlayer - המעקף הזה משחרר ומקים מחדש את מפענחי הווידאו כשמשתנה שינוי במשטח, במקום להגדיר את המשטח למפענח ישירות. כבר נעשה בזה שימוש על ידי ExoPlayer בחלק מהמכשירים עם התקלה הזאת, הגדרה זו משפיעה על Android 6 ומעלה בלבד -\n -\nהפעלת האפשרות עשויה למנוע שגיאות נגינה בעת חזרה לנגן הווידאו הנוכחית או במעבר למסך מלא + המעקף הזה משחרר ומקים מחדש את מפענחי הווידאו כשמשתנה שינוי במשטח, במקום להגדיר את המשטח למפענח ישירות. כבר נעשה בזה שימוש על ידי ExoPlayer בחלק מהמכשירים עם התקלה הזאת, הגדרה זו משפיעה על Android 6 ומעלה בלבד \n \nהפעלת האפשרות עשויה למנוע שגיאות נגינה בעת חזרה לנגן הווידאו הנוכחית או במעבר למסך מלא מקום לשוניות ראשיות להעביר את בורר הלשוניות הראשי לתחתית %1$s %2$s @@ -819,8 +766,7 @@ תמונות ממוזערות שיתוף רשימת כתובות שיתוף עם כותרות - %1$s -\n%2$s + %1$s \n%2$s שיתוף רשימת נגינה - %1$s: %2$s להציג עוד @@ -831,16 +777,13 @@ %s תשובות אפשר לערוך כל פעולה בהתראה להלן על ידי נגיעה בה. שלוש הפעולות הראשונות (נגינה/השהיה, הקודם והבא) מוגדרות על ידי המערכת ונעולות לעריכה. - NewPipe יכול לבדוק אוטומטית אם יש גרסאות חדשות מעת לעת ולהודיע כאשר הן זמינות. -\nלהפעיל את היכולת הזאת? + NewPipe יכול לבדוק אוטומטית אם יש גרסאות חדשות מעת לעת ולהודיע כאשר הן זמינות. \nלהפעיל את היכולת הזאת? איפוס הגדרות איפוס כל ההגדרות לערכי ברירת המחדל שלהן כן לא גיבוי ושחזור - איפוס כל ההגדרות ימחק את כל ההגדרות המועדפות שלך ויפעיל את היישומון מחדש. -\n -\nלהמשיך? + איפוס כל ההגדרות ימחק את כל ההגדרות המועדפות שלך ויפעיל את היישומון מחדש. \n \nלהמשיך? אין מספיק מקום פנוי במכשיר ההגדרות בייצוא המיובא משתמשות בתסדיר פגיע שהוצא משימוש מאז NewPipe 0.27.0. יש לוודא שהייצוא המיובא הוא ממקור מהימן, ועדיף להשתמש רק בייצוא שהושג מ־NewPipe 0.27.0 ומעלה בעתיד. תמיכה בייבוא הגדרות בתסדיר פגיע זה תוסר בקרוב לחלוטין, ואז גרסאות ישנות של NewPipe לא יוכלו לייבא עוד הגדרות של ייצוא מגרסאות חדשות. משני diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 0f6eed64b..ce9fa70c5 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -39,7 +39,7 @@ ऑडियो सेटिंग्स आरंभ करने के लिए आवर्धक कांच को स्पर्श करें। रद्द करें - क्या आप का मतलब \"%1$s\" था\? + क्या आप का मतलब \"%1$s\" था? के साथ शेयर करें बाहरी वीडियो प्लेयर का उपयोग करें कुछ रिजॉल्युशनों पर ध्वनि हट सकती है @@ -58,7 +58,7 @@ उच्च रिजॉल्युशन दिखाएं केवल कुछ ही डिवाईस 2K/4K में वीडियो चला सकते हैं Kodi में चलाएं - गैर- मौजूदा Kore ऐप इंस्टॉल करें\? + गैर- मौजूदा Kore ऐप इंस्टॉल करें? \"Kodi में चलाएं\" वाला विकल्प दिखाएँ Kodi मीडिया सेंटर से वीडियो चलने के लिए विकल्प प्रदर्शित करें डिफ़ॉल्ट ऑडियो फॉर्मेट @@ -152,8 +152,7 @@ कृपया प्रतीक्षा करें… क्लिपबोर्ड पर कॉपी हो गया है कृपया बाद में सेटिंग्स में डाउनलोड स्थान चुनें - पॉपअप मोड में खोलने के लिए -\nइस अनुमति की जरुरत है + पॉपअप मोड में खोलने के लिए \nइस अनुमति की जरुरत है reCAPTCHA चुनौती reCAPTCHA चुनौती का अनुरोध किया डाउनलोड @@ -165,7 +164,7 @@ %2$s के द्वारा © %1$s जो %3$s के अधीन आते हैं एंड्राइड के लिए हल्का और मुफ्त स्ट्रीमिंग एप्लिकेशन। अगर आपके पास कोई सुझाव हो जैसे कि - अनुवाद करना, डिजाईन में बदलाव करना, कोड को साफ़ रखना, या फिर कोड में जायदा बदलाव लाना हो तो - सहायता के लिए आपका स्वागत है। जितना ज्यादा होगा उतना बेहतर होगा ! - क्या आप इसको खोज इतिहास से मिटाना चाहते हैं \? + क्या आप इसको खोज इतिहास से मिटाना चाहते हैं ? मुख्य पृष्ठ की विषयवस्तु खाली पन्ना कियोस्क पन्ना @@ -229,7 +228,7 @@ प्लेलिस्ट थंमनेल के रूप में सैंट करें प्लेलिस्ट बुकमार्क करें बुकमार्क हटायें - प्लेलिस्ट को मिटाना चाहते हैं\? + प्लेलिस्ट को मिटाना चाहते हैं? प्लेलिस्ट बना दी गई प्लेलिस्ट में जोड़ा गया प्लेलिस्ट का थंमनेल बदल दिया गया। @@ -256,11 +255,11 @@ उपभोगता देखे हुए वीडियो की सूची साफ करें चलाई गए स्ट्रीमों के इतिहास और प्लेबैक स्थानों को मिटाता है - क्या देखा गया सब इतिहास मिटा दिया जाए\? + क्या देखा गया सब इतिहास मिटा दिया जाए? देखा हुआ इतिहास मिटा दिया गया खोज इतिहास को साफ करें खोजे गए शब्दों का इतिहास साफ करता है - पूरे खोज इतिहास को मिटा दें\? + पूरे खोज इतिहास को मिटा दें? खोज इतिहास मिटाया गया ऐसा कोई फ़ोल्डर मौजूद नहीं अमान्य फाइल/विषय - वस्तु का स्रोत @@ -272,7 +271,7 @@ न्यूपाइप की प्राइवेसी पॉलिसी न्यूपाइप परियोजना आपकी गोपनीयता को बहुत गंभीर रूप से लेता है। इसलिए, ऐप आपकी अनुमति के बिना कोई डेटा जमा नहीं करता।\nन्यूपाइप की गोपनीयता नीति विस्तार से समझाती है कि कौनसा डेटा भेजा और संग्रह किया जाता है जब आप क्रेश विवरण भेजते हैं। प्राइवेसी पॉलिसी पढ़ें - क्या आप सेटिंग्स भी आयात करना चाहते हैं\? + क्या आप सेटिंग्स भी आयात करना चाहते हैं? \'खोलने\' पर तरजीही एक्शन सामग्री खोलते समय डिफ़ॉल्ट कारवाही — %s अनुशीर्षक @@ -286,19 +285,9 @@ पहले वाला निर्यात सब्सक्रिप्शन आयात नहीं कर सके सब्सक्रिप्शन निर्यात नहीं कर सके - गूगल टेकआउट से यूट्यूब सदस्यता आयात करें: -\n -\n1. इस यूआरएल पर जाएं: %1$s -\n2. पूछे जाने पर लॉग इन करें -\n3. \"सभी डाटा शामिल करें\" पर क्लिक करें, फिर \"सभी को अचयनित करें\" पर, फिर केवल \"सदस्यताएँ\" चुनें और \" ठीक है\" पर क्लिक करें -\n4. \"अगला चरण\" पर क्लिक करें और फिर \"निर्यात बनाएं\" -\n5. प्रकट होने के बाद \"डाउनलोड\" बटन पर क्लिक करें -\n6. नीचे आयात फ़ाइल पर क्लिक करें और डाउनलोड की गई .zip फ़ाइल चुनें -\n7. [यदि .zip आयात विफल हो जाता है] .csv फ़ाइल निकालें (आमतौर पर \"यूट्यूब और यूट्यूब म्युज़िक/सब्सक्रिपशन/subscriptions.csv\" के अंतर्गत), नीचे आयात फ़ाइल पर क्लिक करें और निकाली गई सीएसवी फ़ाइल चुनें + गूगल टेकआउट से यूट्यूब सदस्यता आयात करें: \n \n1. इस यूआरएल पर जाएं: %1$s \n2. पूछे जाने पर लॉग इन करें \n3. \"सभी डाटा शामिल करें\" पर क्लिक करें, फिर \"सभी को अचयनित करें\" पर, फिर केवल \"सदस्यताएँ\" चुनें और \" ठीक है\" पर क्लिक करें \n4. \"अगला चरण\" पर क्लिक करें और फिर \"निर्यात बनाएं\" \n5. प्रकट होने के बाद \"डाउनलोड\" बटन पर क्लिक करें \n6. नीचे आयात फ़ाइल पर क्लिक करें और डाउनलोड की गई .zip फ़ाइल चुनें \n7. [यदि .zip आयात विफल हो जाता है] .csv फ़ाइल निकालें (आमतौर पर \"यूट्यूब और यूट्यूब म्युज़िक/सब्सक्रिपशन/subscriptions.csv\" के अंतर्गत), नीचे आयात फ़ाइल पर क्लिक करें और निकाली गई सीएसवी फ़ाइल चुनें आपका आईडी, soundcloud.com/(आपका आईडी) - ध्यान रखें, यह तरीका नेटवर्क खर्चीला हो सकता है। -\n -\nक्या आप आगे बढ़ना चाहते हैं\? + ध्यान रखें, यह तरीका नेटवर्क खर्चीला हो सकता है। \n \nक्या आप आगे बढ़ना चाहते हैं? प्लेबैक स्पीड कंट्रोल ताल पिच @@ -324,9 +313,9 @@ ऐप अपडेट नोटीफिकेशन नए नयूपाईप अपडेट का नोटिफ़िकेशन एक्सटर्नल स्टोरेज अनुपलब्ध - SD कार्ड पर डाउनलोड करना संभव नहीं। डाउनलोड स्थान पुनः चुनें\? + SD कार्ड पर डाउनलोड करना संभव नहीं। डाउनलोड स्थान पुनः चुनें? डिफ़ॉल्टस पुन: स्थापित करें - क्या आप डिफ़ॉल्टस पर लौटना चाहते है\? + क्या आप डिफ़ॉल्टस पर लौटना चाहते है? सब्सक्राइबर संख्या अनुपलब्ध मुख्य पृष्ठ पर कौन से टैब दिखाए जाते हैं अपडेटस @@ -378,27 +367,20 @@ डिवाइस पर जगह समाप्त प्रगति खो गई, क्योंकि फ़ाइल मिटा दी गई थी कनेक्शन का समय समाप्त - क्या आप अपना डाउनलोड इतिहास मिटाना चाहते हैं या सभी डाउनलोड की गई फ़ाइलों को हटाना चाहते हैं\? + क्या आप अपना डाउनलोड इतिहास मिटाना चाहते हैं या सभी डाउनलोड की गई फ़ाइलों को हटाना चाहते हैं? डाउनलोड कतार सीमित करें एक ही समय में एक डाउनलोड चलेगा डाउनलोड प्रारंभ करें डाउनलोड रोकें डाउनलोड कहाँ करना है, के लिए पूछें - आपको हर डाउनलोड का स्थान पूछा जाएगा -\nयदि आप बाहरी एसडी कार्ड में डाउनलोड करना चाहते हैं तो सिस्टम फोल्डर पिकर (SAF) को सक्षम करें + आपको हर डाउनलोड का स्थान पूछा जाएगा \nयदि आप बाहरी एसडी कार्ड में डाउनलोड करना चाहते हैं तो सिस्टम फोल्डर पिकर (SAF) को सक्षम करें सिस्टम फोल्डर पिकर (SAF) का प्रयोग करें प्लेबैक स्थानों को मिटाएं सारे प्लेबैक स्थानों को मिटाता है - सारे प्लेबैक स्थानों को मिटाएं\? + सारे प्लेबैक स्थानों को मिटाएं? हैंडलिंग के बाद फ्रैगमेंट या एक्टिविटी लूप के बाहर अनहैंडल्ड Rx एक्सेप्शन की रिपोर्टिंग को बलपूर्वक लागू करें - साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: -\n -\n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करें (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) -\n2. इस युआरएल को खोलें: %1$s -\n3. लॉग इन करें -\n4. आप जिस प्रोफाइल युआरएल पे भेजे जाते हैं उसे कॉपी करें। - यूरोपीय जनरल डेटा प्रोटेक्शन रेगुलेशन (जीडीपीआर) का अनुपालन करने के लिए, हम आपका ध्यान न्यूपाइप की गोपनीयता नीति पे डालना चाहते हैं। इसे बारीकी से पढ़िए। -\nआपको अगर हमें कोई त्रुटि रिपोर्ट भेजना हो तो इसे स्वीकार करना होगा। + साउंडक्लाउड प्रोफाइल निर्यात करने के लिए आईडी या युआरएल दीजिये: \n \n1. अपने वेब ब्राउज़र में \"डेस्कटॉप मोड\" चालू करें (वेबसाइट मोबाइल उपकरणों के लिए उपलब्ध नहीं है) \n2. इस युआरएल को खोलें: %1$s \n3. लॉग इन करें \n4. आप जिस प्रोफाइल युआरएल पे भेजे जाते हैं उसे कॉपी करें। + यूरोपीय जनरल डेटा प्रोटेक्शन रेगुलेशन (जीडीपीआर) का अनुपालन करने के लिए, हम आपका ध्यान न्यूपाइप की गोपनीयता नीति पे डालना चाहते हैं। इसे बारीकी से पढ़िए। \nआपको अगर हमें कोई त्रुटि रिपोर्ट भेजना हो तो इसे स्वीकार करना होगा। सहेजे टैब्स को पढ़ने में रूकावट, इसलिए सामान्य टैब्स का इस्तेमाल हो रहा है जब नई अपडेट उपलब्ध हो, तब एप अपडेट करने के लिए अधिसूचना दिखाई जाये सूचि देखने वाला ढंग @@ -421,20 +403,8 @@ तेज मोड सक्षम करें तेज मोड अक्षम करें - क्या आपको लगता है कि फीड लोडिंग बहुत धीमी है\? यदि ऐसा है, तो तेज़ लोडिंग को सक्षम करने का प्रयास करें (आप इसे सेटिंग्स में या नीचे दिए गए बटन को दबाकर बदल सकते हैं)। -\n -\nन्यूपाइप दो फीड लोडिंग रणनीति प्रदान करता है: -\n• संपूर्ण सदस्यता चैनल प्राप्त करना, जो धीमा है लेकिन पूरा होता है। -\n• एक समर्पित सेवा के समापन बिंदु का उपयोग करना, जो तेज़ है लेकिन आमतौर पर पूरा नहीं होता है। -\n -\nदोनों के बीच अंतर यह है कि तेज वाली रणनीति में आमतौर पर कुछ जानकारी का अभाव होता है, जैसे कि आइटम की अवधि या प्रकार (लाइव वीडियो और सामान्य वीडियो के बीच अंतर पता नहीं लगा सकते हैं) और ऐसा भी हो सकता है कि ये कम आइटम दिखाए। -\n -\nयूट्यूब ऐसी सेवा का एक उदाहरण है जो आरएसएस फ़ीड के साथ ये तेज़ विधि प्रदान करता है। -\n -\nतो आखिर में चुनाव आपकी पसंद पर है: गति या फिर सटीक जानकारी। - यह सामग्री फिलहाल न्यूपाइप सपोर्ट नहीं करता है। -\n -\nआशा है कि भविष्य के संस्करणों में सपोर्ट किया जायेगा। + क्या आपको लगता है कि फीड लोडिंग बहुत धीमी है? यदि ऐसा है, तो तेज़ लोडिंग को सक्षम करने का प्रयास करें (आप इसे सेटिंग्स में या नीचे दिए गए बटन को दबाकर बदल सकते हैं)। \n \nन्यूपाइप दो फीड लोडिंग रणनीति प्रदान करता है: \n• संपूर्ण सदस्यता चैनल प्राप्त करना, जो धीमा है लेकिन पूरा होता है। \n• एक समर्पित सेवा के समापन बिंदु का उपयोग करना, जो तेज़ है लेकिन आमतौर पर पूरा नहीं होता है। \n \nदोनों के बीच अंतर यह है कि तेज वाली रणनीति में आमतौर पर कुछ जानकारी का अभाव होता है, जैसे कि आइटम की अवधि या प्रकार (लाइव वीडियो और सामान्य वीडियो के बीच अंतर पता नहीं लगा सकते हैं) और ऐसा भी हो सकता है कि ये कम आइटम दिखाए। \n \nयूट्यूब ऐसी सेवा का एक उदाहरण है जो आरएसएस फ़ीड के साथ ये तेज़ विधि प्रदान करता है। \n \nतो आखिर में चुनाव आपकी पसंद पर है: गति या फिर सटीक जानकारी। + यह सामग्री फिलहाल न्यूपाइप सपोर्ट नहीं करता है। \n \nआशा है कि भविष्य के संस्करणों में सपोर्ट किया जायेगा। चैनल का अवतार थंमनेल %s के द्वारा %s के द्वारा बनाया गया @@ -448,14 +418,12 @@ ReCAPTCHA कुकीज़ साफ़ करें एल्बम वीडियो - यह वीडियो उम्र प्रतिबंधित है। -\n -\nयदि आप इसे देखना चाहते हैं तो सेटिंग में \"%1$s\" चालू करें। + यह वीडियो उम्र प्रतिबंधित है। \n \nयदि आप इसे देखना चाहते हैं तो सेटिंग में \"%1$s\" चालू करें। यूट्यूब एक \"प्रतिबंधित मोड\" प्रदान करता है जो संभावित रूप से परिपक्व सामग्री को छुपाता है यूट्यूब का \"प्रतिबंधित मोड\" चालू करें वह सामग्री भी दिखाएं जो आयु सीमा की वजह से शायद बच्चों के लिए अनुपयुक्त हो (जैसे 18+) केवल HTTPS यूआरएल ही समर्थित हैं - URL की पहचान नहीं हो सकी। दूसरे ऐप से खोलें\? + URL की पहचान नहीं हो सकी। दूसरे ऐप से खोलें? ऑटो-कतारबद्ध करें कतार को मिटाने से पहले सत्यापन के लिए पूछें फास्ट-फॉरवर्ड/-रिवाइंड सीक अवधि @@ -529,8 +497,7 @@ अपनी पसंदीदा नाइट थीम चुने — %s आप अपनी पसंदीदा नाइट थीम नीचे चुन सकते हैं डाउनलोड शुरू हुआ - यह वीडियो आयु-प्रतिबंधित है। -\nयूट्यूब की नई नीतियों के कारण न्यूपाइप किसी भी आयु प्रतिबंधित वीडियो स्ट्रीम का इस्तेमाल नहीं कर सकता है और इस कारण इसे वीडियो को प्ले करने में असमर्थ है। + यह वीडियो आयु-प्रतिबंधित है। \nयूट्यूब की नई नीतियों के कारण न्यूपाइप किसी भी आयु प्रतिबंधित वीडियो स्ट्रीम का इस्तेमाल नहीं कर सकता है और इस कारण इसे वीडियो को प्ले करने में असमर्थ है। पियरट्यूब इंसटैंस फीचर्ड रात्रि थीम @@ -579,7 +546,7 @@ उच्च गुणवत्ता (बड़ा) अपडेटस के लिए जांच हो रही है… पुन: प्राप्ति हो रही - डिस्क से सभी डाउनलोड की गई फ़ाइलें मिटाएं\? + डिस्क से सभी डाउनलोड की गई फ़ाइलें मिटाएं? एंड्रॉइड 10 से शुरू होकर केवल \'स्टोरेज एक्सेस फ्रेमवर्क\' समर्थित है एक इंस्टेंस चुनें हां, और आंशिक रूप से देखे गए वीडियो भी @@ -636,7 +603,7 @@ प्लेबैक लोड अंतराल आकार समूह का नाम नहीं सब्सक्रिप्शनस चुनें - क्या आप इस समूह को हटाना चाहते हैं\? + क्या आप इस समूह को हटाना चाहते हैं? नया फ़ीड नये फ़ीड आइटम @@ -678,12 +645,9 @@ केवल असमूहीकृत सब्सक्रिप्शनस दिखाएं फ़ास्ट फ़ीड मोड इस पर अधिक जानकारी प्रदान नहीं करता है। अपडेट अंतराल जब सब्सक्रिप्शन फ़ीड दोबारा अपडेट किये जा सकें — %s - लेखक का खाता समाप्त कर दिया गया है। -\nन्यूपाइप भविष्य में इस फीड को लोड नहीं कर पाएगा। -\nक्या आप इस चैनल की सदस्यता समाप्त करना चाहते हैं\? + लेखक का खाता समाप्त कर दिया गया है। \nन्यूपाइप भविष्य में इस फीड को लोड नहीं कर पाएगा। \nक्या आप इस चैनल की सदस्यता समाप्त करना चाहते हैं? चयनित स्ट्रीम बाहरी प्लेयरस द्वारा समर्थित नहीं है - इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला। -\nकृपया स्टोरेज एक्सेस फ्रेमवर्क संगत फ़ाइल प्रबंधक इंस्टॉल करें + इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला। \nकृपया स्टोरेज एक्सेस फ्रेमवर्क संगत फ़ाइल प्रबंधक इंस्टॉल करें निजी आंतरिक पिन की हुई टिप्पणी @@ -693,8 +657,7 @@ बाहरी प्लेयरस के लिए कोई वीडियो स्ट्रीम उपलब्ध नहीं है बाहरी प्लेयरस के लिए कोई ऑडियो स्ट्रीम उपलब्ध नहीं है कुछ सेवाओं में उपलब्ध, यह आमतौर पर बहुत तेज होता है लेकिन सीमित मात्रा में जानकारी प्रदान कर पाता है और वह भी अक्सर अधूरी जानकारी (जैसे कि अवधि, आइटम की किसम, स्ट्रीम लाइव है, नहीं बता पाता) - इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला। -\nकृपया फ़ाइल प्रबंधक इंस्टॉल करें या डाउनलोड सेटिंग में \'%s\' को अक्षम करने का प्रयास करें + इस क्रिया के लिए कोई उपयुक्त फ़ाइल प्रबंधक नहीं मिला। \nकृपया फ़ाइल प्रबंधक इंस्टॉल करें या डाउनलोड सेटिंग में \'%s\' को अक्षम करने का प्रयास करें %1$s डाउनलोड हटाए गए %1$s डाउनलोड्स हटाए गए @@ -711,8 +674,8 @@ धुंधली की गई प्‍लेलिस्‍ट में पहले से ही यह आइटम है। डुप्लीकेट जोड़ा गया %d बार डुप्लीकेट हटाएं - डुप्लीकेट हटाए जाएं\? - क्या आप इस प्लेलिस्ट में मौजूद सभी डुप्लीकेट स्ट्रीम हटाना चाहते हैं\? + डुप्लीकेट हटाए जाएं? + क्या आप इस प्लेलिस्ट में मौजूद सभी डुप्लीकेट स्ट्रीम हटाना चाहते हैं? निम्नलिखित स्ट्रीम दिखाएँ आगामी हार्डवेयर मीडिया बटन घटनाओं की अनदेखी करें @@ -744,9 +707,7 @@ एक ऑडियो ट्रैक पहले से ही इस स्ट्रीम में मौजूद होना चाहिए इस विकल्प को सक्षम करें यदि आपके पास डिकोडर आरंभीकरण समस्याएं हैं, जो प्राथमिक डिकोडर आरंभ करने में विफल होने पर कम प्राथमिकता वाले डिकोडर पर वापस आ जाती है। इससे प्राथमिक डिकोडर का उपयोग करने की तुलना में खराब प्लेबैक प्रदर्शन हो सकता है कुछ एक्सोप्लेयर सेटिंग्स प्रबंधित करें। इन परिवर्तनों को प्रभावी बनाने के लिए प्लेयर को पुनरारंभ करने की आवश्यकता होती है - सतह को सीधे कोडेक पर सेट करने के बजाय, सतह परिवर्तन होने पर यह वर्कअराउंड वीडियो कोडेक्स को जारी और पुन: चालू करता है। इस समस्या के साथ कुछ उपकरणों पर ExoPlayer द्वारा पहले से ही उपयोग किया जाता है, इस सेटिंग का केवल Android 6 और उच्चतर पर प्रभाव पड़ता है -\n -\nइस विकल्प को सक्षम करने से वर्तमान वीडियो प्लेयर स्विच करते समय या फुलस्क्रीन पर स्विच करते समय प्लेबैक त्रुटियों को रोका जा सकता है + सतह को सीधे कोडेक पर सेट करने के बजाय, सतह परिवर्तन होने पर यह वर्कअराउंड वीडियो कोडेक्स को जारी और पुन: चालू करता है। इस समस्या के साथ कुछ उपकरणों पर ExoPlayer द्वारा पहले से ही उपयोग किया जाता है, इस सेटिंग का केवल Android 6 और उच्चतर पर प्रभाव पड़ता है \n \nइस विकल्प को सक्षम करने से वर्तमान वीडियो प्लेयर स्विच करते समय या फुलस्क्रीन पर स्विच करते समय प्लेबैक त्रुटियों को रोका जा सकता है मुख्य टैब की स्थिति मुख्य टैब सिलेक्टर को नीचे ले जाएँ %1$s %2$s @@ -792,8 +753,7 @@ थंमनेल URL सूची साझा करें शीर्षकों के साथ साझा करें - %1$s -\n%2$s + %1$s \n%2$s प्लेलिस्ट साझा करें - %1$s: %2$s @@ -803,13 +763,10 @@ और दिखाओ नीचे दी गई प्रत्येक अधिसूचना कार्रवाई पर टैप करके उसे संपादित करें। पहली तीन क्रियाएँ (चलाएँ/रोकें, पिछली और अगली) सिस्टम द्वारा निर्धारित की जाती हैं और इन्हें अनुकूलित नहीं किया जा सकता है। कम दिखाएं - न्यूपाइप समय-समय पर स्वचालित रूप से नए संस्करणों की जांच कर सकती है और उपलब्ध होने पर आपको सूचित कर सकती है। -\nक्या आप इसे सक्षम करना चाहते हैं? + न्यूपाइप समय-समय पर स्वचालित रूप से नए संस्करणों की जांच कर सकती है और उपलब्ध होने पर आपको सूचित कर सकती है। \nक्या आप इसे सक्षम करना चाहते हैं? सेटिंग्स रीसेट करें सभी सेटिंग्स को उनके डिफ़ॉल्ट मानों पर रीसेट करें - सभी सेटिंग्स को रीसेट करने से आपकी सभी पसंदीदा सेटिंग्स खारिज हो जाएंगी और ऐप पुनः प्रारंभ हो जाएगा। -\n -\nक्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं? + सभी सेटिंग्स को रीसेट करने से आपकी सभी पसंदीदा सेटिंग्स खारिज हो जाएंगी और ऐप पुनः प्रारंभ हो जाएगा। \n \nक्या आप सुनिश्चित रूप से आगे बढ़ना चाहते हैं? हाँ नहीं डिवाइस पर पर्याप्त खाली स्थान नहीं है diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index d89285159..047981154 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -11,7 +11,7 @@ Preuzimanje Pretraga Postavke - Misliš li „%1$s”\? + Misliš li „%1$s”? Dijeli s Koristi vanjski video player Uklanja audiosnimku pri nekim rezolucijama @@ -110,8 +110,7 @@ Pričekaj … Kopirano u međuspremnik Odaberi mapu za preuzimanje kasnije u postavkama - Ova dozvola je potrebna za -\notvaranje skočnog prozora + Ova dozvola je potrebna za \notvaranje skočnog prozora reCAPTCHA zadatak Zatražen je reCAPTCHA zadatak Preuzimanja @@ -165,7 +164,7 @@ Oporavljanje od greške playera Prikaži savjet za držanje Prikaži savjet kad se pritisne gumb za pozadinu ili skočni gumb u videu „Detalji:” - Želiš li izbrisati ovu stavku iz povijesti pretrage\? + Želiš li izbrisati ovu stavku iz povijesti pretrage? Sadržaj Prazna stranica Stranica kioska @@ -200,7 +199,7 @@ Postavi kao sličicu playliste Zabilježi playlistu Ukloni zabilješku - Izbrisati ovu playlistu\? + Izbrisati ovu playlistu? Playlista je stvorena Dodano u playlistu Sličica playliste je promijenjena. @@ -232,10 +231,10 @@ Izvezi povijest, pretplate, playliste i postavke Izbriši povijest gledanja Briše povijest reproduciranih tokova i pozicije reprodukcije - Izbrisati cijelu povijest gledanja\? + Izbrisati cijelu povijest gledanja? Povijest gledanja je izbrisana Izbriši povijest pretraživanja - Izbrisati cijelu povijest pretraživanja\? + Izbrisati cijelu povijest pretraživanja? Povijest pretraživanja je izbrisana Nema takve mape Naziv datoteke ne može biti prazan @@ -256,7 +255,7 @@ Nema važeće ZIP datoteke Upozorenje: Nije moguće uvesti sve datoteke. Ovo će prepisati tvoje trenutačne postavke. - Želiš li također uvesti postavke\? + Želiš li također uvesti postavke? Uvoz Uvoz iz Izvoz u @@ -266,19 +265,9 @@ Prethodni izvoz Nije bilo moguće uvesti pretplate Nije bilo moguće izvesti pretplate - Uvezi pretplate na YouTubu pomoću Google Takeouta: -\n -\n1. Idi na ovaj URL: %1$s -\n2. Prijavi se -\n3. Pritisni „Uključeni svi podaci”, zatim „Poništi odabir svih”, a zatim odaberi samo „pretplate” i pritisni „U redu” -\n4. Pritisni „Sljedeći korak”, a zatim „Stvori izvoz” -\n5. Pritisni gumb „Preuzmi” nakon što se pojavi -\n6. Dolje pritisni UVEZI DATOEKU i odaberi preuzetu .zip datoteku -\n7. [Ako uvoz .zip datoteke ne uspije] izdvoji .csv datoteku (pod „YouTube and YouTube Music/subscriptions/subscriptions.json”), dolje pritisni UVEZI DATOTEKU i odaberi izdvojenu csv datoteku + Uvezi pretplate na YouTubu pomoću Google Takeouta: \n \n1. Idi na ovaj URL: %1$s \n2. Prijavi se \n3. Pritisni „Uključeni svi podaci”, zatim „Poništi odabir svih”, a zatim odaberi samo „pretplate” i pritisni „U redu” \n4. Pritisni „Sljedeći korak”, a zatim „Stvori izvoz” \n5. Pritisni gumb „Preuzmi” nakon što se pojavi \n6. Dolje pritisni UVEZI DATOEKU i odaberi preuzetu .zip datoteku \n7. [Ako uvoz .zip datoteke ne uspije] izdvoji .csv datoteku (pod „YouTube and YouTube Music/subscriptions/subscriptions.json”), dolje pritisni UVEZI DATOTEKU i odaberi izdvojenu csv datoteku tvojID, soundcloud.com/tvojid - Ova operacija može prouzročiti veliku potrošnju mrežnog prometa. -\n -\nŽeliš li nastaviti\? + Ova operacija može prouzročiti veliku potrošnju mrežnog prometa. \n \nŽeliš li nastaviti? Kontrole brzine reprodukcije Premotaj naprijed tijekom šutnje Korak @@ -323,7 +312,7 @@ Nema dostupnih zapisa za preuzimanje Nije bilo moguće čitati spremljene kartice, stoga se koriste zadane Obnovi standardne vrijednosti - Želiš li obnoviti standardne vrijednosti\? + Želiš li obnoviti standardne vrijednosti? Broj pretplatnika nije dostupan NewPipe razvijaju volonteri koji provode vrijeme kako bi doprinijeli najboljem korisničkom iskustvu. Doprinesi programerima kako bi poboljšali NewPipe dok uživaju u šalici kave. Koje su kartice prikazane na glavnoj stranici @@ -333,12 +322,7 @@ Titlovi Promijeni veličinu titlova i stilove pozadine playera. Zahtijeva ponovno pokretanje aplikacije Prisilno izvijesti o neisporučivim Rx iznimaka izvan fragmenta ili životnog ciklusa aktivnosti nakon odlaganja - Uvezi SoundCloud profil upisom URL-a ili svog ID-a: -\n -\n1. Omogući „način rada na radnoj površini” u web-pregledniku (stranica nije dostupna na mobilnim uređajima) -\n2. Idi na ovaj URL: %1$s -\n3. Prijavi se -\n4. Kopiraj URL profila na koji te se preusmjerava. + Uvezi SoundCloud profil upisom URL-a ili svog ID-a: \n \n1. Omogući „način rada na radnoj površini” u web-pregledniku (stranica nije dostupna na mobilnim uređajima) \n2. Idi na ovaj URL: %1$s \n3. Prijavi se \n4. Kopiraj URL profila na koji te se preusmjerava. Brzina Visina tona Odspoji (može prouzročiti izobličenje) @@ -382,8 +366,7 @@ Zatvori NewPipe je copyleft libre softver: Može se koristiti, proučavati i poboljšavati po volji. Konkretno, može se redistribuirati i / ili modificirati pod uvjetima GNU opće javne licence koju je objavila zaklada Free Software Foundation, pod verzijom 3 licence, ili (po vlastitom izboru) bilo koje kasnije verzije. Projekt NewPipe ozbiljno shvaća temu o privatnosti. Stoga aplikacija ne prikuplja podatke bez tvog pristanka. \nNewPipeova pravila o privatnosti detaljno objašnjavaju koji se podaci šalju i spremaju kad šalješ izvještaje o prekidu rada aplikacije. - Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), ovime upozoravamo na NewPipe politiku privatnosti. Pažljivo je pročitaj. -\nZa slanje izvješća o pogreškama moraš prihvatiti politiku privatnosti. + Kako bismo se uskladili s Europskom općom uredbom o zaštiti podataka (GDPR), ovime upozoravamo na NewPipe politiku privatnosti. Pažljivo je pročitaj. \nZa slanje izvješća o pogreškama moraš prihvatiti politiku privatnosti. Nastavi reprodukciju Obnovi zadnji položaj reprodukcije Pozicije na popisima @@ -393,13 +376,13 @@ Datoteka je premještena ili izbrisana Datoteka s ovim nazivom već čeka na preuzimanje Vrijeme povezanosti je isteklo - Želiš li izbrisati povijest preuzimanja ili izbrisati sve preuzete datoteke\? + Želiš li izbrisati povijest preuzimanja ili izbrisati sve preuzete datoteke? Započni preuzimanja Zaustavi preuzimanja Pitaj gdje preuzeti Izbriši poziciju reprodukcije Izbriši sve pozicije reprodukcije - Izbrisati sve pozicije reprodukcije\? + Izbrisati sve pozicije reprodukcije? Nitko ne gleda Nitko ne sluša Standardni kiosk @@ -416,7 +399,7 @@ Isključi zvuk Uključi Učitavanje feeda … - Želiš li izbrisati ovu grupu\? + Želiš li izbrisati ovu grupu? Nova Uvijek aktualiziraj Uključi brzi modus @@ -503,8 +486,7 @@ Grupe kanala Da, i djelomično pogledana videa Odaberi jednu instancu - Aplikacija će te pitati kamo spremati preuzimanja. -\nUključi sustavksi birač mapa (SAF) ako želiš preuzeti na eksternu SD karticu + Aplikacija će te pitati kamo spremati preuzimanja. \nUključi sustavksi birač mapa (SAF) ako želiš preuzeti na eksternu SD karticu Nije moguće obnoviti ovo preuzimanje Napredak je izgubljen, jer je datoteka izbrisana NewPipe se zatvorio tijekom rada s datotekom @@ -526,9 +508,7 @@ Izbriši kolačiće koje NewPipe sprema nakon rješavanja reCAPTCHA reCAPTCHA kolačići su izbrisani Izbriši reCAPTCHA kolačiće - Ovaj video je dobno ograničen. -\n -\nZa prikaz sadržaja uključi „%1$s” u postavkama. + Ovaj video je dobno ograničen. \n \nZa prikaz sadržaja uključi „%1$s” u postavkama. YouTube nudi postavku „Ograničeni način rada”, čime se skriva sadržaj za odrasle Uključi YouTube postavku „Ograničeni način rada” Prikaži sadržaj koji vjerojatno nije prikladan za djecu, jer je dobno ograničen (kategorija 18) @@ -548,26 +528,14 @@ Zbog ograničenja ExoPlayera, trajanje premotavanja postavljeno je na %d s Neka Android prilagodi boju obavijesti prema glavnoj boji sličice (ovo nije dostupno na svim uređajima) Oboji obavijest - NewPipe još ne podržava ovaj sadržaj. -\n -\nNadamo se da će biti podržan u budućoj verziji. + NewPipe još ne podržava ovaj sadržaj. \n \nNadamo se da će biti podržan u budućoj verziji. Koristi sličicu za pozadinu zaključanog ekrana i za obavijesti Prikaži sličicu Prikaži izvorno vrijeme stavki „Storage Access Framework” dozvoljava preuzimanje na eksternu SD karticu Izvorni tekstovi usluga bit će vidljivi u stavkama prijenosa Dostupno je u nekim uslugama. Obično je puno brže, ali može dohvatiti ograničenu količinu stavki i često nepotpune podatke (npr. bez trajanja, vrste stavke, bez stanja uživo) - Misliš da je učitavanje feeda presporo\? Ako da, pokušaj omogućiti brzo učitavanje (možeš ga promijeniti u postavkama ili pritiskom na donji gumb). -\n -\nNewPipe nudi dvije strategije učitavanja feeda: -\n• Dohvaćanje cijelog pretplatničkog kanala, što je sporo, ali cjelovito. -\n• Korištenje namjenske krajnje točke usluge, što je brzo, ali obično nepotpuno. -\n -\nRazlika je u tome što pri brzom načinu obično nedostaju neke informacije, poput trajanja ili vrste stavki (ne može razlikovati videa uživo od običnih videa), a možda će vratiti i manje stavki. -\n -\nYouTube je primjer usluge koja nudi ovaj brzi način sa svojim RSS feedom. -\n -\nDakle, izbor se svodi na ono što više voliš: brzinu ili precizne informacije. + Misliš da je učitavanje feeda presporo? Ako da, pokušaj omogućiti brzo učitavanje (možeš ga promijeniti u postavkama ili pritiskom na donji gumb). \n \nNewPipe nudi dvije strategije učitavanja feeda: \n• Dohvaćanje cijelog pretplatničkog kanala, što je sporo, ali cjelovito. \n• Korištenje namjenske krajnje točke usluge, što je brzo, ali obično nepotpuno. \n \nRazlika je u tome što pri brzom načinu obično nedostaju neke informacije, poput trajanja ili vrste stavki (ne može razlikovati videa uživo od običnih videa), a možda će vratiti i manje stavki. \n \nYouTube je primjer usluge koja nudi ovaj brzi način sa svojim RSS feedom. \n \nDakle, izbor se svodi na ono što više voliš: brzinu ili precizne informacije. Izračunavanje šifre Obavijest šifriranja videa Obavijesti o napretku šifriranja videa @@ -583,8 +551,7 @@ Prikaži opis Otvori pomoću Ovo je SoundCloud Go+ snimka (barem u tvojoj zemlji), stoga ga NewPipe ne može emitirati ili preuzeti. - Ovaj je video dobno ograničen. -\nZbog novih YouTube pravila za videa s dobnim ograničenjem, NewPipe ne može pristupiti nijednoj vlastitoj video emisiji i stoga je ne može reproducirati. + Ovaj je video dobno ograničen. \nZbog novih YouTube pravila za videa s dobnim ograničenjem, NewPipe ne može pristupiti nijednoj vlastitoj video emisiji i stoga je ne može reproducirati. Preuzimanje je započeto Dolje možete odabrati željenu noćnu temu Odaberi željenu noćnu temu – %s @@ -619,9 +586,7 @@ Isključi biranje teksta u opisu Omogući biranje teksta u opisu Račun ukinut - Autorov račun je ukinut. -\nNewPipe ubuduće neće moći učitavati ovaj feed. -\nŽeliš li otkazati pretplatu na ovaj kanal\? + Autorov račun je ukinut. \nNewPipe ubuduće neće moći učitavati ovaj feed. \nŽeliš li otkazati pretplatu na ovaj kanal? Nije bilo moguće učitati feed za „%s”. Pogreška pri učitavanju feeda Počevši od Androida 10, podržano je samo radno okruženje „Storage Access Framework” @@ -670,7 +635,7 @@ Obavijesti Novi videozapisi Obavijesti novih tokova od pretplaćenih kanala - Želiš li izbrisati sve preuzete datoteke\? + Želiš li izbrisati sve preuzete datoteke? Obavijesti su isljučene Pretplatio/la si se na ovaj kanal , @@ -685,8 +650,7 @@ Obavijesti o novim tokovima Potrebna mrežna veza Primaj obavijesti - Za ovu radnju nije pronađen odgovarajući upravljač datoteka. -\nInstaliraj upravljač datoteka ili pokušaj isključiti „%s” u postavkama preuzimanja + Za ovu radnju nije pronađen odgovarajući upravljač datoteka. \nInstaliraj upravljač datoteka ili pokušaj isključiti „%s” u postavkama preuzimanja Prikvačeni komentar Prikazuje opciju prekida rada kad se player koristi Prikaži „Prekini rad playera” @@ -707,8 +671,7 @@ Nema audio prijenosa za eksterne playere Nema video prijenosa za eksterne playere Odaberi kvalitetu za eksterne playere - Za ovu radnju nije pronađen odgovrajući upravljač datoteka. -\nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka + Za ovu radnju nije pronađen odgovrajući upravljač datoteka. \nInstaliraj „Storage Access Framework” kompatibilni upravljač datoteka Uredite neke ExoPlayer postavke. Ove promjene zahtjevaju ponovo pokretanje aplikacije Desna gesta Odaberite gestu za lijevu polovicu zaslona @@ -803,8 +766,7 @@ Otvori popis reprodukcije Reproduciraj Dijeli playlistu - %1$s -\n%2$s + %1$s \n%2$s %s odgovor %s odgovora @@ -816,13 +778,10 @@ Aktiviraj ovu opciju ako imaš problema s inicijaliziranjem dekodera, što vraća dekodere nižeg prioriteta ako inicijaliziranje primarnih dekodera ne uspije. To može rezultirati lošijim performansama reprodukcije u odnosu na korištenje primarnih dekodera Nedovoljno memorije na uređaju Spremanje sigurnosne kopije i obnavljanje - NewPipe može automatski tražiti nove verzije i obavijestiti te. -\nŽeliš li aktivirati tu mogućnost? + NewPipe može automatski tražiti nove verzije i obavijestiti te. \nŽeliš li aktivirati tu mogućnost? Obnovi postavke Obnovi sve postavke na zadane vrijednosti - Obnavljanje svih postavki odbacit će sve tvoje postavljene postavke i aplikacija će se ponovo pokrenuti. -\n -\nStvarno želiš nastaviti? + Obnavljanje svih postavki odbacit će sve tvoje postavljene postavke i aplikacija će se ponovo pokrenuti. \n \nStvarno želiš nastaviti? Uvijek koristi ExoPlayer postavku zaobilaženja videa za izlaznu površinu Kartice za dohvaćanje prilikom aktualiziranja feeda. Ova opcija nema učinka ako se kanal aktualizira pomoću brzog modusa. sekundarno diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 28aee0886..db204fb1a 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -1,7 +1,7 @@ Közzétéve: %1$s - Nem található megfelelő médialejátszó. Telepíti a VLC-t\? + Nem található megfelelő médialejátszó. Telepíti a VLC-t? Telepítés Mégse Megnyitás böngészőben @@ -9,16 +9,16 @@ Letöltés Keresés Beállítások - Erre gondolt: „%1$s”\? + Erre gondolt: „%1$s”? Megosztás ezzel - Videófájlok letöltési mappája - A letöltött videófájlok itt lesznek tárolva + Videóletöltési mappa + A letöltött videófájlok tárolási helye Válasszon letöltési mappát a videófájloknak Alapértelmezett felbontás Lejátszás Kodival Telepíti a hiányzó Kore alkalmazást? - A „Lejátszás Kodival” lehetőség megjelenítése - A videók Kodi médiaközponttal történő lejátszásának megjelenítése + „Lejátszás Kodival” lehetőség megjelenítése + Lehetőség megjelenítése a videó Kodi médialejátszóval történő lejátszására Hang Alapértelmezett hangformátum Letöltés @@ -35,8 +35,8 @@ Sötét Világos Téma - Hangfájlok letöltési mappája - A letöltött hangfájlok itt lesznek tárolva + Hangletöltési mappa + A letöltött hangfájlok tárolási helye Tetszik Nem tetszik Videó lejátszása, hossz: @@ -51,7 +51,7 @@ Ez történt: Saját megjegyzés (angolul): Részletek: - Elnézést, valami balul sült el. + Sajnáljuk, hiba történt. Elnézést, ennek nem kellett volna megtörténnie. Jelentés e-mailben Nem sikerült a letöltési menü beállítása @@ -76,7 +76,7 @@ Koppintson a részletekért Kis türelmet… Vágólapra másolva - Adjon meg később egy letöltési mappát a beállításokban + Később állítson be egy letöltési mappát a beállításokban Csatornáról leiratkozva Nem sikerült megváltoztatni a feliratkozást Nem sikerült frissíteni a feliratkozást @@ -87,25 +87,25 @@ Felugró ablak Nem található lejátszó a közvetítéshez (a lejátszásához telepítheti a VLC-t). Megnyitás felugró módban - Néhány felbontásnál eltávolítja a hangot + Bizonyos felbontásoknál eltávolítja a hangsávot Feliratkozás Feliratkozva - További információ - Felugró ablak alapértelmezett felbontása + Információ megjelenítése + Alapértelmezett felugró ablak felbontása Magasabb felbontások megjelenítése - Csak bizonyos eszközök tudnak 2K/4K-s videókat lejátszani + Csak bizonyos eszközök képesek 2K/4K felbontású videók lejátszására Alapértelmezett videóformátum Fekete - Felugró ablak tulajdonságainak megjegyzése - A felugró ablak előző helyének és méretének megjegyzése + Felugró lejátszó beállításainak megjegyzése + A felugró lejátszó legutóbbi méretének és pozíciójának megjegyzése Keresési javaslatok Válassza ki a keresési javaslatokat keresés közben Keresési előzmények Megtekintési előzmények Megtekintett videók nyomon követése - Lejátszás folytatása félbeszakítások után (például telefonhívás) + Lejátszás folytatása megszakítások (pl. telefonhívások) után Lejátszó - Működés + Viselkedés Előzmények és gyorsítótár Hibakeresés Lejátszás felugró módban @@ -133,13 +133,13 @@ Nincs találat Közvetítési fájl letöltése Hozzáadás ehhez - Gyorsabb, de pontatlan tekerés használata - A pontatlan tekerés lehetővé teszi, hogy gyorsabban ugorjon a pozíciókra, de kisebb pontossággal. Az 5, 15, vagy 25 másodperces tekerés nem működik ebben a módban + Gyors, pontatlan tekerés használata + A pontatlan tekerés gyorsabb pozícióváltást tesz lehetővé a lejátszóban, kisebb pontosság mellett. Ezzel a funkcióval nem működik az 5, 15 vagy 25 másodperces előre- és visszatekerés Bélyegkép gyorsítótára törölve Gyorsítótárazott metaadatok törlése Minden gyorsítótárazott weboldaladat törölve Metaadatok gyorsítótára törölve - Következő videó automatikus sorba állítása + Következő közvetítés automatikus sorba állítása Keresési előzmények helyi tárolása Csatornák Lejátszási listák @@ -150,11 +150,11 @@ Folytatás felugró ablakban Megtekintési előzmények törlése Törli a megtekintési előzményeket és a lejátszási pozíciókat - Törli az összes megtekintési előzményt\? + Törli az összes megtekintési előzményt? Megtekintési előzmények törölve Keresési előzmények törlése Eltávolítja a keresési kulcsszavakat az előzményekből - Törli az összes keresési előzményt\? + Törli az összes keresési előzményt? Keresési előzmények törölve Helyreállíthatatlan lejátszóhiba történt Lejátszóhiba helyreállítása @@ -183,17 +183,16 @@ Létrehozás Átnevezés - Ez az engedély szükséges -\na felugró ablakban történő megnyitáshoz + Ez az engedély szükséges \na felugró ablakban történő megnyitáshoz 1 elem törölve. reCAPTCHA rejtvény reCAPTCHA rejtvény kérve Letöltés Fájlnevekben engedélyezett karakterek - Az érvénytelen karakterek erre az értékre lesznek lecserélve - Cserekarakter - Betűk és számok - Legtöbb speciális karakter + Az érvénytelen karaktereket ez az érték helyettesíti + Helyettesítő karakter + Betűk és számjegyek + A legtöbb speciális karakter A NewPipe névjegye Névjegy és GYIK Licencek @@ -213,7 +212,7 @@ Licenc megtekintése Előzmények Előzmények - Törli ezt az elemet a keresési előzmények közül\? + Törli ezt az elemet a keresési előzmények közül? Utoljára lejátszott Legtöbbet lejátszott Főoldal tartalma @@ -228,7 +227,7 @@ Nem érvényes ZIP-fájl Figyelmeztetés: nem sikerült az összes fájl importálása. Ez felül fogja írni a jelenlegi beállításokat. - A beállításokat is importálja\? + A beállításokat is importálja? Felkapott Top 50 Új és népszerű @@ -237,18 +236,18 @@ Hangbeállítások Alapértelmezett tevékenység „%s” típusú tartalom megnyitásakor Videólejátszó - Háttérbeli lejátszó - Felugró ablakos lejátszás - Mindig kérdezzen + Háttérlejátszó + Felugró lejátszó + Mindig kérdezzen rá Információk gyűjtése… Kért tartalom betöltése Új lejátszási lista Átnevezés Név - Lejátszási listához adás + Hozzáadás a lejátszási listához Beállítás a lejátszási lista bélyegképeként Könyvjelző eltávolítása - Törli ezt a lejátszási listát\? + Törli ezt a lejátszási listát? Lejátszási lista létrehozva Lejátszási listához adva A lejátszási lista bélyegképe megváltozott. @@ -271,9 +270,7 @@ YouTube feliratkozások importálása a Google Takeoutból: \n \n1. Navigáljon erre az oldalra: %1$s \n2. Jelentkezzen be, ha kérik \n3. Kattintson „Az összes adatot tartalmazza” gombra, majd a „Kijelölések megszüntetése” gombra, majd válassza ki a „feliratkozások” lehetőséget és kattintson az „OK” gombra \n4. Kattintson a „Következő lépés”, majd az \"Exportálás indítása” gombra \n5. Kattintson a „Letöltés” gombra, amikor megjelenik, \n6. Kattintson a lenti FÁJL IMPORTÁLÁSA gombra, és válassza ki a letöltött ZIP-fájlt \n7. [Ha a ZIP-fájl importálása nem sikerül] Bontsa ki a .csv fájlt (általában: „YouTube és YouTube Music/feliratkozások/feliratkozások.csv”), majd kattintson lent a FÁJL IMPORTÁLÁSA gombra, és válassza az exportált CSV-fájlt SoundCloud-profil importálása a webcím vagy az azonosítójának begépelésével: \n \n1. A webböngészőben engedélyezze az „asztali módot” (az oldal nem érhető el mobileszközökön) \n2. Navigáljon a következő webcímre: %1$s \n3. Jelentkezzen be, ha kéri \n4. Másolja ki a profil webcímét, ahova át lett irányítva. saját azonosítója, soundcloud.com/azonosító - Ez a művelet adatforgalom-igényes lehet. -\n -\nBiztos, hogy folytatja\? + Ez a művelet adatforgalom-igényes lehet. \n \nBiztos, hogy folytatja? Ütem Hangmagasság Előretekerés csend alatt @@ -281,12 +278,12 @@ Visszaállítás Elfogadás Elutasítás - Nincs korlát - Felbontás korlátozása mobil adatkapcsolat használata esetén + Nincs korlátozás + Felbontás korlátozása mobiladat használatakor A fő videólejátszóról más alkalmazásra történő váltáskor teendő művelet — %s - Ne tegyen semmit - Lejátszás folytatása a háttérben - Lejátszás folytatása felugró ablakban + Ne történjen semmi + Minimalizálás háttérlejátszóba + Minimalizálás felugró lejátszóba Lejátszás folytatása A „Tartsa lenyomva a sorba állításhoz” tipp megjelenítése Leiratkozás @@ -297,10 +294,10 @@ Folytatás főnézetben Eltüntetés Lejátszási lista könyvjelzőzése - Egy hasonló videó hozzáadása a befejeződő (nem ismétlődő) lejátszási sorhoz + A lejátszási sor végén automatikusan hozzáad egy kapcsolódó közvetítést, ha az ismétlés ki van kapcsolva Sorba állítás a fájl nem írható felül - Az előre- és visszatekerés időtartama + Előre- és visszatekerés időtartama Utolsó lejátszási pozíció visszaállítása Lejátszás folytatása Értesítések az új NewPipe verziókról @@ -312,21 +309,20 @@ Adatok törlése Lejátszási pozíciók megjelenítése a listákban Pozíciók a listákban - Meg fogja kérdezni, hogy hova mentse el az egyes letöltéseket. -\nEngedélyezze a rendszermappa-választót (SAF), ha külső SD-kártyára akar letölteni - Kérdezze meg, hova töltse le + Minden letöltésnél meg kell adnia, hová szeretné menteni a fájlt.\nEngedélyezze a rendszer mappaválasztóját (SAF), ha külső SD-kártyára szeretne letölteni + Kérdezzen rá, hol tölthető le Letöltések szüneteltetése Letöltések indítása - Egyszerre csak egy letöltés fog futni + Egyszerre csak egy letöltés futhat Letöltési sor korlátozása Bezárás - Hasznos, ha mobil adatkapcsolatra vált, bár néhány letöltést nem lehet felfüggeszteni - Félbehagyás a forgalomkorlátos hálózatokon - A letöltés megszakítása előtti kísérletek legnagyobb száma - Próbálkozások legnagyobb száma + Hasznos lehet mobilinternetre váltáskor, bár egyes letöltések nem szüneteltethetők + Letöltés megszakítása forgalomkorlátos hálózatokon + A letöltés megszakítása előtt megkísérelhető próbálkozások maximális száma + Újrapróbálkozások maximális száma Leállítás Letöltött fájlok törlése - Törli a letöltési előzményeket, vagy törli az összes letöltött fájlt\? + Törli a letöltési előzményeket, vagy törli az összes letöltött fájlt? Letöltési előzmények törlése A letöltést nem lehet helyrehozni Kapcsolati időtúllépés @@ -362,10 +358,10 @@ Lista Listanézet mód A fájl áthelyezve vagy törölve - A külső SD-kártyára történő mentés nem lehetséges. Visszaállítja a letöltési mappa helyét\? + Nem lehet letölteni a külső SD-kártyára. Visszaállítja a letöltési mappa helyét? A külső tárhely nem érhető el Lejátszási pozíciók törölve - Törli az összes lejátszási pozíciót\? + Törli az összes lejátszási pozíciót? Összes lejátszási pozíció törlése Lejátszási pozíciók törlése Találatok a következőre: %s @@ -380,7 +376,7 @@ A webcím nem felismerhető. Megnyitja másik alkalmazással? Automatikus sorba állítás Kapcsolja ki, hogy elrejtse a videó leírását és a további információkat - Visszaállítja az alapértelmezéseket\? + Visszaállítja az alapértelmezéseket? Ez a videó korhatáros. \nAz új, korhatáros videókkal kapcsolatos YouTube irányelvek miatt a NewPipe nem férhet hozzá a videófolyamokhoz, így nem tudja lejátszani. Leírás Hozzászólások @@ -391,7 +387,7 @@ Némítás Nincs betöltve: %d Üres csoportnév - Törli ezt a csoportot\? + Törli ezt a csoportot? Mindig frissítsen Készítette: %s Lejátszási lista oldal @@ -406,7 +402,7 @@ Az Általános adatvédelmi rendeletnek (GDPR) való megfelelés érdekében felhívjuk figyelmét a NewPipe adatvédelmi irányelveire. Olvassa el figyelmesen. \nEl kell fogadnia, ha hibajelentést szeretne küldeni. Alkalmazás összeomlasztása Memóriaszivárgások megjelenítése - A memóriaszivárgás-monitorozás az alkalmazás megállását okozhatja, amíg a dinamikus memória mentése folyik + A memóriaszivárgás figyelése a heap kiírásakor az alkalmazás lefagyását okozhatja Automatikusan létrehozott (feltöltő nem található) Lejátszási sor Konferenciák @@ -428,10 +424,10 @@ Válasszon egy lejátszási listát Lejátszás automatikus indítása — %s Lejátszás sebességének beállítása - Az egyik lejátszóról a másikra váltás törölheti a lejátszási sort - Csak Wi-Fi-hálózaton - Rendszermappa-választó (SAF) használata - A „Storage Access Framework” lehetővé teszi a letöltések külső SD-kártyára történő mentését + A lejátszóváltás lecserélheti a lejátszási sort + Csak Wi-Fi-n + Rendszer mappaválasztójának használata (SAF) + A „Storage Access Framework” (SAF) lehetővé teszi a letöltést külső SD-kártyára A rendszer megtagadta a műveletet Soha Feliratkozások kiválasztása @@ -451,14 +447,12 @@ Dalok Események Videók - Ez a videó korhatáros. -\n -\nEngedélyezze a(z) „%1$s” beállítást, ha meg szeretné tekinteni. + Ez a videó korhatáros. \n \nEngedélyezze a(z) „%1$s” beállítást, ha meg szeretné tekinteni. Gyermekek számára esetlegesen nem megfelelő, korhatáros tartalom megjelenítése (például 18+) Csak a HTTPS webcímek támogatottak Metainformációk megjelenítése A jelenleg aktív lejátszási sor le lesz cserélve - Megerősítés kérése a lejátszási sor törlése előtt + Lejátszási sor törlése előtt megerősítés kérése Éjszakai téma Frissítési értesítés megjelenítése, amikor egy új verzió érhető el Frissítések @@ -493,10 +487,8 @@ %d kiválasztva Új - Ezt a tartalmat még nem támogatja a NewPipe. -\n -\nRemélhetőleg egy következő verzióban már támogatott lesz. - Az eszközön nincs olyan alkalmazás, amely meg tudja ezt nyitni + Ezt a tartalmat még nem támogatja a NewPipe. \n \nRemélhetőleg egy következő verzióban már támogatott lesz. + Az eszközén nincs olyan alkalmazás, amely meg tudná nyitni ezt Ez a videó csak YouTube Music Prémium előfizetők számára érhető el, így nem tekinthető meg és nem tölthető le a NewPipe-pal. Automatikus (eszköz témája) Ez a tartalom csak előfizetőknek érhető el, nem tekinthető meg és nem tölthető le a NewPipe-pal. @@ -522,8 +514,8 @@ Találjon Önnek tetsző példányokat itt: %s Válassza ki a kedvenc PeerTube példányait PeerTube példányok - Életciklusából kifutott hibák jelentése - Előnyben részesített „megnyitási” művelet + Életcikluson kívüli hibák jelentése + Előnyben részesített megnyitási művelet Fiók bezárása Fiók megnyitása Csatorna részleteinek megjelenítése @@ -538,18 +530,18 @@ Minimalizálás alkalmazásváltáskor Helyi keresési javaslatok Távoli keresési javaslatok - A fő lejátszó teljes képernyős indítása - A videókat ne a kis lejátszóban indítsa el, hanem kapcsolja be a teljes képernyős módot, ha az automatikus forgatás zárolva van. Továbbra is elérheti a kis lejátszót, ha kilép a teljes képernyőből + Fő lejátszó indítása teljes képernyős módban + Ha az automatikus elforgatás zárolva van, a videók ne a minilejátszóban induljanak el, hanem közvetlenül teljes képernyős módban. A teljes képernyős módból kilépve továbbra is elérhető a minilejátszó Szolgáltatás be/ki, jelenleg kiválasztott: A hozzászólások ki vannak kapcsolva Húzza oldalra az elemeket az eltávolításukhoz A következő sorba állítása A következő sorba állítva Feldolgozás… Ez eltarthat egy ideig - Az eltávolítás utáni, fragment vagy activity életcikluson kívüli, nem kézbesíthető Rx kivételek jelentésének kényszerítése - Eredeti „ennyi ideje” megjelenítése az elemeken - Tiltsa le a médiacsatornázást, ha fekete képernyőt vagy akadozást tapasztal videólejátszáskor. - Minden letöltésnél meg fogja kérdezni, hogy hova mentse el + Az eldobás után, a fragmentum vagy az aktivitás életciklusán kívül kézbesíthetetlen Rx-kivételek jelentésének kényszerítése + Elemek eredeti közzétételi idejének megjelenítése + Ha videólejátszás közben fekete képernyőt vagy akadozást tapasztal, tiltsa le a médiatunneling funkciót. + Minden letöltésnél meg kell adnia, hová szeretné menteni a letöltött fájlt Válasszon egy példányt Hírfolyam utoljára frissítve: %s Hírfolyam betöltése… @@ -573,8 +565,7 @@ Nyilvános Nem listázott Ki - Nem található megfelelő fájlkezelő ehhez a művelethez. -\nTelepítsen egy fájlkezelőt, vagy próbálja meg letiltani a következőt a letöltési beállításokban: „%s” + Nem található megfelelő fájlkezelő ehhez a művelethez. \nTelepítsen egy fájlkezelőt, vagy próbálja meg letiltani a következőt a letöltési beállításokban: „%s” Letöltés befejezve %s letöltés befejezve @@ -584,14 +575,14 @@ Fiók eltávolítva Megjelölés megtekintettként Még nincs letöltési mappa beállítva, válassza ki az alapértelmezett letöltési mappát most - Tekerősáv bélyegkép-előnézete - Magas minőségű (nagyobb) + Előnézeti bélyegképek a keresősávon + Kiváló minőségű (nagyobb méretű) Hiba a hírfolyam betöltésekor Nyelv Támogatás Weboldal megnyitása Táblagép mód - Az Android 10-től kezdve, csak a „Storage Access Framework” támogatott + Az Android 10-es verziójától kezdve csak a „Storage Access Framework” (SAF) támogatott Új hírfolyamelemek Privát Belső @@ -604,15 +595,14 @@ Értesítések a hibák jelentéséhez A NewPipe hibát észlelt, koppintson a jelentéséhez Hiba történt, lásd az értesítést - Médiacsatornázás letiltása - Hiba üzenetsávjának megjelenítése + Médiatunneling letiltása + Hibaüzenet megjelenítése értesítősávban Hibaértesítés létrehozása Új verziók kézi keresése - Alacsony minőségű (kisebb) + Alacsony minőségű (kisebb méretű) Frissítések keresése… Készítette: %s - Nem található megfelelő fájlkezelő ehhez a művelethez. -\nTelepítsen egy olyan fájlkezelőt, amely kompatibilis a Storage Access Frameworkkel + Nem található megfelelő fájlkezelő ehhez a művelethez. \nTelepítsen egy olyan fájlkezelőt, amely kompatibilis a Storage Access Frameworkkel Szöveg kijelölésének engedélyezése a leírásban Kategória Címkék @@ -620,13 +610,13 @@ Gyors mód letiltása Távolítsa el a részben megtekintett közvetítéseket A lejátszási listához való hozzáadás előtt és után megtekintett közvetítések el lesznek távolítva.\nBiztos benne? - A szolgáltatásokból származó eredeti szövegek láthatók lesznek a közvetítési elemeken + A szolgáltatásokból származó eredeti szövegek megjelennek a hírfolyam elemeiben Lejátszó összeomlasztása A „Lejátszó összeomlasztása” lehetőség megjelenítése - Megjeleníti az összeomlasztási lehetőséget a lejátszó használatakor + Lejátszás közben megjelenít egy összeomlási lehetőséget Hangmagasság megtartása (torzítást okozhat) Frissítések keresése - Ne jelenítse meg + Ne jelenjen meg Megtekintettek eltávolítása Eltávolítja a megtekintett közvetítéseket? @@ -634,7 +624,7 @@ %1$s letöltés törölve Kitűzött hozzászólás - LeakCanary nem elérhető + A LeakCanary nem érhető el Lejátszási értesítés Módosítsa a progresszív tartalmak betöltési intervallumának méretét (jelenleg %s). Az alacsonyabb érték felgyorsíthatja a kezdeti betöltésüket. Jelenleg játszott közvetítés értesítésének testreszabása @@ -642,22 +632,22 @@ Új élő közvetítések Értesítések új élő közvetítésekről a feliratkozott csatornák esetén Közvetítés részleteinek betöltése.… - Keressen új élő közvetítést + Új közvetítések keresése Új közvetítések értesítései Értesítésen új élő közvetítés esetén a feliratkozott csatornákhoz Ellenőrzési gyakoriság Szükséges hálózati kapcsolat Bármilyen hálózat - Törli az összes letöltött fájlt a lemezről\? + Törli az összes letöltött fájlt a lemezről? Értesítsen Az értesítések le vannak tiltva - Lejátszás betöltési intervallumának mérete + Lejátszási adatbetöltési időtartam mérete Százaléka %s új elő közvetítés %s új elő közvetítés - ExoPlayer alapértelmezett + ExoPlayer alapértelmezett beállítása Feliratkozott erre a csatornára , Azok az élő adások melyek nem támogatottak a letöltő által, rejtve vannak @@ -677,11 +667,11 @@ Feliratkozások importálása vagy exportálása a 3 pontos menüből Ön a Newpipe legfrissebb verzióját futtatja Nyomjon a %s letöltéséhez - Bal gesztus művelete - Jobb gesztus művelete + Bal oldali gesztusművelet + Jobb oldali gesztusművelet Fényerő Hangerő - Egyik sem + Egyiksem A kiszürkített lejátszólisták már tartalmazzák ezt az elemet. Állandó bélyegkép feloldása Ismétlődések eltávolítása @@ -689,11 +679,11 @@ Részben megtekintett Kártya Ez a beállítás csak a(z) %s téma esetén érhető el - Hardveres médialejátszó gombok eseményeinek figyelmen kívül hagyása + Hardveres médialejátszó-gombok eseményeinek figyelmen kívül hagyása A következő közvetítések megjelenítése - Az eredeti hangsáv választása, a nyelvtől függetlenül - A látássérülteknek szóló leírást tartalmazó hangsáv választása, ha van ilyen - Válasszon gesztust a lejátszóképernyő bal feléhez + Eredeti hangsáv kiválasztása a nyelvtől függetlenül + Ha elérhető, a látássérültek számára készült hangos képleírást tartalmazó hangsáv kiválasztása + A lejátszó képernyőjének bal felén használható gesztus kiválasztása Nem sikerült a vágólapra másolás Ismételt elem %d alkalommal hozzáadva Közvetítések be/ki @@ -702,25 +692,25 @@ Ismeretlen Közelgő ExoPlayer beállítások - Az ExoPlayer néhány beállításának kezelése. A változások életbe lépéséhez újra kell indítani a lejátszót. - Az ExoPlayer dekódoló tartalék funkciójának használata - Engedélyezze ezt a beállítást, ha dekóder előkészítési problémái vannak, ami alacsonyabb prioritású dekóderekre váltást okoz, ha az elsődleges dekóderek előkészítése sikertelen. Ez rosszabb lejátszási teljesítményt eredményezhet, mint az elsődleges dekóderek használata. - Kerülőmegoldás: mindig az ExoPlayer videokimeneti felületének használata - Ez a kerülőmegoldás elengedi és újból előkészíti a videokodekeket, ha felületváltozás történik, ahelyett, hogy közvetlenül a kodeknél állítaná be a felületet. Ez már alapból használatban van egyes, az ezzel a problémával érintett eszközöknél, a beállításnak Android 6 vagy újabb esetén van hatása\n\nA beállítás bekapcsolása megakadályozhatja a lejátszási hibákat abban az esetben, ha átváltja a jelenlegi videolejátszót, vagy teljes képernyőre vált + Néhány ExoPlayer-beállítás kezelése. A módosítások érvénybe lépéséhez újra kell indítani a lejátszót + ExoPlayer dekóder-visszaállási funkciójának használata + Engedélyezze ezt a beállítást, ha problémák merülnek fel a dekóderek inicializálásakor. Ha az elsődleges dekóderek inicializálása sikertelen, a lejátszó alacsonyabb prioritású dekóderekre vált. Ez gyengébb lejátszási teljesítményt eredményezhet az elsődleges dekóderek használatához képest + Mindig az ExoPlayer videokimeneti felületére vonatkozó beállítási kerülőmegoldás használata + Ez a kerülőmegoldás a videókodekek felszabadításával és újbóli inicializálásával kezeli a videómegjelenítő felület változásait, ahelyett, hogy közvetlenül a kodekhez rendelné az új felületet. Az ExoPlayer bizonyos, ilyen problémákkal érintett eszközökön már eleve alkalmazza ezt a megoldást. Ez a beállítás csak Android 6 vagy újabb verzió esetén van hatással a működésre\n\nA beállítás bekapcsolása segíthet megelőzni a lejátszási hibákat az aktuális videólejátszó váltásakor vagy teljes képernyős módra váltáskor %1$s %2$s szinkronizált leíró - Hasznos, ha olyan fülhallgatót használ, melyen meghibásodtak a fizikai gombok + Hasznos például akkor, ha hibás fizikai gombokkal rendelkező fejhallgatót használ Eredeti hang előnyben részesítése - Leíró hanganyag előnyben részesítése - Válasszon gesztust a lejátszóképernyő jobb feléhez + Hangos képleírás előnyben részesítése + A lejátszó képernyőjének jobb felén használható gesztus kiválasztása Hang: %s Hangsáv - Eltávolítja az ismétlődéseket\? - Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról\? + Eltávolítja az ismétlődéseket? + Eltávolítja az összes ismétlődő közvetítést ebből a lejátszólistáról? eredeti Fő lapok elhelyezkedése - A médiacsatornázás alapértelmezetten le van tiltva az eszközén, mivel a saját eszközmodellje nem támogatja azt. + Az eszközén alapértelmezés szerint le van tiltva a médiatunneling, mert ismert, hogy ez az eszközmodell nem támogatja. A fő lapválasztó elhelyezése alulra Nincs élő közvetítés Nincs adatfolyam @@ -759,8 +749,7 @@ \? Lejátszási lista megosztása Megosztás címekkel - %1$s -\n%2$s + %1$s \n%2$s %s válasz %s válasz @@ -778,13 +767,10 @@ Igen Nem Biztonsági mentés és visszaállítás - A NewPipe időről időre automatikusan ellenőrzi az új verziókat, és értesít, amint azok elérhetővé válnak. -\nSzeretné engedélyezni ezt? + A NewPipe időről időre automatikusan ellenőrzi az új verziókat, és értesít, amint azok elérhetővé válnak. \nSzeretné engedélyezni ezt? Beállítások alaphelyzetbe állítása Minden beállítás visszaállítása alapértelmezett értékre - Az összes beállítás visszaállítása elveti az összes preferált beállítást, és újraindítja az alkalmazást. -\n -\nBiztosan folytatja? + Az összes beállítás visszaállítása elveti az összes preferált beállítást, és újraindítja az alkalmazást. \n \nBiztosan folytatja? Az importálandó exportban lévő beállítások sérülékeny formátumot használnak, amely a NewPipe 0.27.0-ás verziója óta elavult. Győződjön meg arról, hogy megbízható forrásból importálja, és a jövőben csak a NewPipe 0.27.0-ás vagy újabb verziójából származó exportokat használjon. A beállítások ebből a sérülékeny forrásból történő importálása hamarosan végleg el lesz távolítva, és a NewPipe régi verziói nem fogják tudni importálni az újabb verziókból származó exportokat. másodlagos Megosztás YouTube ideiglenes lejátszási listaként diff --git a/app/src/main/res/values-ia/strings.xml b/app/src/main/res/values-ia/strings.xml index 3b00674a5..2e6a25131 100644 --- a/app/src/main/res/values-ia/strings.xml +++ b/app/src/main/res/values-ia/strings.xml @@ -154,12 +154,12 @@ Monstrar un notification pro requestar le actualisation del application quando un nove version es disponibile Actualisationes Aperir in modo emergente - Esque tu vole vacuar le chronologia de discargamentos o deler omne files discargate\? + Esque tu vole vacuar le chronologia de discargamentos o deler omne files discargate? Vacuar le chronologia de discargamentos - Esque tu vole deler iste articulo del chronologia de cerca\? + Esque tu vole deler iste articulo del chronologia de cerca? Chronologia Dele le chronologia de parolas clave de cerca - Deler omne chronologia de cerca\? + Deler omne chronologia de cerca? Chronologia de recerca delite Exportar le chronologia, subscriptiones, listas de reproduction e configurationes Reimplaciar tu chronologia, subscriptiones e (optionalmente) configurationes currente @@ -173,7 +173,7 @@ Nemo is observante Chronologia de reproductiones vacuate - Deler omne chronologia de reproductiones\? + Deler omne chronologia de reproductiones? Pardono, qualcosa vadeva incorrecte. Pardono, illo non deberea haber ocurrite. Deler le positiones de reproduction @@ -205,16 +205,16 @@ Reportar Reportar in GitHub Permitter monstrar supra altere applicationes - Esque tu vole reinitialisar le valores predefinite\? + Esque tu vole reinitialisar le valores predefinite? Reinitialisar le valores predefinite Nulle fluxos disponibile pro discargar Ocurreva un error: %1$s File displaciate o delite Falleva le interfacie del application - Le discarga al carta SD non es possibile. Reinitialisar le location del dossier de discargas\? + Le discarga al carta SD non es possibile. Reinitialisar le location del dossier de discargas? Immagazinage externe non disponibile Error - Esque tu vole deler tote le positiones de reproduction\? + Esque tu vole deler tote le positiones de reproduction? Dele tote le positiones de reproduction Usar le recerca rapide e inexacte Thema nocturne diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 9d46d02d1..3a339fefd 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -7,31 +7,31 @@ Buka di peramban Bagikan Unduh - Telusur + Telusuri Pengaturan Bagi dengan - Gunakan pemutar video lain - Gunakan pemutar audio lain + Gunakan pemutar video eksternal + Gunakan pemutar audio eksternal Folder unduhan video Berkas video yang diunduh disimpan di sini Pilih folder unduhan untuk berkas video Folder unduhan audio Berkas audio yang diunduh disimpan di sini Pilih folder unduhan untuk berkas audio - Pilih kualitas + Resolusi bawaan Putar dengan Kodi Pasang aplikasi Kore yang hilang? Tampilkan opsi \"Putar dengan Kodi\" - Tampilkan opsi untuk memutar video via Kodi + Tampilkan opsi untuk memutar video melalui pusat media Kodi Audio - Format audio + Format audio bawaan Gelap Terang Unduh Video \'Berikutnya\' dan \'Serupa\' URL tidak didukung Bahasa konten - Audio dan Video + Video dan audio Penampilan Memutar di latar belakang Konten @@ -49,8 +49,8 @@ Tidak bisa menyiapkan menu unduh Maaf, hal tersebut seharusnya tidak terjadi. Laporkan via surel - Maaf, telah terjadi kesalahan. - Lapor + Maaf, terjadi kesalahan. + Laporkan Info: Yang terjadi: Komentar Anda (dalam bahasa Inggris): @@ -74,7 +74,7 @@ Mohon tunggu… Disalin ke papan klip Silakan pilih folder unduhan di pengaturan - Pemutar streaming tidak ketemu. Pasang VLC? + Pemutar streaming tidak ditemukan. Pasang VLC? App/UI rusak Apa:\nPermintaan:\nBahasa Konten:\nNegara Konten:\nBahasa Apl:\nLayanan:\nWaktu GMT:\nPaket:\nVersi:\nVersi OS: Thread @@ -83,24 +83,23 @@ Hitam Semua Buka di mode sembulan - Izin ini dibutuhkan untuk -\nmembuka di mode sembul + Izin ini dibutuhkan untuk \nmembuka di mode sembul Memutar dalam mode sembul Dinonaktifkan - Format video - Kualitas sembulan bawaan - Tampilkan kualitas lebih - Hanya perangkat tertentu mendukung video 2K/4K + Format video bawaan + Resolusi popup bawaan + Tampilkan resolusi yang lebih tinggi + Hanya beberapa perangkat yang dapat memutar video 2K/4K Latar Belakang Sembulan Bersihkan - Menghapus audio di kualitas tertentu - Ingat ciri-ciri sembulan - Ingat ukuran dan posisi terakhir sembulan + Menghapus audio pada beberapa resolusi + Ingat properti popup + Ingat ukuran dan posisi terakhir popup Saran pencarian Menampilkan saran pencarian saat mencari - Kualitas terbaik - Unduh + Resolusi terbaik + Unduhan Karakter yang diizinkan sebagai nama berkas Karakter yang tidak valid akan diganti dengan karakter ini Karakter pengganti @@ -114,14 +113,14 @@ Streaming ringan Libre di Android. Lihat di GitHub Lisensi NewPipe - Baik Anda memiliki ide tentang; terjemahan, pengubahan desain, pembersihan kode, atau pengubahan kode yang besar—bantuan selalu diterima. Semakin banyak yang dilakukan, semakin banyak hasilnya! + Apapun ide tentang; terjemahan, pengubahan desain, pembersihan kode, atau pengubahan kode yang besar—bantuan selalu diterima. Semakin banyak yang dilakukan, semakin baik hasilnya! Baca lisensi Kontribusi Berlanggan Dilanggani Apa Yang Baru Lanjutkan pemutaran - Melanjutkan pemutaran setelah interupsi (mis. panggilan telepon) + Lanjutkan pemutaran setelah gangguan (misalnya panggilan telepon) Riwayat pencarian Simpan pencarian di perangkat Riwayat tontonan @@ -132,14 +131,14 @@ Hapus metadata tembolok Hapus semua data laman web tembolok Tembolok metadata dihapus - Melanjutkan akhir dari antrean pemutaran (tak berulang) dengan menambahkan video terkait + Lanjutkan antrean pemutaran yang berakhir (tanpa pengulangan) dengan menambahkan aliran yang terkait Simpan daftar video yang telah ditonton Tip \"Tahan untuk menambahkan\" Tampilkan tip ketika menekan tombol latar belakang atau popup di dalam video \"Detail:\" Lokasi Konten Pemutar Perilaku - Riwayat & Cache + Riwayat dan cache Debug Urungkan Putar Semua @@ -214,18 +213,18 @@ Tutup Laci Pemutar video Pemutar latar belakang - Pemutar sembulan - Selalu bertanya + Pemutar popup + Selalu tanyakan Mendapatkan info… Memuat konten yang diminta Daftar Putar Baru Ubah Nama Nama - Tambah ke daftar putar + Tambahkan ke daftar putar Atur sebagai thumbnail daftar putar Markah Daftar Putar Hapus Markah - Hapus daftar putar ini\? + Hapus daftar putar ini? Daftar putar dibuat Terdaftar putar Keluku daftar putar diubah. @@ -241,30 +240,30 @@ Tambah Ke Hapus riwayat tontonan Hapus riwayat video yang diputar dan posisi pemutaran - Hapus seluruh riwayat tontonan\? + Hapus seluruh riwayat tontonan? Riwayat tontonan dihapus Hapus riwayat pencarian Hapus riwayat kata kunci pencarian - Hapus seluruh riwayat pencarian\? + Hapus seluruh riwayat pencarian? Riwayat pencarian dihapus Tidak ada video yang tersedia untuk diunduh 1 item dihapus. Daftar Markah - Putar otomatis video berikutnya + Antrekan otomatis aliran berikutnya Batal berlanggan saluran Tidak dapat perbarui langganan Langganan - Pakai intip cepat tak presisi - Intip tak presisi membantu pengguna mengintip posisi video dengan cepat tapi presisi rendah. Mengintip 5, 15, atau 25 detik saja tidak berfungsi + Gunakan pencarian cepat yang tidak tepat + Pencarian tidak tepat memungkinkan pemutar untuk mencari posisi dengan lebih cepat, namun dengan presisi yang berkurang. Mencari selama 5, 15, atau 25 detik tidak akan berhasil Aplikasi ini adalah perangkat lunak bebas copyleft: Anda dapat menggunakan, mempelajari, membagikan, dan memperbaikinya sesuka hati. Secara khusus, Anda dapat mendistribusikan dan/atau memodifikasinya berdasarkan ketentuan Lisensi Publik Umum GNU sebagaimana diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi apapun yang lebih baru. - Apakah Anda juga ingin mengimpor pengaturan\? - Tindakan \'buka\' yang diinginkan + Apakah Anda juga ingin mengimpor pengaturan? + Tindakan \'buka\' yang disukai Tindakan bawaan ketika membuka konten — %s Teks - Ubah skala teks keterangan pemutar dan gaya latar belakang. Dibutuhkan mulai ulang aplikasi agar perubahan berlaku. - Pemantauan kebocoran memori dapat menyebabkan apl menjadi tidak responsif saat heap dumping - Laporkan galat out-of-lifecycle - Paksa pelaporan eksepsi Rx yang tak terkirim di luar fragmen atau siklus hidup aktivitas setelah dibuang + Ubah skala teks keterangan pemutar dan gaya latar belakang. Membutuhkan mulai ulang aplikasi agar dapat diterapkan + Pemantauan kebocoran memori dapat menyebabkan aplikasi menjadi tidak responsif saat heap dumping + Laporkan kesalahan di luar siklus hidup + Paksa pelaporan pengecualian Rx yang tidak dapat dikirimkan di luar siklus hidup fragmen atau aktivitas setelah pembuangan Impor Impor dari Ekspor ke @@ -274,25 +273,10 @@ Ekspor sebelumnya Tidak bisa mengimpor langganan Tidak bisa mengekspor langganan - Impor langganan YouTube dari Google takeout: -\n -\n1. Kunjungi URL ini: %1$s -\n2. Masuk ketika ditanyakan -\n3. Klik \"Semua data disertakan\", lalu \"Batalkan semua pilihan\", lalu hanya pilih \"langganan\" dan klik \"OKE\" -\n4. Klik \"Langkah berikutnya\" dan kemudian \"Buat ekspor\" -\n5. Klik tombol \"Unduh\" -\n6. Klik IMPOR FILE di bawah dan pilih file .zip yang terunduh -\n7. [Jika impor .zip gagal] Ekstrak file .csv (biasanya di \"YouTube dan YouTube Music/langganan/langganan.csv\"), klik IMPOR FILE di bawah dan pilih file csv yang diekstrak - Impor profil SoundCloud dengan mengetik URL atau ID Anda: -\n -\n1. Aktifkan \"mode desktop\" di peramban web (situs tidak tersedia untuk perangkat seluler) -\n2. Kunjungi URL ini: %1$s -\n3. Masuk ketika ditanya -\n4. Salin URL profil Anda ketika dialihkan. + Impor langganan YouTube dari Google takeout: \n \n1. Kunjungi URL ini: %1$s \n2. Masuk ketika ditanyakan \n3. Klik \"Semua data disertakan\", lalu \"Batalkan semua pilihan\", lalu hanya pilih \"langganan\" dan klik \"OKE\" \n4. Klik \"Langkah berikutnya\" dan kemudian \"Buat ekspor\" \n5. Klik tombol \"Unduh\" \n6. Klik IMPOR FILE di bawah dan pilih file .zip yang terunduh \n7. [Jika impor .zip gagal] Ekstrak file .csv (biasanya di \"YouTube dan YouTube Music/langganan/langganan.csv\"), klik IMPOR FILE di bawah dan pilih file csv yang diekstrak + Impor profil SoundCloud dengan mengetik URL atau ID Anda: \n \n1. Aktifkan \"mode desktop\" di peramban web (situs tidak tersedia untuk perangkat seluler) \n2. Kunjungi URL ini: %1$s \n3. Masuk ketika ditanya \n4. Salin URL profil Anda ketika dialihkan. idAnda, soundcloud.com/idAnda - Perlu diingat operasi ini membutuhkan bandwidth yang besar. -\n -\nApakah Anda ingin melanjutkan\? + Perlu diingat operasi ini membutuhkan bandwidth yang besar. \n \nApakah Anda ingin melanjutkan? Kontrol Kecepatan Pemutaran Tempo Nada @@ -302,21 +286,19 @@ Trek Pengguna Kebijakan Privasi NewPipe - Proyek NewPipe sangat memperhatikan privasi kamu. Oleh karena itu, aplikasi ini tidak mengumpulkan data apa pun tanpa persetujuan Anda. -\nKebijakan privasi NewPipe menjelaskan secara detail data apa saja yang dikirim dan disimpan ketika kamu mengirimkan laporan kerusakan aplikasi. + Proyek NewPipe sangat mementingkan privasi Anda. Oleh karena itu, aplikasi ini tidak mengumpulkan data apapun tanpa persetujuan Anda.\nKebijakan privasi NewPipe menjelaskan secara rinci data apa saja yang dikirim dan disimpan saat Anda mengirim laporan kerusakan. Baca kebijakan privasi Percepat saat diam Langkah Atur ulang - Agar sesuai dengan Regulasi Perlindungan Data Umum Eropa (GDPR), dengan ini kami tarik perhatian Anda ke kebijakan privasi NewPipe. Silakan baca dengan seksama. -\nAnda harus menerimanya untuk mengirimkan laporan bug kepada kami. + Agar sesuai dengan Regulasi Perlindungan Data Umum Eropa (GDPR), dengan ini kami tarik perhatian Anda ke kebijakan privasi NewPipe. Silakan baca dengan seksama. \nAnda harus menerimanya untuk mengirimkan laporan bug kepada kami. Setuju Tolak - Tanpa batas - Batasi kualitas saat dengan data seluler - Minimalkan saat beralih apl + Tidak ada batasan + Batasi resolusi saat menggunakan data seluler + Minimalkan saat beralih aplikasi Tindakan ketika beralih ke apl lain dari pemutar video utama — %s - Nihil + Tidak ada Minimalkan ke pemutar latar belakang Minimalkan ke pemutar popup Batal Berlanggan @@ -328,10 +310,10 @@ Notifikasi pembaruan apl Notifikasi untuk versi-versi NewPipe baru Penyimpanan eksternal tidak tersedia - Tidak bisa mengunduh ke kartu SD eksternal. Atur ulang lokasi folder unduhan\? + Tidak bisa mengunduh ke kartu SD eksternal. Atur ulang lokasi folder unduhan? Tidak bisa membaca tab yang disimpan, beralih menggunakan tab bawaan Kembali ke awal - Apakah Anda ingin mengembalikan ke bawaan\? + Apakah Anda ingin mengembalikan ke bawaan? Jumlah pelanggan tidak tersedia Tab apa yang ditampilkan di halaman utama Konferensi @@ -388,20 +370,19 @@ NewPipe telah ditutup saat sedang memproses berkas Tidak ada ruang kosong tersisa pada perangkat Kehilangan laju, karena berkas telah dihapus - Apakah Anda yakin ingin menghapus semua riwayat unduhan dan berkas yang telah diunduh\? + Apakah Anda yakin ingin menghapus semua riwayat unduhan dan berkas yang telah diunduh? Batasi antrean unduhan Satu unduhan akan berjalan pada waktu yang bersamaan Mulai unduh Jeda unduh Tanyakan lokasi unduhan - Anda akan ditanya lokasi penyimpanan berkas unduhan. -\nAktifkan pencomot folder sistem (SAF) jika Anda ingin mengunduh ke kartu SD eksternal + Anda akan ditanya lokasi penyimpanan berkas unduhan. \nAktifkan pencomot folder sistem (SAF) jika Anda ingin mengunduh ke kartu SD eksternal Batas waktu koneksi Gunakan pencomot folder sistem (SAF) \'Storage Access Framework\' memungkinkan unduhan ke kartu SD eksternal Hapus posisi pemutaran Hapus semua posisi pemutaran - Hapus semua posisi pemutaran\? + Hapus semua posisi pemutaran? %s video @@ -436,13 +417,13 @@ Bahasa apl Bawaan sistem Selesai - Durasi maju/mundur cepat + Durasi pencarian maju/mundur cepat Tekan \"Selesai\" saat selesai Video %d detik - Karena kendala ExoPlayer, durasi pencarian ditetapkan ke %d detik + Karena keterbatasan ExoPlayer, durasi pencarian disetel ke %d detik %d menit @@ -463,7 +444,7 @@ %d dipilih Nama grup kosong - Apakah Anda ingin menghapus grup ini\? + Apakah Anda ingin menghapus grup ini? Baru Langganan Rentang pembaruan langganan @@ -480,29 +461,15 @@ Ambil dari langganan aslinya jika tersedia Hapus siaran yang sudah ditonton? Buang ditonton - Video ini dibatasi usia. -\n -\nAktifkan \"%1$s\" di dalam pengaturan jika Anda ingin melihatnya. - Konten ini belum didukung oleh NewPipe. -\n -\nSemoga akan didukung pada versi berikutnya. + Video ini dibatasi usia. \n \nAktifkan \"%1$s\" di dalam pengaturan jika Anda ingin melihatnya. + Konten ini belum didukung oleh NewPipe. \n \nSemoga akan didukung pada versi berikutnya. Iya, dan video yang ditonton sebagian - Siaran yang telah ditonton sebelum dan sesudah ditambahkan ke daftar putar akan dihapus. \nAnda yakin? + Siaran yang telah ditonton sebelum dan sesudah ditambahkan ke daftar putar akan dihapus. \nAnda yakin? Batal bisukan Bisukan - Apakah Anda merasa pemuatan langganan sangat lambat\? Jika iya, coba nyalakan pemuatan cepat (Anda bisa mengubahnya di dalam pengaturan atau dengan menekan tombol di bawah) -\n -\nNewPipe menyediakan dua strategi pemuatan langganan: -\n• Mengambil semua kanal langganan, yang lebih lambat tapi lengkap. -\n• Menggunakan layanan endpoint khusus, yang lebih cepat namun terkadang tidak lengkap. -\n -\nPerbedaan di antara keduanya adalah yang lebih cepat biasanya kekurangan beberapa informasi, seperti durasi atau tipe item (tidak bisa membedakan antara video siaran langsung atau yang biasa) dan mungkin menampilkan lebih sedikit item. -\n -\nYouTube adalah contoh layanan yang menyediakan metode pengambilan cepat dengan layanan RSS mereka. -\n -\nJadi pilihlah yang sesuai yang Anda inginkan: kecepatan atau kelengkapan informasi. - Teks asli dari layanan akan ditampilkan di dalam video - Tampilkan waktu yang lalu sebenarnya pada item + Apakah Anda merasa pemuatan langganan sangat lambat? Jika iya, coba nyalakan pemuatan cepat (Anda bisa mengubahnya di dalam pengaturan atau dengan menekan tombol di bawah) \n \nNewPipe menyediakan dua strategi pemuatan langganan: \n• Mengambil semua kanal langganan, yang lebih lambat tapi lengkap. \n• Menggunakan layanan endpoint khusus, yang lebih cepat namun terkadang tidak lengkap. \n \nPerbedaan di antara keduanya adalah yang lebih cepat biasanya kekurangan beberapa informasi, seperti durasi atau tipe item (tidak bisa membedakan antara video siaran langsung atau yang biasa) dan mungkin menampilkan lebih sedikit item. \n \nYouTube adalah contoh layanan yang menyediakan metode pengambilan cepat dengan layanan RSS mereka. \n \nJadi pilihlah yang sesuai yang Anda inginkan: kecepatan atau kelengkapan informasi. + Teks asli dari layanan akan terlihat di item aliran + Tampilkan “waktu yang lalu” asli pada item Aktifkan \"Mode Terbatas\" Oleh %s Dibuat oleh %s @@ -516,14 +483,14 @@ Belum ada markah daftar putar Pilih daftar putar Tidak pernah - Hanya pada Wi-Fi + Hanya di Wi-Fi Otomatis mulai pemutaran — %s Putar antrean - URL tidak dikenali. Buka dengan aplikasi lain\? + URL tidak dikenali. Buka dengan aplikasi lain? Otomatis antre Antrean dari pemutar yang aktif akan digantikan - Beralih ke pemutar yang lain mungkin akan mengganti antrean Anda - Konfirmasikan sebelum mengosongkan antrean + Beralih dari satu pemutar ke yang lain mungkin menggantikan antrean Anda + Minta konfirmasi sebelum menghapus antrean Tidak ada Bufer Aduk @@ -539,7 +506,7 @@ Ubah ukuran thumbnail ke rasio aspek 1:1 Tampilkan kebocoran memori Ditambahkan - Tambahkan + Antrekan Hapus kuki yang disimpan oleh NewPipe saat Anda memecahkan reCAPTCHA Kuki reCAPTCHA telah dihapus Hapus kuki reCAPTCHA @@ -568,20 +535,19 @@ Konten ini bersifat privat, sehingga tidak dapat diputar atau diunduh oleh NewPipe. Ini adalah sebuah trek SoundCloud Go +, setidaknya di negara Anda, sehingga tidak bisa diputar atau diunduh oleh NewPipe. Konten ini tidak tersedia di negara Anda. - Hentikan aplikasi - Video ini dibatasi usia. -\nKarena kebijakan YouTube yang baru dengan video yang dibatasi usia, NewPipe tidak bisa mengakses video dan tidak bisa memutarnya. + Hancurkan aplikasinya + Video ini dibatasi usia. \nKarena kebijakan YouTube yang baru dengan video yang dibatasi usia, NewPipe tidak bisa mengakses video dan tidak bisa memutarnya. Anda bisa memilih tema malam favorit Anda di bawah ini Pilih tema malam favoritmu — %s - Otomatis (sesuai perangkat) + Otomatis (tema perangkat) Radio Unggulan Selesaikan - Tema gelap + Tema malam Pengunduhan dimulai Tampilkan detail channel - Nonaktifkan terowongan media (tunnel) jika anda mengalami sebuah layar hitam atau kerusakan dalam memutar video. - Nonaktifkan terowongan media (tunnel) + Matikan penerowongan/tunneling media jika Anda mengalami layar hitam atau tersendat saat memutar video. + Matikan penerowongan/tunneling media Internal Privasi Tidak didaftar @@ -600,15 +566,13 @@ Buka situs web Akun dinonaktifkan Mode langganan cepat tidak menyediakan lebih banyak info tentang ini. - Akun kreator telah dinonaktifkan. -\nNewPipe tidak akan bisa memuat langganan ini lagi. -\nApakah Anda ingin berhenti berlangganan channel ini\? + Akun kreator telah dinonaktifkan. \nNewPipe tidak akan bisa memuat langganan ini lagi. \nApakah Anda ingin berhenti berlangganan channel ini? Tidak bisa memuat langganan untuk \'%s\'. Galat memuat langganan Mulai Android 10, hanya \'Storage Access Framework\' yang didukung Anda akan ditanya lokasi penyimpanan berkas unduhan Belum ada folder unduhan terpasang, pilih folder unduhan sekarang - Nonaktif + Mati Hidup Mode tablet Jangan tampilkan @@ -617,7 +581,7 @@ Komentar dinonaktifkan Pratinjau thumbnail bilah laju Tandai \'sudah tonton\' - Buka pemutar utama dalam layar penuh + Mulai pemutar utama dalam layar penuh %s unduhan selesai @@ -630,28 +594,26 @@ tambahkan ke selanjutnya telah ditambahkan ke selanjutnya - Jangan memulai memutar video di mini player, tapi nyalakan langsung di mode layar penuh, jika rotasi otomatis terkunci. Anda tetap dapat mengakses mini player dengan keluar dari layar penuh + Jangan memulai video di pemutar mini, tetapi langsung beralih ke mode layar penuh, jika rotasi otomatis terkunci. Anda masih dapat mengakses pemutar mini dengan keluar dari layar penuh Memproses… Mungkin butuh waktu sebentar Periksa Pembaruan Periksa secara manual untuk melihat aplikasi versi baru Memeriksa pembaruan… Item feed baru Tampilkan \"Mogokkan pemutar\" - Menampilkan opsi penghentian ketika menggunakan pemain video + Menampilkan opsi hancurkan saat menggunakan pemutar Hentikan pemutar video Notifikasi untuk melaporkan kegalatan Notifikasi laporan kegalatan Sebuah kegalatan terjadi, lihat notifikasinya - Menampilkan sebuah snackbar kegalatan - Buat sebuah notifikasi kegalatan - Tidak ada pengelola berkas yang ditemukan untuk tindakan ini. -\nSilakan pasang pengelola berkas atau coba nonaktifkan \'%s\' di pengaturan unduhan + Tampilkan snackbar kesalahan + Buat notifikasi kesalahan + Tidak ada pengelola berkas yang ditemukan untuk tindakan ini. \nSilakan pasang pengelola berkas atau coba nonaktifkan \'%s\' di pengaturan unduhan NewPipe mengalami sebuah kegalatan, ketuk untuk melaporkan - Tidak ada pengelola berkas yang ditemukan untuk tindakan ini. -\nSilakan pasang pengelola berkas yang kompatibel dengan Storage Access Framework + Tidak ada pengelola berkas yang ditemukan untuk tindakan ini. \nSilakan pasang pengelola berkas yang kompatibel dengan Storage Access Framework Komentar dipin LeakCanary tidak tersedia - ExoPlayer bawaan + Bawaan ExoPlayer Memuat detail penjaliran … Frekuensi pemeriksaan Dibutuhkan koneksi jaringan @@ -662,8 +624,8 @@ %s stream baru - Jalankan periksa untuk stream baru - Hapus semua file yang terunduh dari disk\? + Jalankan pemeriksaan untuk aliran baru + Hapus semua file yang terunduh dari disk? Notifikasi dinonaktifkan Notifikasi pemain Notifikasi @@ -682,7 +644,7 @@ Tidak ada stream audio yang tersedia untuk pemain eksternal Pilih kualitas untuk pemain eksternal Format tidak diketahui - Ukuran selang pemuatan putar balik + Ukuran interval pemuatan pemutaran Pertanyaan yang sering diajukan Jika Anda mengalami kesulitan menggunakan aplikasi, pastikan untuk memeriksa jawaban atas pertanyaan umum ini! Lihat di situs web @@ -697,33 +659,31 @@ Kartu Daftar putar yang bewarna abu-abu sudah berisi item ini. Duplikat ditambahkan %d kali - Berguna, misalnya, jika kamu menggunakan sebuah set kepala dengan tombol fisik yang rusak - Abaikan peristiwa tombol media perangkat keras + Berguna, misalnya, jika Anda menggunakan headset dengan tombol fisik yang rusak + Abaikan peristiwa tombol media pada perangkat keras Hapus duplikat Ditonton secara lengkap Ditonton sebagian Mendatang Tampilkan/Sembunyikan saluran - Hapus duplikat\? - Apakah Anda ingin menghapus semua saluran duplikat di daftar putar ini\? + Hapus duplikat? + Apakah Anda ingin menghapus semua saluran duplikat di daftar putar ini? Tampilkan saluran berikut Pilih gestur untuk bagian kiri layar pemutar Tindakan gestur kiri Tidak ada - Pilih gestur untuk bagian kanan dari layar pemutar + Pilih gestur untuk bagian kanan layar pemutar Tindakan gestur kanan Kecerahan Volume - Kelola beberapa pengaturan ExoPlayer. Perubahan ini mengharuskan pemain memulai ulang agar diterapkan - Aktifkan opsi ini jika Anda mengalami masalah inisialisasi dekoder, yang akan kembali ke dekoder dengan prioritas lebih rendah jika inisialisasi dekoder primer gagal. Hal ini dapat mengakibatkan performa pemutaran yang buruk dibandingkan saat menggunakan dekoder primer - Solusi ini melepaskan dan memasang kembali codec video ketika terjadi perubahan permukaan, alih-alih mengatur permukaan ke codec secara langsung. Sudah digunakan oleh ExoPlayer pada beberapa perangkat dengan masalah ini, pengaturan ini hanya berpengaruh pada Android 6 dan yang lebih tinggi -\n -\nMengaktifkan opsi ini dapat mencegah kesalahan pemutaran saat mengganti pemutar video saat ini atau beralih ke layar penuh + Kelola beberapa pengaturan ExoPlayer. Perubahan ini memerlukan mulai ulang pemutar agar dapat diterapkan + Hidupkan opsi ini jika Anda mengalami masalah inisialisasi dekoder, yang akan dikembalikan ke dekoder dengan prioritas lebih rendah jika inisialisasi dekoder utama gagal. Hal ini dapat menyebabkan kinerja pemutaran yang buruk dibandingkan saat menggunakan dekoder utama + Solusi ini merilis dan membuat ulang instansi codec video ketika terjadi perubahan permukaan, alih-alih menyetel permukaan ke codec secara langsung. Sudah digunakan oleh ExoPlayer pada beberapa perangkat yang mengalami masalah ini, pengaturan ini hanya berpengaruh pada Android 6 dan lebih tinggi\n\nMenghidupkan opsi ini dapat mencegah kesalahan pemutaran saat mengganti pemutar video saat ini atau beralih ke layar penuh Ubah ukuran selang pemuatan pada konten progresif (saat ini %s). Nilai yang lebih rendah dapat mempercepat pemuatan awal konten - Pilih audio asli - Pilih trek audio asli apa pun bahasanya - PIlih audio deskriptif - Pilih trek audio dengan deskripsi untuk orang tunanetra jika tersedia + Lebih suka audio asli + Pilih trek audio asli apapun bahasanya + Lebih suka audio deskriptif + Pilih trek audio dengan deskripsi untuk penyandang tunanetra jika tersedia Suara: %s Trek audio Trek audio harus sudah ada dalam aliran ini @@ -738,7 +698,7 @@ Pindahkan tab utama ke bagian bawah Posisi tab utama %1$s %2$s - Terowongan media dinonaktifkan secara bawaan di perangkat Anda karena model perangkat Anda tidak mendukungnya. + Penerowongan/tunneling media dimatikan secara bawaan di perangkat Anda karena model perangkat Anda diketahui tidak mendukungnya. Tidak ada siaran langsung Video Pelanggan @@ -779,8 +739,7 @@ Keluku Bagikan daftar URL Bagikan dengan Judul - %1$s -\n%2$s + %1$s \n%2$s Bagikan Daftar Putar Panji - %1$s: %2$s @@ -791,16 +750,13 @@ %s balasan Tidak ada ruang yang cukup pada perangkat - Iya + Ya Tidak Atur ulang pengaturan Atur ulang pengaturan ke nilai bawaan - Mengatur ulang semua pengaturan akan mengabaikan pengaturan Anda yang disukai dan memulai ulang aplikasi. -\n -\nApakah Anda yakin ingin melanjutkan? - NewPipe dapat memeriksa versi baru secara berkala dan memberi tahu Anda ketika ada yang baru. -\nApakah Anda ingin mengaktifkan ini? - Cadangkan dan Pulihkan + Mengatur ulang semua pengaturan akan mengabaikan pengaturan Anda yang disukai dan memulai ulang aplikasi. \n \nApakah Anda yakin ingin melanjutkan? + NewPipe dapat memeriksa versi baru secara berkala dan memberi tahu Anda ketika ada yang baru. \nApakah Anda ingin mengaktifkan ini? + Cadangkan dan pulihkan Pengaturan dalam ekspor yang diimpor menggunakan format rentan yang tidak digunakan lagi sejak NewPipe 0.27.0. Pastikan ekspor yang diimpor berasal dari sumber tepercaya, dan lebih memilih hanya menggunakan ekspor yang diperoleh dari NewPipe 0.27.0 atau yang lebih baru di masa mendatang. Dukungan untuk mengimpor pengaturan dalam format rentan ini akan segera dihapus sepenuhnya, dan NewPipe versi lama tidak akan dapat lagi mengimpor pengaturan ekspor dari versi baru. sekunder Daftar putar @@ -808,8 +764,8 @@ Halaman grup saluran Belum ada grup umpan yang dibuat Pilih grup umpan - Cari %1$s - Cari %1$s (%2$s) + Telusuri %1$s + Telusuri %1$s (%2$s) Suka Halaman Top 50 SoundCloud dihapus SoundCloud telah menghentikan dukungan tangga lagu Top 50. Tab terkait telah dihapus dari halaman utama Anda. diff --git a/app/src/main/res/values-is/strings.xml b/app/src/main/res/values-is/strings.xml index a36968de3..60711ee4a 100644 --- a/app/src/main/res/values-is/strings.xml +++ b/app/src/main/res/values-is/strings.xml @@ -23,22 +23,14 @@ Merkja sem séð Deila Óþekkt gæði - Áttirðu við „%1$s\?“ + Áttirðu við „%1$s?“ Niðurstöður fyrir: %s Áskriftir Tilkynningar um ný streymi fyrir áskriftir Ekki tókst að flytja út áskriftir Engar áskriftir ennþá Ekki tókst að flytja inn áskriftir - Flytja inn YouTube áskriftir frá Google takeout: -\n -\n1) Farðu á: %1$s -\n2) Skráðu þig inn þegar spurt er. -\n3) Smelltu á „Öll gögn innifalin,“ síðan á „Afvelja allt,“ veldu síðan aðeins „áskriftir“ og smelltu á „Í lagi.“ -\n4) Smelltu á „Næsta skref“ og síðan á „Búa til útflutning.“ -\n5) Smelltu á \"Sækja\" hnappinn eftir að hann birtist. -\n6) Smelltu á FLYTJA INN SKRÁ fyrir neðan og veldu .zip skrána. -\n7) [Ef .zip innflutningur mistekst] Taktu út .csv skrána (venjulega undir „YouTube og YouTube Music/subscriptions/subscriptions.csv“), smelltu á FLYTJA INN SKRÁ fyrir neðan og veldu þá skrá. + Flytja inn YouTube áskriftir frá Google takeout: \n \n1) Farðu á: %1$s \n2) Skráðu þig inn þegar spurt er. \n3) Smelltu á „Öll gögn innifalin,“ síðan á „Afvelja allt,“ veldu síðan aðeins „áskriftir“ og smelltu á „Í lagi.“ \n4) Smelltu á „Næsta skref“ og síðan á „Búa til útflutning.“ \n5) Smelltu á \"Sækja\" hnappinn eftir að hann birtist. \n6) Smelltu á FLYTJA INN SKRÁ fyrir neðan og veldu .zip skrána. \n7) [Ef .zip innflutningur mistekst] Taktu út .csv skrána (venjulega undir „YouTube og YouTube Music/subscriptions/subscriptions.csv“), smelltu á FLYTJA INN SKRÁ fyrir neðan og veldu þá skrá. Nota utanaðkomandi hljóðspilara Frjáls og léttur streymisspilari fyrir Android. Um NewPipe @@ -130,8 +122,7 @@ NewPipe er að sækja Fyrir frekari upplýsingar og nýjustu fréttir um NewPipe geturðu skoðað heimasíðu okkar. Persónuverndarstefna NewPipe - NewPipe verkefnið tekur friðhelgi þína mjög alvarlega. Þess vegna safnar forritið ekkert án samþykkis þíns. -\nPersónuverndarstefna NewPipe útskýrir í smáatriðum hvaða gögn eru send og geymd þegar þú sendir hrunskýrslu. + NewPipe verkefnið tekur friðhelgi þína mjög alvarlega. Þess vegna safnar forritið ekkert án samþykkis þíns. \nPersónuverndarstefna NewPipe útskýrir í smáatriðum hvaða gögn eru send og geymd þegar þú sendir hrunskýrslu. Spilari Villuleit Sjálfgefið tungumál efnis @@ -160,7 +151,7 @@ Sótt myndskeið fara hingað Mappa fyrir sóttar hljóðskrár Sjálfgefin upplausn - Kore forritið fannst ekki, setja það upp\? + Kore forritið fannst ekki, setja það upp? Sýna \"Spila með Kodi\" hnapp Skera smámynd myndskeiðs sem sýnd er í tilkynningum úr 16:9 niður í 1:1 stærðarhlutföll Þriðji aðgerðahnappur @@ -203,7 +194,7 @@ Afrita sniðna skýrslu Tilkynna á GitHub Endurheimta sjálfgefnar stillingar - Viltu endurheimta sjálfgefnar stillingar\? + Viltu endurheimta sjálfgefnar stillingar? Æi, þetta ætti ekki að gerast. Tilkynna með tölvupósti Tilkynna @@ -272,7 +263,7 @@ Fjarlægja Nánar Ath: gat ekki flutt inn allar skrár. - Viltu einnig flytja inn stillingar\? + Viltu einnig flytja inn stillingar? Gat ekki hlaðið ummælum Topp 50 Setja í röð @@ -402,7 +393,7 @@ Spilunarlisti búinn til Bókamerkja spilunarlista Fjarlægja bókamerki - Eyða þessum spilunarlista\? + Eyða þessum spilunarlista? Smámynd spilunarlista breytt. Búið til sjálfkrafa (höfundur fannst ekki) Engin skýringartexti @@ -414,15 +405,8 @@ Flytja inn frá Flytja út til Fyrri útflutningur - Flyttu inn SoundCloud reikningi með því að slá inn slóð þess eða auðkenni: -\n -\n1) Virkjaðu skrifborðsstillingu í vafra. Síðan er ekki fáanleg fyrir farsíma. -\n2) Farðu hingað: %1$s -\n3) Skráðu þig inn þegar spurt er. -\n4. Afritaðu slóðina sem þér var vísað á. - Þessi aðgerð getur valdið mikla netnotkun. -\n -\nHalda áfram\? + Flyttu inn SoundCloud reikningi með því að slá inn slóð þess eða auðkenni: \n \n1) Virkjaðu skrifborðsstillingu í vafra. Síðan er ekki fáanleg fyrir farsíma. \n2) Farðu hingað: %1$s \n3) Skráðu þig inn þegar spurt er. \n4. Afritaðu slóðina sem þér var vísað á. + Þessi aðgerð getur valdið mikla netnotkun. \n \nHalda áfram? Spilunarhraði Spóla áfram í þögn Engin takmörk @@ -505,12 +489,11 @@ Geyma leitarfyrirspurnir í tæki Ræsa aðalspilara í fullskjásstillingu Sprettigluggaspilun - Þetta myndskeið er með aldurstakmörk. -\nVegna nýrra reglna YouTube er ekki hægt að streyma því eða sækja með NewPipe. - Eyða öllum spilunarstaðsetningum\? + Þetta myndskeið er með aldurstakmörk. \nVegna nýrra reglna YouTube er ekki hægt að streyma því eða sækja með NewPipe. + Eyða öllum spilunarstaðsetningum? Spilunarstaðsetningum eytt Hreinsa leitarferil - Hreinsa allan leitarferil\? + Hreinsa allan leitarferil? Leitarferli eytt Ytri geymsla ekki tiltæk Gat ekki hlaðið inn öllum smámyndum @@ -534,18 +517,16 @@ Skilgreindu niðurhalsmöppu síðar í stillingunum Engin niðurhalsmappa er stillt ennþá. Veldu sjálfgefna niðurhalsmöppu núna - Þessa heimildar þarfnast til að -\nopna í sprettiglugga + Þessa heimildar þarfnast til að \nopna í sprettiglugga Ógildum stöfum er skipt út með þessum Flestir sérstafir - Viltu eyða þessu atriði úr leitarferlinum\? + Viltu eyða þessu atriði úr leitarferlinum? Gera hlé þegar skipt er yfir í farsímanet Sumir netþjónar styðja ekki hlé á niðurölum Takmarka niðurhalsröð Eitt niðurhal í einu Spyrja hvert ætti að sækja skrár - Þú verður spurð(ur) hvert ætti að sækja skrár í hvert skipti. -\nVirkjaðu kerfismöppuval (SAF) ef þú vilt nota ytra SD-kort + Þú verður spurð(ur) hvert ætti að sækja skrár í hvert skipti. \nVirkjaðu kerfismöppuval (SAF) ef þú vilt nota ytra SD-kort Þú verður spurð(ur) hvert ætti að sækja skrár í hvert skipti Virkja kerfismöppuval (SAF) Fjarlægja streymi sem búið er að horfa á? @@ -554,16 +535,14 @@ Ný atriði í streymi Engar áskriftir valdar Tómt hópsnafn - Viltu eyða þessum hóp\? + Viltu eyða þessum hóp? Hversu oft á að uppfæra streymi áður en áskrift er talin útrunnin — %s Takmörk á uppfærslu streymis Reikningur höfundar er lokaður.\nNewPipe getur ekki sótt þetta streymi lengur.\nViltu segja upp áskrift? Hraðstreymishamurinn veitir ekki frekari upplýsingar um þetta. Virkja hraðstreymisham Afvirkja hraðstreymisham - NewPipe styður ekki þetta efni. -\n -\nÞað verður vonandi stutt í framtíðarútgáfu. + NewPipe styður ekki þetta efni. \n \nÞað verður vonandi stutt í framtíðarútgáfu. Skapað af %s Nota smámynd fyrir tilkynningar og bakgrunn lásskjás Ekkert forrit í tækinu þínu getur opnað þetta @@ -584,7 +563,7 @@ Byrja leit að nýjum streymum get ekki skrifað yfir skrána Eyða sóttum skrám - Viltu hreinsa niðurhalsferilinn eða eyða öllum sóttum skrám\? + Viltu hreinsa niðurhalsferilinn eða eyða öllum sóttum skrám? Engin myndstreymi eru í boði fyrir utanaðkomandi spilara Eyða vefkökum reCAPTCHA Vefkökum reCAPTCHA eytt @@ -600,7 +579,7 @@ Sýna spilunarstöður í listum Sýna ábendinguna „Haltu niðri til að bæta við spilunarröð“ Sýna ábendingu þegar ýtt er á bakgrunninn eða sprettihnappinn á myndskeiðinu í „Nánar:\" - Óþekkt slóð. Opna með öðru forriti\? + Óþekkt slóð. Opna með öðru forriti? Veldu uppáhalds PeerTube tilvik þín Þú mátt finna tilviki á %s Gat ekki staðfest tilvik @@ -610,9 +589,7 @@ Sýna efni sem hugsanlega hentar ekki börnum vegna þess að það hefur aldurstakmark (t.d. 18+) Kveikja á öryggisham YouTube YouTube býður upp á öryggisham sem felur efni sem gæti hugsanlega verið óviðeigandi fyrir börn - Þetta myndskeið er með aldurstakmörk. -\n -\nKveiktu á „%1$s“ í stillingunum ef þú vilt sjá það. + Þetta myndskeið er með aldurstakmörk. \n \nKveiktu á „%1$s“ í stillingunum ef þú vilt sjá það. Tilkynning um gátsummu myndskeiðs Tilkynning um framvindu gátsummu myndskeiðs Villuskýrslutilkynning @@ -621,11 +598,11 @@ Skipta yfir í sprettiglugga Skipta yfir í aðalspilara Eyðir ferli spilaðra streyma og stöðum í spilun - Eyða áhorfsferil\? + Eyða áhorfsferil? Áhorfsferli eytt Eyða spilunarstöðum Eyðir öllum spilunarstöðum - Niðurhal á SD kort er ekki mögulegt. Endurstilla niðurhalsmöppu\? + Niðurhal á SD kort er ekki mögulegt. Endurstilla niðurhalsmöppu? Strjúktu til að fjarlægja Engir spilunarlistar bókamerktir ennþá Veldu sölusíðu @@ -662,7 +639,7 @@ Framvinda tapaðist vegna þess að skránni var eytt Get ekki endurheimt þetta niðurhal Hreinsa niðurhalsferil - Eyða öllum sóttum skrám\? + Eyða öllum sóttum skrám? %1$s sótt skrá eytt %1$s sóttum skrám eytt @@ -742,8 +719,7 @@ Deila með titlum Deila lista yfir slóðir - %1$s: %2$s - %1$s -\n%2$s + %1$s \n%2$s Sýna meira Sýna minna Þessi valkostur er aðeins tiltækur ef %s er valið sem þema diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 872c466ca..9a622d094 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -1,7 +1,7 @@ Pubblicato il %1$s - Nessun lettore multimediale trovato. Installare VLC\? + Nessun lettore multimediale trovato. Installare VLC? Installa Annulla Apri nel browser @@ -9,14 +9,14 @@ Scarica Cerca Impostazioni - Forse cercavi \"%1$s\"\? + Forse cercavi \"%1$s\"? Condividi con Cartella video scaricati I video scaricati saranno salvati qui Scegli la cartella per i video scaricati Risoluzione predefinita Riproduci con Kodi - Installare l\'app Kore\? + Installare l\'app Kore? Mostra \"Riproduci con Kodi\" Mostra l\'opzione per riprodurre video tramite Kodi Audio @@ -99,8 +99,7 @@ Scegli suggerimenti di ricerca Cancella Risoluzione migliore - Questo permesso è necessario -\nper utilizzare il lettore popup + Questo permesso è necessario \nper utilizzare il lettore popup Licenze di terze parti © %1$s di %2$s protetto da licenza %3$s Informazioni e domande frequenti @@ -159,7 +158,7 @@ %s video Nulla da mostrare - Eliminare questo elemento dalla cronologia delle ricerche\? + Eliminare questo elemento dalla cronologia delle ricerche? Contenuto della pagina principale Pagina vuota Contenuti in evidenza personalizzati @@ -232,7 +231,7 @@ Imposta come copertina della playlist Salva playlist Rimuovi playlist - Eliminare la playlist\? + Eliminare la playlist? Playlist creata Aggiunto alla playlist Copertina della playlist cambiata. @@ -264,25 +263,10 @@ Esportazione precedente Impossibile importare le iscrizioni Impossibile esportare le iscrizioni - Importa le iscrizioni di YouTube scaricando il file d\'esportazione: -\n -\n1. Vai a questo URL: %1$s -\n2. Accedi quando richiesto -\n3. Premi \"Tutti i dati inclusi\", \"Deseleziona tutto\", seleziona solo \"iscrizioni\" e premi \"OK\" -\n4. Premi \"Passaggio successivo\" e poi \"Crea esportazione\" -\n5. Premi il pulsante \"Scarica\" quando compare -\n6. Premi IMPORTA FILE qui sotto e seleziona il file ZIP scaricato -\n7. [Se l\'importazione fallisce] Estrai il file CSV (solitamente in \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), premi IMPORTA FILE qui sotto e seleziona il file CSV estratto - Importa un profilo SoundCloud inserendo l\'URL o il tuo ID: -\n -\n1. Abilitare la «modalità desktop» del browser (il sito non è disponibile per i dispositivi mobili) -\n2. Aprire questo URL: %1$s -\n3. Accedere quando richiesto -\n4. Copiare l\'URL del profilo a cui si viene indirizzati. + Importa le iscrizioni di YouTube scaricando il file d\'esportazione: \n \n1. Vai a questo URL: %1$s \n2. Accedi quando richiesto \n3. Premi \"Tutti i dati inclusi\", \"Deseleziona tutto\", seleziona solo \"iscrizioni\" e premi \"OK\" \n4. Premi \"Passaggio successivo\" e poi \"Crea esportazione\" \n5. Premi il pulsante \"Scarica\" quando compare \n6. Premi IMPORTA FILE qui sotto e seleziona il file ZIP scaricato \n7. [Se l\'importazione fallisce] Estrai il file CSV (solitamente in \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), premi IMPORTA FILE qui sotto e seleziona il file CSV estratto + Importa un profilo SoundCloud inserendo l\'URL o il tuo ID: \n \n1. Abilitare la «modalità desktop» del browser (il sito non è disponibile per i dispositivi mobili) \n2. Aprire questo URL: %1$s \n3. Accedere quando richiesto \n4. Copiare l\'URL del profilo a cui si viene indirizzati. iltuoID, soundcloud.com/iltuoid - Tieni presente che questa operazione può consumare una grande quantità di traffico dati. -\n -\nVuoi continuare? + Tieni presente che questa operazione può consumare una grande quantità di traffico dati. \n \nVuoi continuare? Cache immagini svuotata Svuota la cache dei metadati Elimina i dati delle pagine web memorizzati nella cache @@ -298,21 +282,19 @@ Modifica la scala del testo dei sottotitoli e gli stili di sfondo. Richiede il riavvio dell\'app per applicare Elimina la cronologia delle visualizzazioni Elimina la cronologia degli elementi riprodotti e le posizioni di riproduzione - Eliminare la cronologia delle visualizzazioni\? + Eliminare la cronologia delle visualizzazioni? Cronologia delle visualizzazioni eliminata Elimina la cronologia delle ricerche Elimina la cronologia dei termini di ricerca - Eliminare la cronologia delle ricerche\? + Eliminare la cronologia delle ricerche? Cronologia delle ricerche eliminata 1 elemento eliminato. NewPipe è software libre copyleft: puoi utilizzare, studiare, condividere e migliorare a volontà il suo codice sorgente. Nello specifico è possibile ridistribuirlo e/o modificarlo in base ai termini della GNU General Public License come pubblicato dalla Free Software Foundation, sia la versione 3 della licenza sia (a vostra scelta) qualsiasi versione successiva. Vuoi anche importare le impostazioni? Politica di riservatezza di NewPipe - Il progetto NewPipe tiene molto alla tua privacy. Perciò, l\'app non raccoglie alcun dato senza il tuo consenso. -\nL\'informativa sulla privacy spiega nel dettaglio quali dati vengono trattati e memorizzati durante l\'invio di segnalazioni per arresti anomali. + Il progetto NewPipe tiene molto alla tua privacy. Perciò, l\'app non raccoglie alcun dato senza il tuo consenso. \nL\'informativa sulla privacy spiega nel dettaglio quali dati vengono trattati e memorizzati durante l\'invio di segnalazioni per arresti anomali. Leggi la politica di riservatezza - Per rispettare il regolamento europeo sulla protezione dei dati (GDPR), richiamiamo la vostra attenzione sull\'informativa sulla privacy di NewPipe. Si prega di leggerla attentamente. -\nDeve essere accettata per poter inviare la segnalazione. + Per rispettare il regolamento europeo sulla protezione dei dati (GDPR), richiamiamo la vostra attenzione sull\'informativa sulla privacy di NewPipe. Si prega di leggerla attentamente. \nDeve essere accettata per poter inviare la segnalazione. Accetto Rifiuto Nessun limite @@ -336,10 +318,10 @@ Notifiche per aggiornamenti dell\'app Notifiche per le nuove versioni di NewPipe Archiviazione esterna non disponibile - Impossibile scaricare sulla scheda SD esterna. Ripristinare la posizione della cartella dei download\? + Impossibile scaricare sulla scheda SD esterna. Ripristinare la posizione della cartella dei download? Impossibile leggere le schede salvate, verranno usate quelle predefinite Ripristina predefiniti - Ripristinare valori predefiniti\? + Ripristinare valori predefiniti? Contatore degli iscritti non disponibile Schede mostrate nella pagina principale Aggiornamenti @@ -398,19 +380,18 @@ NewPipe è stato chiuso mentre lavorava sul file Spazio insufficiente sul dispositivo Progresso perso poiché il file è stato eliminato - Vuoi cancellare la cronologia dei download o eliminare tutti i file scaricati\? + Vuoi cancellare la cronologia dei download o eliminare tutti i file scaricati? Sarà avviato un solo download per volta Avvia i download Sospendi i download Chiedi dove scaricare - È necessario specificare la destinazione di ogni dowload. -\nPer salvare i file su una scheda esterna è necessario attivare il selettore di cartelle di sistema (SAF) + È necessario specificare la destinazione di ogni dowload. \nPer salvare i file su una scheda esterna è necessario attivare il selettore di cartelle di sistema (SAF) Usa il selettore di cartelle di sistema (SAF) Limita coda dei download Il Framework di accesso all\'archiviazione consente di salvare i file su una memoria esterna Elimina le posizioni di riproduzione Elimina tutte le posizioni di riproduzione - Eliminare tutte le posizioni di riproduzione\? + Eliminare tutte le posizioni di riproduzione? Attiva/disattiva il servizio, attualmente selezionato: Nessuno sta guardando @@ -484,7 +465,7 @@ %d selezionati %d selezionati - Eliminare questo gruppo\? + Eliminare questo gruppo? Nuovo Feed Limite aggiornamento feed @@ -494,29 +475,15 @@ Disponibile per alcuni servizi. Solitamente è molto più veloce, ma può restituire una quantità limitata di elementi e informazioni spesso incomplete (es. durata, tipo di elemento, indicatore per video in diretta) Attiva recupero veloce Disattiva recupero veloce - Il recupero dei feed è troppo lento\? Prova ad abilitare il recupero veloce (nelle impostazioni o premendo il pulsante qui sotto). -\n -\nNewPipe può caricare i feed in due modi: -\n• Recuperando l\'intero canale, lento ma completo. -\n• Utilizzando un endpoint dedicato, veloce ma solitamente incompleto. -\n -\nSolitamente il metodo più rapido offre meno informazioni, come la durata o il tipo di elemento (non distingue i video normali da quelli in diretta), e può restituire meno elementi. -\n -\nPer YouTube è possibile usare il recupero veloce sfruttando i suoi feed RSS. -\n -\nLa scelta va fatta in base alle proprie preferenze: velocità o informazioni precise. + Il recupero dei feed è troppo lento? Prova ad abilitare il recupero veloce (nelle impostazioni o premendo il pulsante qui sotto). \n \nNewPipe può caricare i feed in due modi: \n• Recuperando l\'intero canale, lento ma completo. \n• Utilizzando un endpoint dedicato, veloce ma solitamente incompleto. \n \nSolitamente il metodo più rapido offre meno informazioni, come la durata o il tipo di elemento (non distingue i video normali da quelli in diretta), e può restituire meno elementi. \n \nPer YouTube è possibile usare il recupero veloce sfruttando i suoi feed RSS. \n \nLa scelta va fatta in base alle proprie preferenze: velocità o informazioni precise. Gruppo senza nome - Questo contenuto non è supportato da NewPipe. -\n -\nSi spera che possa essere supportato in una versione futura. + Questo contenuto non è supportato da NewPipe. \n \nSi spera che possa essere supportato in una versione futura. ∞ video 100+ video Artisti Album Canzoni - Questo video ha restrizioni di età. -\n -\nAttivare «%1$s» nelle Impostazioni per poterlo vedere. + Questo video ha restrizioni di età. \n \nAttivare «%1$s» nelle Impostazioni per poterlo vedere. Sì, anche quelli visualizzati parzialmente I video che sono stati visti prima e dopo essere stati aggiunti alla playlist verranno rimossi. \nProcedere? Rimuovere i video già visti? @@ -539,7 +506,7 @@ Coda riproduzione Solo Wi-Fi Avvia la riproduzione automaticamente — %s - URL non riconosciuto. Vuoi aprirlo con un\'altra app\? + URL non riconosciuto. Vuoi aprirlo con un\'altra app? Accoda automaticamente La coda del lettore attivo sarà sostituita Chiedi prima di svuotare la coda @@ -589,8 +556,7 @@ Questo video è disponibile solo per i membri di YouTube Music Premium, quindi non può essere riprodotto o scaricato da NewPipe. Questo contenuto è privato, quindi non può essere riprodotto o scaricato da NewPipe. Questo contenuto non è disponibile nel tuo Paese. - Questo video è soggetto a restrizioni di età. -\nA causa delle nuove politiche di YouTube, NewPipe non può accedere a questo tipo di video. + Questo video è soggetto a restrizioni di età. \nA causa delle nuove politiche di YouTube, NewPipe non può accedere a questo tipo di video. Radio In evidenza Risolvi @@ -620,9 +586,7 @@ Visita il sito Account chiuso Il recupero veloce dei feed non fornisce ulteriori informazioni al riguardo. - L\'account dell\'autore è stato chiuso. -\nNewPipe non sarà più in grado di caricare questo feed. -\nDisiscriversi dal canale\? + L\'account dell\'autore è stato chiuso. \nNewPipe non sarà più in grado di caricare questo feed. \nDisiscriversi dal canale? Impossibile caricare feed per \"%s\". Errore caricamento feed A partire da Android 10 è supportato solo il Framework di accesso all\'archiviazione @@ -665,14 +629,12 @@ Fai crashare il lettore NewPipe ha riscontrato un errore, tocca per segnalarlo Mostra un messaggio di errore - Non è stato trovato alcun gestore di file appropriato per questa azione. -\nInstallane uno prova a disattivare \"%s\" nelle impostazioni di download + Non è stato trovato alcun gestore di file appropriato per questa azione. \nInstallane uno prova a disattivare \"%s\" nelle impostazioni di download Notifica per segnalazione errori Notifiche per segnalare errori Si è verificato un errore, vedi la notifica Crea una notifica di errore - Non è stato trovato alcun gestore di file appropriato per questa azione. -\nInstallane uno compatibile con Storage Access Framework + Non è stato trovato alcun gestore di file appropriato per questa azione. \nInstallane uno compatibile con Storage Access Framework Commento in primo piano LeakCanary non è disponibile Predefinito ExoPlayer @@ -694,7 +656,7 @@ %s nuovi contenuti Caricamento dei dettagli dei contenuti… - Cancellare dal dispositivo i file scaricati\? + Cancellare dal dispositivo i file scaricati? Controlla la presenza di nuovi contenuti Qualsiasi rete Le notifiche sono disabilitate @@ -726,8 +688,8 @@ Ignora eventi dei pulsanti multimediali hardware Utile usando cuffie con tasti fisici rotti Rimuovi elementi doppi - Rimuovere gli elementi doppi\? - Rimuovere tutti gli elementi doppi di questa playlist\? + Rimuovere gli elementi doppi? + Rimuovere tutti gli elementi doppi di questa playlist? Mostra gli elementi seguenti Mostra/Nascondi elementi Visti parzialmente @@ -759,9 +721,7 @@ descrittivo Per questo elemento dovrebbe già essere presente una traccia audio Attivare questa opzione in caso di problemi di inizializzazione del decodificatore. Verranno usati decodificatori di priorità inferiore se l\'inizializzazione di quelli primari fallisce. Le prestazioni di riproduzione potrebbero essere inferiori rispetto all\'uso di quelli primari - Questa soluzione alternativa rilascia e re-istanzia i codec video quando si verifica una modifica della superficie, invece di impostare direttamente la superficie sul codec. Già usata da ExoPlayer su alcuni dispositivi con questo problema, questa impostazione ha effetto solo su Android 6 e versioni successive -\n -\nL\'attivazione di questa opzione potrebbe impedire errori di riproduzione passando al lettore video attuale o passando a schermo intero + Questa soluzione alternativa rilascia e re-istanzia i codec video quando si verifica una modifica della superficie, invece di impostare direttamente la superficie sul codec. Già usata da ExoPlayer su alcuni dispositivi con questo problema, questa impostazione ha effetto solo su Android 6 e versioni successive \n \nL\'attivazione di questa opzione potrebbe impedire errori di riproduzione passando al lettore video attuale o passando a schermo intero Posizione schede principali Sposta le schede principali in fondo Il tunneling multimediale è stato disabilitato per impostazione predefinita sul dispositivo in uso, poiché è noto che il modello del dispositivo non lo supporta. @@ -806,8 +766,7 @@ Video precedente Condividi elenco URL Condividi con i titoli - %1$s -\n%2$s + %1$s \n%2$s Condividi playlist - %1$s: %2$s @@ -821,14 +780,11 @@ Non abbastanza spazio libero sul dispositivo Backup e ripristino Azzera le impostazioni - L\'azzeramento di tutte le impostazioni eliminerà tutte le proprie impostazioni e riavvierà l\'app. -\n -\nSei sicuro di voler procedere? + L\'azzeramento di tutte le impostazioni eliminerà tutte le proprie impostazioni e riavvierà l\'app. \n \nSei sicuro di voler procedere? Azzera tutte le impostazioni ai loro valori predefiniti Sì No - NewPipe può cercare automaticamente nuove versioni di tanto in tanto e avvisarti quando sono disponibili. -\nVuoi attivarlo? + NewPipe può cercare automaticamente nuove versioni di tanto in tanto e avvisarti quando sono disponibili. \nVuoi attivarlo? Le impostazioni nell\'export che viene importato usano un formato vulnerabile che è stato deprecato dalla versione 0.27.0 di NewPipe. Assicuratevi che l\'export importato venga da una fonte fidata, sarebbe preferibile usare solo exports ottenuti da NewPipe 0.27.0 o superiori, nel futuro. Il supporto all\'importazione di Impostazioni in questo formato vulnerabile sarà presto rimosso completamente, da quel momento le versioni di NewPipe più vecchie non saranno più in grado di importare impostazioni tramite export di versioni più recenti. secondaria Condividi come playlist YouTube temporanea diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index d3760700d..e87d7bf1e 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -9,7 +9,7 @@ ダウンロード 検索 設定 - もしかして: 「%1$s」\? + もしかして: 「%1$s」? 共有 動画を保存するフォルダー ダウンロードした動画をここに保存します @@ -84,8 +84,7 @@ ブラック すべて ポップアップモードで開く - ポップアップモードで開くには -\n権限の許可が必要です + ポップアップモードで開くには \n権限の許可が必要です ポップアップモードで再生中 無効 デフォルトの動画形式 @@ -281,15 +280,7 @@ 自動生成 プレーヤーのキャプションテキストの縮尺と背景スタイルを変更します。有効にするには、アプリの再起動が必要です 何もありません - Google takeout から YouTube の登録リストをインポート: -\n -\n1. この URL を開きます: %1$s -\n2. ログインしていなければログインします -\n3. \"すべて選択\" をクリックし、そして \"選択をすべて解除\" をクリック、そして \"登録チャンネル\" のみを選択し、\"OK\" をクリック -\n4. \"次のステップ\" をクリックし、そして \"エクスポートを作成\" をクリック -\n5. 表示されたら \"ダウンロード\" ボタンをクリック -\n6. ファイルからインポートをクリックしてダウンロードした zip ファイルを選択 -\n7. (インポートが失敗したら) csv ファイル (たいてい、\"YouTube と YouTube Music/登録チャンネル/登録チャンネル.csv\" にある) を抽出し、ファイルからインポートをクリックして抽出した csv ファイルを選択 + Google takeout から YouTube の登録リストをインポート: \n \n1. この URL を開きます: %1$s \n2. ログインしていなければログインします \n3. \"すべて選択\" をクリックし、そして \"選択をすべて解除\" をクリック、そして \"登録チャンネル\" のみを選択し、\"OK\" をクリック \n4. \"次のステップ\" をクリックし、そして \"エクスポートを作成\" をクリック \n5. 表示されたら \"ダウンロード\" ボタンをクリック \n6. ファイルからインポートをクリックしてダウンロードした zip ファイルを選択 \n7. (インポートが失敗したら) csv ファイル (たいてい、\"YouTube と YouTube Music/登録チャンネル/登録チャンネル.csv\" にある) を抽出し、ファイルからインポートをクリックして抽出した csv ファイルを選択 リセット 同意する 拒否する @@ -303,16 +294,9 @@ メモリリークの監視は、ヒープダンピング時にアプリが無反応になる原因となります ライフサイクルエラーの報告 破棄されたフラグメントまたはアクティビティの、ライフサイクル範囲外での配信不能なRx例外を強制的に報告します - URL または ID を入力して SoundCloud プロファイルをインポートします: -\n -\n1. Web ブラウザーで \"デスクトップモード\" を有効にします (サイトは携帯デバイスで利用できません) -\n2. この URL に移動します: %1$s -\n3. 必要に応じてログインします -\n4. リダイレクトされたプロファイル URL をコピーします。 + URL または ID を入力して SoundCloud プロファイルをインポートします: \n \n1. Web ブラウザーで \"デスクトップモード\" を有効にします (サイトは携帯デバイスで利用できません) \n2. この URL に移動します: %1$s \n3. 必要に応じてログインします \n4. リダイレクトされたプロファイル URL をコピーします。 あなたのID, soundcloud.com/あなたのid - この操作により通信料金が増えることがあります。ご注意ください。 -\n -\n続行しますか\? + この操作により通信料金が増えることがあります。ご注意ください。 \n \n続行しますか? 再生速度を変更 速度と音程を連動せずに変更 (歪むかもしれません) 無音の間に早送り @@ -324,11 +308,10 @@ 新しい NewPipe バージョンの通知 外部記憶装置は利用できません 既定値に戻す - 既定の設定を復元しますか\? + 既定の設定を復元しますか? 登録者数は利用できません 会議 - ヨーロッパの一般データ保護規制(GDPR)に準拠するために、NewPipeの個人情報保護方針にご注意ください。よく読んでください。 -\n私たちに不具合報告を送るためには、これを受け入れなければなりません。 + ヨーロッパの一般データ保護規制(GDPR)に準拠するために、NewPipeの個人情報保護方針にご注意ください。よく読んでください。 \n私たちに不具合報告を送るためには、これを受け入れなければなりません。 アプリの更新 リストビュー モード リスト @@ -363,7 +346,7 @@ ダウンロードを中止するまでの最大再試行回数 ファイルを削除しました アプリの更新通知 - 外部 SD カードにダウンロードできません。ダウンロードフォルダーの場所をリセットしますか\? + 外部 SD カードにダウンロードできません。ダウンロードフォルダーの場所をリセットしますか? 保存されたタブを読み込めないため、デフォルトのタブを使用します メインページに表示されるタブ 新しいバージョンが利用可能なときにアプリの更新を確認する通知を表示します @@ -388,19 +371,18 @@ ファイルの作業中に NewPipe が閉じられました デバイスに空き容量がありません ファイルが削除されたため、進行状況が失われました - ダウンロード履歴、またはダウンロードしたファイルを消去しますか\? + ダウンロード履歴、またはダウンロードしたファイルを消去しますか? ダウンロード キューの制限 同時に1つのダウンロードが実行されます ダウンロードの開始 ダウンロードの一時停止 ダウンロード先を尋ねる - ダウンロードのたびに保存する場所を尋ねます。 -\nSD カードにダウンロードしたい場合はシステム フォルダ ピッカー (SAF) を有効化します + ダウンロードのたびに保存する場所を尋ねます。 \nSD カードにダウンロードしたい場合はシステム フォルダ ピッカー (SAF) を有効化します システム フォルダ ピッカー (SAF) を使用する ストレージアクセスフレームワークは、外部 SD カードへのダウンロードが可能です 再生位置の削除 すべての再生位置を削除します - すべての再生位置を削除しますか\? + すべての再生位置を削除しますか? サービスの切り替え、現在の選択: %s本の動画 @@ -474,28 +456,14 @@ いくつかのサービスで利用可能。通常よりも高速ですが制限された情報が取得され、たいていの場合不完全です (例: 再生時間、種類、ライブ ステータスなどがない) 高速モードを有効化 高速モードを無効化 - フィードの読み込みが遅すぎると思いますか? その場合、高速読み込みを有効化してみてください (設定、もしくは下のボタンを押して変更することができます)。 -\n -\nNewPipe は2つの読み込み方法を提供します: -\n・登録チャンネル全体を取得します。これは低速ですが完全です。 -\n・専用のサービス エンドポイントを使用します。これは高速ですが、たいていの場合不完全です。 -\n -\n2つの違いとして、高速なものは通常、再生時間や種類 (ライブと通常の動画を区別できない) などの情報が不足して、正しい量の情報より少なく取得することがあります。 -\n -\nYouTubeは、この高速な読み込み方法をRSSフィードで提供するサービスのひとつです。 -\n -\nつまり、読み込み方法の選択は速度または正確さのどちらを優先するか、あなたの好みによります。 + フィードの読み込みが遅すぎると思いますか? その場合、高速読み込みを有効化してみてください (設定、もしくは下のボタンを押して変更することができます)。 \n \nNewPipe は2つの読み込み方法を提供します: \n・登録チャンネル全体を取得します。これは低速ですが完全です。 \n・専用のサービス エンドポイントを使用します。これは高速ですが、たいていの場合不完全です。 \n \n2つの違いとして、高速なものは通常、再生時間や種類 (ライブと通常の動画を区別できない) などの情報が不足して、正しい量の情報より少なく取得することがあります。 \n \nYouTubeは、この高速な読み込み方法をRSSフィードで提供するサービスのひとつです。 \n \nつまり、読み込み方法の選択は速度または正確さのどちらを優先するか、あなたの好みによります。 ∞ の動画 100 以上の動画 - このコンテンツはまだ NewPipe でサポートされていません。 -\n -\n今後のバージョンでサポートされるかもしれません。 + このコンテンツはまだ NewPipe でサポートされていません。 \n \n今後のバージョンでサポートされるかもしれません。 曲 アーティスト アルバム - この動画には年齢制限があります。 -\n -\n閲覧したい場合、設定から \"%1$s\" を有効化してください。 + この動画には年齢制限があります。 \n \n閲覧したい場合、設定から \"%1$s\" を有効化してください。 プレイリストへの追加前または追加後に視聴済みとなった動画が削除されます。\nよろしいですか? はい、部分的に視聴した動画も削除します 視聴済みの動画を削除しますか? @@ -568,8 +536,7 @@ これは SoundCloud Go+ トラックなので、少なくともあなたの国では、NewPipeではストリーミングやダウンロードができません。 このコンテンツは、お住まいの国ではご利用いただけません。 アプリのクラッシュ - この動画は年齢制限があります。 -\n年齢制限付き動画を含む新しい YouTube ポリシーにより、NewPipe は動画ストリームにアクセスできないため再生できません。 + この動画は年齢制限があります。 \n年齢制限付き動画を含む新しい YouTube ポリシーにより、NewPipe は動画ストリームにアクセスできないため再生できません。 以下からお好みの夜間テーマを選択できます 自動 (デバイスのテーマ) お好みの夜間テーマを選択 — %s @@ -604,9 +571,7 @@ 説明文のテキストの選択を有効にする 今説明文のテキストを選択できます。選択モード中はページがちらついたりリンクがクリックできなくなったりすることに注意してください。 停止されたアカウント - この投稿者のアカウントは停止されています。 -\nNewPipe は将来的にこのフィードを読み込めなくなります。 -\nこのチャンネルの登録を解除しますか? + この投稿者のアカウントは停止されています。 \nNewPipe は将来的にこのフィードを読み込めなくなります。 \nこのチャンネルの登録を解除しますか? オフ オン タブレットモード @@ -642,10 +607,8 @@ エラーが発生しました (タップすると報告できます) スナックバーにエラーを表示 固定されたコメント - この動作に適切なファイルマネージャが見つかりませんでした。 -\nStorage Access Framework と互換性のあるファイルマネージャをインストールしてください - この動作に適切なファイルマネージャが見つかりませんでした。 -\nファイルマネージャをインストールするか、ダウンロード設定で \'%s\' を無効にすることをお試しください + この動作に適切なファイルマネージャが見つかりませんでした。 \nStorage Access Framework と互換性のあるファイルマネージャをインストールしてください + この動作に適切なファイルマネージャが見つかりませんでした。 \nファイルマネージャをインストールするか、ダウンロード設定で \'%s\' を無効にすることをお試しください プレイヤー使用時にクラッシュオプションを表示 エラー通知を作成 エラーを報告する通知 @@ -696,9 +659,9 @@ 灰色で表示されているプレイリストには、すでにこのアイテムが含まれています。 %d 回重複追加されました 固定サムネイルの設定を解除 - 重複を削除しますか\? + 重複を削除しますか? たとえば、物理ボタンが壊れたヘッドセットを使用している場合に便利です - この再生リスト内の重複したストリームをすべて削除しますか\? + この再生リスト内の重複したストリームをすべて削除しますか? ハードウェア メディア ボタン イベントを無視する 重複を削除 次のストリームを表示 @@ -729,9 +692,7 @@ 言語に関係なくオリジナルのオーディオトラックを選択する オーディオトラック デコーダの初期化に問題がある場合は、このオプションを有効化してプライマリ デコーダ初期化失敗時に低い優先度のデコーダにフォールバックします。プライマリ デコーダ使用時よりパフォーマンスが悪化する可能性があります - この解決策は直接コーデックをサーフェスに設定する代わりに、サーフェスが変更された際に映像コーデックを開放し再インスタンス化します。すでにいくつかのデバイスでこの解決策が使用されていますが、Android 6 以降でのみ機能します -\n -\nこのオプションを有効化することでプレイヤーを切り替えたり、フルスクリーンに切り替えたりする際の再生エラーを防ぎます + この解決策は直接コーデックをサーフェスに設定する代わりに、サーフェスが変更された際に映像コーデックを開放し再インスタンス化します。すでにいくつかのデバイスでこの解決策が使用されていますが、Android 6 以降でのみ機能します \n \nこのオプションを有効化することでプレイヤーを切り替えたり、フルスクリーンに切り替えたりする際の再生エラーを防ぎます 読み込み間隔を変更します。(現在 %s)この値を小さくすると再生開始までの時間が短くなります。変更を適用するには再起動が必要です オーディオトラックは既にこのせせらぎに存在している必要があります メインタブの場所 @@ -779,8 +740,7 @@ サムネイル URLリストで共有 タイトル付きで共有 - %1$s -\n%2$s + %1$s \n%2$s プレイリストを共有 - %1$s: %2$s @@ -793,13 +753,10 @@ バックアップと復元 はい いいえ - NewPipe は定期的に新しいバージョンを自動的にチェックし、更新可能になると通知します。 -\n有効にしますか? + NewPipe は定期的に新しいバージョンを自動的にチェックし、更新可能になると通知します。 \n有効にしますか? 設定をリセット 全ての設定をデフォルト状態にリセットします - 全ての設定をリセットすると、優先設定が全て破棄され、アプリが再起動します。 -\n -\n続行しますか? + 全ての設定をリセットすると、優先設定が全て破棄され、アプリが再起動します。 \n \n続行しますか? インポートされているエクスポートの設定は、NewPipe 0.27.0以降は非推奨であった脆弱な形式を使用します。 インポートされているエクスポートは信頼できる情報源からであり、将来的にはNewPipe 0.27.0かこれより新しいバージョンから得られるエクスポートのみを優先して使用します。 この脆弱な形式で設定をインポートするための対応はすぐに完全に削除され、新しいバージョンからエクスポートの設定をインポートすることは出来ません。 YouTubeの一時的なプレイリストとして共有 二次的 diff --git a/app/src/main/res/values-jv/strings.xml b/app/src/main/res/values-jv/strings.xml index 7f71a2f41..c352ff8e0 100644 --- a/app/src/main/res/values-jv/strings.xml +++ b/app/src/main/res/values-jv/strings.xml @@ -25,7 +25,7 @@ Suara ati Duduhke pilihan muter video nganggo Kodi Duduhke pilihan \"Puter nganggo Kodi\" - Aplikasi Kore rung ono, pasang\? + Aplikasi Kore rung ono, pasang? Puter nganggo Kodi Mung piranti tertentu sing iso muter video 2K/4K Duduhke resolusi luwih gedhe @@ -54,7 +54,7 @@ Busak suara ing resolusi cuk Gunake pemuter video liyane Bagi nganggo - Maksude: %1$s\? + Maksude: %1$s? Setelan Goleki Unduh file @@ -65,7 +65,7 @@ Orasido Pasang Ra ono pamuter (Sampeyan iso masang VLC kanggo muter iku). - Pamuter ora ditemokke. Pasang VLC\? + Pamuter ora ditemokke. Pasang VLC? Diterbitake ing %1$s Pencet lup kanggo nglekasi - \ No newline at end of file + diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 4f5fc13ef..ff91ce57e 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -1,7 +1,7 @@ ნაკადის პლეერი ვერ მოიძებნა (მის დასაკრავად შეგიძლიათ დააინსტალიროთ VLC). - ნაკადის მოთამაშე ვერ მოიძებნა. დააყენეთ VLC\? + ნაკადის მოთამაშე ვერ მოიძებნა. დააყენეთ VLC? გაუქმება გააზიარეთ როგორც გამოიყენეთ გარე ვიდეო დამკვრელი @@ -33,7 +33,7 @@ გააგრძელეთ დაკვრა გააგრძელეთ დაკვრა შეფერხებების შემდეგ (მაგ. სატელეფონო ზარები დაიწყეთ მთავარი მოთამაშე სრულ ეკრანზე - URL-ის ამოცნობა ვერ მოხერხდა. გავხსნა სხვა აპით\? + URL-ის ამოცნობა ვერ მოხერხდა. გავხსნა სხვა აპით? ნაგულისხმევი აუდიო ფორმატი აირჩიეთ თქვენი საყვარელი PeerTube ეგზემპლარები დაკვრის დატვირთვის ინტერვალის ზომა @@ -69,7 +69,7 @@ ნაკადის ფაილი ჩამოტვირთვა ძიება პარამეტრები - „%1$s“-ს გულისხმობდი\? + „%1$s“-ს გულისხმობდი? შედეგების ჩვენება: %s შლის აუდიოს ზოგიერთი რეზოლუციით გამოიყენეთ გარე აუდიო დამკვრელი @@ -87,7 +87,7 @@ გადმოწერილი ვიდეო ფაილები ინახება აქ აუდიოს ჩამოტვირთვის საქაღალდე უფრო მაღალი რეზოლუციის ჩვენება - დავაყენო აუცილებელი Kore აპი\? + დავაყენო აუცილებელი Kore აპი? აჩვენეთ \"დაუკარი კოდით\" ვარიანტი აჩვენეთ ვიდეოს დაკვრის ვარიანტი Kodi მედია ცენტრის საშუალებით შეტყობინებაში ნაჩვენები ვიდეოს ესკიზის ამოჭრა 16:9-დან 1:1-მდე ასპექტის თანაფარდობით @@ -184,14 +184,14 @@ reCAPTCHA ქუქი-ფაილები გასუფთავდა ექსპორტის ისტორია, გამოწერები, დასაკრავი სიები და პარამეტრები ნახვის ისტორიის გასუფთავება - წაშალოთ ნახვის მთელი ისტორია\? + წაშალოთ ნახვის მთელი ისტორია? ნახვის ისტორია წაშლილია წაშალეთ დაკვრის პოზიციები წაშლის დაკვრის ყველა პოზიციას - წაშალოთ დაკვრის ყველა პოზიცია\? + წაშალოთ დაკვრის ყველა პოზიცია? დაკვრის პოზიციები წაშლილია წაშლის საძიებო საკვანძო სიტყვების ისტორიას - წაშალოთ მთელი ძიების ისტორია\? + წაშალოთ მთელი ძიების ისტორია? გარე მეხსიერება მიუწვდომელია Ქსელის შეცდომა ყველა ესკიზის ჩატვირთვა ვერ მოხერხდა @@ -211,7 +211,7 @@ მოხდა შეცდომა: %1$s ჩამოსატვირთად ხელმისაწვდომი ნაკადები არ არის ნაგულისხმევი პარამეტრების აღდგენა - გსურთ ნაგულისხმევი პარამეტრების აღდგენა\? + გსურთ ნაგულისხმევი პარამეტრების აღდგენა? მიეცით სხვა აპებზე ჩვენების ნებართვა NewPipe-ს შეექმნა შეცდომა, შეეხეთ შეტყობინებისთვის მოხდა შეცდომა, იხილეთ შეტყობინება @@ -282,8 +282,7 @@ ჰეშის გაანგარიშება გთხოვთ მოიცადოთ… კოპირებულია ბუფერში - ეს უფლება აუცილებელია -\nმხტუნარა რეჟიმში გასახსნელად + ეს უფლება აუცილებელია \nმხტუნარა რეჟიმში გასახსნელად 1 ელემენტი წაიშალა. reCAPTCHA გამოწვევა როდესაც მოგვარდება, დააჭირეთ შესრულებულია @@ -303,8 +302,7 @@ საიტი ეწვიეთ NewPipe ვებსაიტს დამატებითი ინფორმაციისა და სიახლეებისთვის. NewPipe-ის კონფიდენციალურობის პოლიტიკა - NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. -\nNewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას. + NewPipe პროექტი თქვენს კონფიდენციალურობას ძალიან სერიოზულად ეკიდება. ამიტომ, აპლიკაცია არ აგროვებს მონაცემებს თქვენი თანხმობის გარეშე. \nNewPipe-ის კონფიდენციალურობის პოლიტიკა დეტალურად განმარტავს, თუ რა მონაცემები იგზავნება და ინახება ავარიის ანგარიშის გაგზავნისას. წაიკითხეთ კონფიდენციალურობის პოლიტიკა NewPipe-ის ლიცენზია წაიკითხეთ ლიცენზია @@ -313,7 +311,7 @@ ნახვა საიტზე ისტორია ისტორია - გსურთ წაშალოთ ეს ელემენტი ძიების ისტორიიდან\? + გსურთ წაშალოთ ეს ელემენტი ძიების ისტორიიდან? ბოლოს დაუკრა ხშირად დაკრული მთავარი გვერდის შინაარსი @@ -394,16 +392,9 @@ ფაილის იმპორტი წინა ექსპორტი გამოწერების ექსპორტი ვერ მოხერხდა - SoundCloud პროფილის იმპორტი URL-ის ან თქვენი ID-ის აკრეფით: -\n -\n 1. ჩართეთ \"დესკტოპის რეჟიმი\" ვებ-ბრაუზერში (საიტი მიუწვდომელია მობილური მოწყობილობებისთვის) -\n 2. გადადით ამ URL-ზე: %1$s -\n 3. შედით სისტემაში მოთხოვნისას -\n 4. დააკოპირეთ პროფილის URL, რომელზეც გადამისამართდით. + SoundCloud პროფილის იმპორტი URL-ის ან თქვენი ID-ის აკრეფით: \n \n 1. ჩართეთ \"დესკტოპის რეჟიმი\" ვებ-ბრაუზერში (საიტი მიუწვდომელია მობილური მოწყობილობებისთვის) \n 2. გადადით ამ URL-ზე: %1$s \n 3. შედით სისტემაში მოთხოვნისას \n 4. დააკოპირეთ პროფილის URL, რომელზეც გადამისამართდით. თქვენი ID, soundcloud.com/yourid - გაითვალისწინეთ, რომ ეს ოპერაცია შეიძლება იყოს ქსელის ძვირი. -\n -\n Გინდა გააგრძელო\? + გაითვალისწინეთ, რომ ეს ოპერაცია შეიძლება იყოს ქსელის ძვირი. \n \n Გინდა გააგრძელო? დაკვრის სიჩქარის კონტროლი ტემპი ამოღება (შეიძლება გამოიწვიოს დამახინჯება) @@ -460,7 +451,7 @@ Კავშირის დრო ამოიწურა ამ ჩამოტვირთვის აღდგენა შეუძლებელია გადმოწერილი ფაილების წაშლა - წაშალოთ ყველა გადმოწერილი ფაილი დისკიდან\? + წაშალოთ ყველა გადმოწერილი ფაილი დისკიდან? წაიშალა %1$s ჩამოტვირთვა წაიშალა %1$s ჩამოტვირთვები @@ -514,7 +505,7 @@ არჩეულია %d ცარიელი ჯგუფის სახელი - გსურთ ამ ჯგუფის წაშლა\? + გსურთ ამ ჯგუფის წაშლა? ახალი მხოლოდ დაუჯგუფებელი გამოწერების ჩვენება არხი @@ -522,15 +513,11 @@ დრო ბოლო განახლებიდან გამოწერამდე ითვლება მოძველებულად — %s ყოველთვის განახლება შეცდომა არხის ჩატვირთვისას - ავტორის ანგარიში შეჩერებულია. -\n NewPipe ვერ შეძლებს ამ არხის ჩატვირთვას მომავალში. -\n გსურთ ამ არხის გამოწერის გაუქმება\? + ავტორის ანგარიში შეჩერებულია. \n NewPipe ვერ შეძლებს ამ არხის ჩატვირთვას მომავალში. \n გსურთ ამ არხის გამოწერის გაუქმება? მიიღეთ გამოყოფილი არხიდან, როცა ხელმისაწვდომია ჩართეთ სწრაფი რეჟიმი სწრაფი რეჟიმის გამორთვა - ეს შინაარსი ჯერ არ არის მხარდაჭერილი NewPipe-ის მიერ. -\n -\n იმედია, ის იქნება მხარდაჭერილი მომავალ ვერსიაში. + ეს შინაარსი ჯერ არ არის მხარდაჭერილი NewPipe-ის მიერ. \n \n იმედია, ის იქნება მხარდაჭერილი მომავალ ვერსიაში. არხის ავატარის ესკიზი შექმნილია %s-ის მიერ %s-ის მიხედვით @@ -539,8 +526,7 @@ Ბოლო თავები თქვენს მოწყობილობაზე არცერთ აპლიკაციას არ შეუძლია ამის გახსნა - ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. -\n გთხოვთ, დააინსტალიროთ Storage Access Framework თავსებადი ფაილ მენეჯერი + ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. \n გთხოვთ, დააინსტალიროთ Storage Access Framework თავსებადი ფაილ მენეჯერი ეს ხელმიუწვდომელია თქვენი ქვეყნიდან. ეს მასალა პირადულია, ამიტომაც NewPipe-ს მისი არც მთლიანად და არც თანდათანობით ჩამოწერა არ შეუძლია. ანგარიში შეწყვეტილია @@ -584,12 +570,9 @@ ეგეთი უკვე არსებობს ინსტანციის დადასტურება ვერ მოხერხდა ჩართეთ YouTube-ის „შეზღუდული რეჟიმი“ - ეს ვიდეო ასაკობრივი შეზღუდულია. -\n -\nთუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში. + ეს ვიდეო ასაკობრივი შეზღუდულია. \n \nთუ გსურთ მისი ნახვა, ჩართეთ „%1$s“ პარამეტრებში. ლაივი - ეს ვიდეო ასაკობრივად შეზღუდულია. -\n YouTube-ის ახალი წესების გამო ასაკობრივად შეზღუდული ვიდეოებით, NewPipe-ს არ შეუძლია წვდომა მის რომელიმე ვიდეო ნაკადზე და, შესაბამისად, ვერ ახერხებს მის დაკვრას. + ეს ვიდეო ასაკობრივად შეზღუდულია. \n YouTube-ის ახალი წესების გამო ასაკობრივად შეზღუდული ვიდეოებით, NewPipe-ს არ შეუძლია წვდომა მის რომელიმე ვიდეო ნაკადზე და, შესაბამისად, ვერ ახერხებს მის დაკვრას. ძიების ისტორია წაიშალა წაშალეთ ქუქი-ფაილები, რომლებსაც NewPipe ინახავს, როდესაც თქვენ გადაჭრით reCAPTCHA წაშლის ნათამაშები დაკვრილ ისტორიას და დაკვრის პოზიციებს @@ -599,7 +582,7 @@ ძიების ისტორიის გასუფთავება შეცდომა გთხოვთ, შეამოწმოთ, არის თუ არა პრობლემა თქვენი ავარიის განხილვის შესახებ. დუბლიკატი ბილეთების შექმნისას ჩვენგან იღებთ დროს, რომელიც ჩვენ შეგვიძლია დავხარჯოთ ფაქტობრივი ხარვეზის გამოსწორებაში. - გარე SD ბარათზე ჩამოტვირთვა შეუძლებელია. გსურთ ჩამოტვირთვის საქაღალდის მდებარეობის გადაყენება\? + გარე SD ბარათზე ჩამოტვირთვა შეუძლებელია. გსურთ ჩამოტვირთვის საქაღალდის მდებარეობის გადაყენება? გარე დამკვრელს არ აქვთ ამ ტიპის ბმულების მხარდაჭერა ფაილი არ არსებობს ან მასზე წაკითხვის ან ჩაწერის ნებართვა აკლია შენახული ჩანართების წაკითხვა ვერ მოხერხდა, ამიტომ გამოიყენეთ ნაგულისხმევი ჩანართები @@ -620,19 +603,10 @@ მესამე მხარის ლიცენზიები © %1$s მიერ %2$s %3$s-ის ქვეშ NewPipe შემუშავებულია მოხალისეების მიერ, რომლებიც ატარებენ თავისუფალ დროს და მოგაქვთ საუკეთესო მომხმარებლის გამოცდილება. დაეხმარეთ დეველოპერებს, გააუმჯობესონ NewPipe, სანამ ფინჯანი ყავით ტკბებიან. - YouTube გამოწერების იმპორტი Google takeout-დან: -\n -\n 1. გადადით ამ URL-ზე: %1$s -\n 2. შედით სისტემაში მოთხოვნისას -\n 3. დააწკაპუნეთ ღილაკზე \"ყველა მონაცემი შედის\", შემდეგ \"გააუქმეთ ყველა\", შემდეგ აირჩიეთ მხოლოდ \"გამოწერა\" და დააწკაპუნეთ \"OK\" -\n 4. დააწკაპუნეთ „შემდეგი ნაბიჯი“ და შემდეგ „ექსპორტის შექმნა“ -\n 5. დააწკაპუნეთ ღილაკზე „ჩამოტვირთვა“ მისი გამოჩენის შემდეგ -\n 6. დააწკაპუნეთ IMPORT FILE ქვემოთ და აირჩიეთ გადმოწერილი .zip ფაილი -\n 7. [თუ .zip-ის შემოტანავერ მოხერხდა] ამოიღეთ + YouTube გამოწერების იმპორტი Google takeout-დან: \n \n 1. გადადით ამ URL-ზე: %1$s \n 2. შედით სისტემაში მოთხოვნისას \n 3. დააწკაპუნეთ ღილაკზე \"ყველა მონაცემი შედის\", შემდეგ \"გააუქმეთ ყველა\", შემდეგ აირჩიეთ მხოლოდ \"გამოწერა\" და დააწკაპუნეთ \"OK\" \n 4. დააწკაპუნეთ „შემდეგი ნაბიჯი“ და შემდეგ „ექსპორტის შექმნა“ \n 5. დააწკაპუნეთ ღილაკზე „ჩამოტვირთვა“ მისი გამოჩენის შემდეგ \n 6. დააწკაპუნეთ IMPORT FILE ქვემოთ და აირჩიეთ გადმოწერილი .zip ფაილი \n 7. [თუ .zip-ის შემოტანავერ მოხერხდა] ამოიღეთ მოედანი ახალი ნაკადების შეტყობინებები - მონაცემთა დაცვის ევროპული ზოგადი რეგულაციის (GDPR) შესაბამისობის მიზნით, ჩვენ ვაქცევთ თქვენს ყურადღებას NewPipe-ის კონფიდენციალურობის პოლიტიკაზე. გთხოვთ ყურადღებით წაიკითხოთ. -\nთქვენ უნდა დაეთანხმოთ მას, რომ გამოგვიგზავნოთ ხარვეზის ანგარიში. + მონაცემთა დაცვის ევროპული ზოგადი რეგულაციის (GDPR) შესაბამისობის მიზნით, ჩვენ ვაქცევთ თქვენს ყურადღებას NewPipe-ის კონფიდენციალურობის პოლიტიკაზე. გთხოვთ ყურადღებით წაიკითხოთ. \nთქვენ უნდა დაეთანხმოთ მას, რომ გამოგვიგზავნოთ ხარვეზის ანგარიში. საჭიროა ქსელის კავშირი ბადე Seekbar-ის ესკიზის გადახედვა @@ -645,15 +619,14 @@ ფაილი ამ სახელით უკვე არსებობს ჩამოტვირთული ფაილი ამ სახელით უკვე არსებობს უსაფრთხო კავშირის დამყარება ვერ მოხერხდა - გსურთ თქვენი ჩამოტვირთვის ისტორიის გასუფთავება ან ყველა გადმოწერილი ფაილის წაშლა\? + გსურთ თქვენი ჩამოტვირთვის ისტორიის გასუფთავება ან ყველა გადმოწერილი ფაილის წაშლა? ფაილზე მუშაობისას NewPipe დაიხურა პროგრესი დაიკარგა, რადგან ფაილი წაიშალა ჩამოტვირთვის ისტორიის გასუფთავება სასარგებლოა მობილური ინტერნეტზე გადასვლისას, თუმცა ზოგიერთი ჩამოტვირთვის შეჩერება შეუძლებელია ჩამოტვირთვების პაუზა იკითხეთ, სად უნდა ჩამოტვირთოთ - თქვენ მოგეთხოვებათ სად შეინახოთ თითოეული ჩამოტვირთვა. -\n ჩართეთ სისტემის საქაღალდის ამომრჩევი (SAF), თუ გსურთ ჩამოტვირთოთ გარე SD ბარათზე + თქვენ მოგეთხოვებათ სად შეინახოთ თითოეული ჩამოტვირთვა. \n ჩართეთ სისტემის საქაღალდის ამომრჩევი (SAF), თუ გსურთ ჩამოტვირთოთ გარე SD ბარათზე ვიდეოები, რომლებიც უყურეთ დასაკრავ სიაში დამატებამდე და მის შემდეგ, წაიშლება. \n დარწმუნებული ხართ? NewPipe არის copyleft უფასო პროგრამული უზრუნველყოფა: თქვენ შეგიძლიათ გამოიყენოთ, შეისწავლოთ, გააზიაროთ და გააუმჯობესოთ იგი სურვილისამებრ. კონკრეტულად თქვენ შეგიძლიათ გადაანაწილოთ და/ან შეცვალოთ იგი GNU-ს ზოგადი საჯარო ლიცენზიის პირობებით, როგორც ეს გამოქვეყნებულია თავისუფალი პროგრამული უზრუნველყოფის ფონდის მიერ, ლიცენზიის მე-3 ვერსიით, ან (თქვენი სურვილისამებრ) ნებისმიერი შემდგომი ვერსიით. ავტო @@ -661,7 +634,7 @@ აირჩიეთ არხი კიოსკის გვერდი ნაგულისხმევი კიოსკი - გსურთ პარამეტრების იმპორტიც\? + გსურთ პარამეტრების იმპორტიც? რიგში დადგა შემდეგი დაიწყეთ დაკვრა ამომხტარ ფანჯარაში ადგილობრივი @@ -669,7 +642,7 @@ ინფორმაციის მიღება… ახალი დასაკრავი სია დამუშავება… შეიძლება რამდენიმე წუთი დასჭირდეს - წაშალოთ ეს დასაკრავი სია\? + წაშალოთ ეს დასაკრავი სია? მეხსიერების გაჟონვის ჩვენება აღდგენა რიგი @@ -680,20 +653,9 @@ „%s“-ის არხის ჩატვირთვა ვერ მოხერხდა. ხელმისაწვდომია ზოგიერთ სერვისში, როგორც წესი, ბევრად უფრო სწრაფია, მაგრამ შეიძლება დააბრუნოს შეზღუდული რაოდენობის ელემენტი და ხშირად არასრული ინფორმაცია (მაგ. ხანგრძლივობის გარეშე, ელემენტის ტიპი, არ არის ლაივის სტატუსი) გამოიყენეთ ესკიზი როგორც ჩაკეტილი ეკრანის ფონისთვის, ასევე შეტყობინებებისთვის - როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია\? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). -\n -\n NewPipe გთავაზობთ არხის ჩატვირთვის ორ სტრატეგიას: -\n • მთელი სააბონენტო არხის მიღება, რომელიც ნელია, მაგრამ დასრულებულია. -\n • გამოყოფილი სერვისის საბოლოო წერტილის გამოყენება, რომელიც არის სწრაფი, მაგრამ ჩვეულებრივ არასრული. -\n -\n ამ ორს შორის განსხვავება ისაა, რომ სწრაფს, როგორც წესი, აკლია გარკვეული ინფორმაცია, მაგალითად, ნივთის ხანგრძლივობა ან ტიპი (არ განასხვავებს პირდაპირ ვიდეოებს ჩვეულებრივ ვიდეოებს შორის) და შეიძლება დაბრუნდეს ნაკლები ელემენტი. -\n -\n YouTube არის სერვისის მაგალითი, რომელიც გთავაზობთ ამ სწრაფ მეთოდს თავისი RSS არხით. -\n -\n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია. + როგორ ფიქრობთ, არხის ჩატვირთვა ძალიან ნელია? თუ ასეა, სცადეთ ჩართოთ სწრაფი ჩატვირთვა (შეგიძლიათ შეცვალოთ ის პარამეტრებში ან ქვემოთ მოცემულ ღილაკზე დაჭერით). \n \n NewPipe გთავაზობთ არხის ჩატვირთვის ორ სტრატეგიას: \n • მთელი სააბონენტო არხის მიღება, რომელიც ნელია, მაგრამ დასრულებულია. \n • გამოყოფილი სერვისის საბოლოო წერტილის გამოყენება, რომელიც არის სწრაფი, მაგრამ ჩვეულებრივ არასრული. \n \n ამ ორს შორის განსხვავება ისაა, რომ სწრაფს, როგორც წესი, აკლია გარკვეული ინფორმაცია, მაგალითად, ნივთის ხანგრძლივობა ან ტიპი (არ განასხვავებს პირდაპირ ვიდეოებს ჩვეულებრივ ვიდეოებს შორის) და შეიძლება დაბრუნდეს ნაკლები ელემენტი. \n \n YouTube არის სერვისის მაგალითი, რომელიც გთავაზობთ ამ სწრაფ მეთოდს თავისი RSS არხით. \n \n ასე რომ, არჩევანი დამოკიდებულია იმაზე, თუ რა გირჩევნიათ: სიჩქარე ან ზუსტი ინფორმაცია. ეს არის SoundCloud Go+ სიმღერა, ყოველ შემთხვევაში თქვენს ქვეყანაში, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. - ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. -\n გთხოვთ, დააინსტალიროთ ფაილის მენეჯერი ან სცადოთ გამორთოთ \'%s\' ჩამოტვირთვის პარამეტრებში + ამ მოქმედებისთვის შესაბამისი ფაილების მენეჯერი ვერ მოიძებნა. \n გთხოვთ, დააინსტალიროთ ფაილის მენეჯერი ან სცადოთ გამორთოთ \'%s\' ჩამოტვირთვის პარამეტრებში ეს ვიდეო ხელმისაწვდომია მხოლოდ YouTube Music Premium-ის წევრებისთვის, ამიტომ მისი სტრიმინგი ან ჩამოტვირთვა შეუძლებელია NewPipe-ის მიერ. ავტომატური (მოწყობილობის თემა) თქვენ შეგიძლიათ აირჩიოთ თქვენი საყვარელი ღამის თემა ქვემოთ @@ -705,7 +667,7 @@ სიკაშკაშე ბუფერში კოპირების შეცდომა ბარათი - გნებავთ წავშალო ყველა დუბლირებული ნაკადი ამ დასაკრავი სიიდან\? + გნებავთ წავშალო ყველა დუბლირებული ნაკადი ამ დასაკრავი სიიდან? ასლი დამატებულია %d-ჯერ %s-ის გადმოსაწერად დაატყაპუნეთ აპარატურული მედია ღილაკების მოვლენების გამოტოვება @@ -726,7 +688,7 @@ თქვენი NewPipe-ის ვერსია უახლესია დუბლიკატების წაშლა მუდმივი მინიატურის მოხსნა - წავშალო დუბლიკატები\? + წავშალო დუბლიკატები? ნაწილობრივ ნანახი მზადდება ზედაპირული მახასიათებლები… თავდაპირველი ხმის ჩანაწერი აირჩიე ენის მიუხედავად diff --git a/app/src/main/res/values-kab/strings.xml b/app/src/main/res/values-kab/strings.xml index b14b66b39..822748b1f 100644 --- a/app/src/main/res/values-kab/strings.xml +++ b/app/src/main/res/values-kab/strings.xml @@ -4,7 +4,7 @@ Ɣef & ISTEQSIYEN Amaynut Akk - Sbedd asnas n Kore yexxuṣen\? + Sbedd asnas n Kore yexxuṣen? Sbedd Sader Isadaren @@ -32,7 +32,7 @@ Azdam n NewPipe Err-d imezwar Yerna-t %s - Kkes tabdart-a n tɣuri\? + Kkes tabdart-a n tɣuri? Sfeḍ Ittwarna taggara-agi Amasal n imesli amezwer diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index c248c35f4..7487f6d94 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -3,5 +3,5 @@ Бастау үшін үлкейткіш әйнекті басыңыз. %1$s жарияланды Ағындық ойнатқыш табылмады (оны ойнату үшін VLC орнатуға болады). - Ағындық ойнатқыш табылмады. VLC орнату керек пе\? - \ No newline at end of file + Ағындық ойнатқыш табылмады. VLC орнату керек пе? + diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index f4b83eda2..48680a95c 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -75,7 +75,7 @@ Vê xeletiyê bi e-nameyê ragihînin Bibore, divê wiya çênebûya. Destûrê bidin ku hûn li ser sepanên din nîşan bidin - Ma hûn dixwazin defaultan vegerînin\? + Ma hûn dixwazin defaultan vegerînin? Veguhêrin Pêngavên Nekarin tabên tomarkirî bixwînin, ji ber vê yekê yên default bikar bînin Ji bo dakêşanê çem tune @@ -97,19 +97,19 @@ Malperê nekare parsek bike Nekarî hemî wêneyan barkir Çewtiya torê - Dakêşandin ji karta SD ya derveyî re ne gengaz e. Cihê peldanka dakêşanê ji nû ve were çêkirin\? + Dakêşandin ji karta SD ya derveyî re ne gengaz e. Cihê peldanka dakêşanê ji nû ve were çêkirin? Depoya derveyî tune Şaşî Dîroka lêgerînê hate jêbirin. - Dîroka tevahî lêgerînê jê bibe\? + Dîroka tevahî lêgerînê jê bibe? Dîroka peyvên sereke yên lêgerînê jê dike Dîroka lêgerînê paqij bike Helwestên lîstinê hatine jêbirin. - Hemî pozîsyonên lîstinê werin jêbirin\? + Hemî pozîsyonên lîstinê werin jêbirin? Hemî çeperên lîstinê ji holê radike Helwestên lîstokê jêbirin Dîroka temaşekirinê hate jêbirin. - Tevahiya dîroka temaşekirinê tê jêbirin\? + Tevahiya dîroka temaşekirinê tê jêbirin? Dîroka herikên lîstî û helwestên lîstinê jêbirin Dîroka temaşekirinê paqij bikin Dema ku hûn reCAPTCHA-yê çareser bikin cookie-yên ku NewPipe tomar dike paqij bikin @@ -137,7 +137,7 @@ Betal bike Çareseriya çêtirîn Ouldîrove nehat barkirin - Ma hûn dixwazin mîhengan jî îthal bikin\? + Ma hûn dixwazin mîhengan jî îthal bikin? Ev ê sazkirina xweya heyî ji holê rabike. Hişyarî: Nikare hemû pelan bîne hundur. Pelê ZIP-yê derbasdar tune @@ -156,7 +156,7 @@ Naveroka rûpelê sereke Pir lîstin Lîstika dawîn - Ma hûn dixwazin vî tiştî ji dîroka lêgerînê paqij bikin\? + Ma hûn dixwazin vî tiştî ji dîroka lêgerînê paqij bikin? Dîrok Dîrok Destûrê bixwînin @@ -177,9 +177,7 @@ Dakêşandin Dakêşandin Jîyan - Ev vîdyo temen tê sînorkirin. -\n -\nHeke hûn dixwazin bibînin \"%1$s\" di mîhengan de veke. + Ev vîdyo temen tê sînorkirin. \n \nHeke hûn dixwazin bibînin \"%1$s\" di mîhengan de veke. YouTube \"Modeya Bicîhkirî\" peyda dike ku naveroka potansiyel gihîştî vedişêre \"Modeya Bicîh\" a YouTube-ê veke Naverok ji bo zarokan dibe ku ne guncan be nîşan bikin ji ber ku sînorek temenê wê heye (mîna 18+) @@ -204,7 +202,7 @@ Mînakên PeerTube Zimanê naveroka bixweber Welatê naverokê standard - URL-yê nasnakin. Bi sepek din vedibe\? + URL-yê nasnakin. Bi sepek din vedibe? URL-ya ku nayê piştgirî kirin Dema ku hûn paşnav an bişkoja popupê ya di vîdyoyê de \"Hûrgulî:\" bişkînin tip nîşan bidin Serişteya \"Ji bo pêvekirinê bigire\" nîşan bide @@ -269,10 +267,9 @@ Mîqneya pîvanê bi rêjeya aliyî ya 1:1 ve Vebijarkek ji bo lîstina vîdyoyek bi navgîniya navenda medya Kodi nîşan bidin Vebijarka \"Bi Kodi re lîstin\" nîşan bidin - Sepana Kore ya wenda saz dike\? + Sepana Kore ya wenda saz dike? Bi Kodî re bilîzin - Vê destûr hewce ye ku -\ndi moda popupê de vekin + Vê destûr hewce ye ku \ndi moda popupê de vekin Tenê hin cîhaz dikarin vîdyoyên 2K/4K bilîzin Pêşniyarên mezintir nîşan bidin Çareseriya popupê ya jixweber @@ -301,7 +298,7 @@ Vîdyoyek derveyî bikar bînin Parve dikin li gel Encaman ji bo: %s nîşan dide - Mebesta we \"%1$s\" bû\? + Mebesta we \"%1$s\" bû? Mîhengên Gerr Pelê çemê dakêşin @@ -313,7 +310,7 @@ Bişûndekirin Lêkirin Vebijarkek streaming nehat dîtin (hûn dikarin VLC-yê saz bikin da ku lê bilîze). - Lîstikvanek herikê nehat dîtin. VLC saz bikin\? + Lîstikvanek herikê nehat dîtin. VLC saz bikin? Li ser hate weşandin %1$s Ji bo destpêkirinê \"Lêgerîn\" bitikînin Di hin karûbaran de heye, ew bi gelemperî pir zûtir e lê dibe ku hejmarek bi sînor a tiştan vegerîne û bi gelemperî agahdariya bêkêmasî vebigere (mînakî bê domdanî, celebek tişt, bê statûya zindî). @@ -324,7 +321,7 @@ Xwedî kirin Tenê aboneyên ne kombûyî nîşan bidin Nû - Ma hûn dixwazin vê komê jê bibin\? + Ma hûn dixwazin vê komê jê bibin? Navê koma vala %d hilbijart @@ -362,8 +359,7 @@ Pergala wekî ku heyî Zimanê appê Mînakek hilbijêrin - \'Çarçoveya Gihîştina Storage\' daxistinan li qertek SD ya derveyî dihêle. -\nHin cîhaz lihevnehatî ne + \'Çarçoveya Gihîştina Storage\' daxistinan li qertek SD ya derveyî dihêle. \nHin cîhaz lihevnehatî ne SAF bikar bînin Dê ji we were pirsîn ka hûn ê her dakêşanê li ku derê hilanînê Li ku derê dakêşin bipirsin @@ -378,7 +374,7 @@ Zêdetir dubarekirin çêbû Rawestan Pelên dakêşandî hilweşînin - Ma hûn dixwazin dîroka dakêşanê xwe paqij bikin an hemî pelên dakêşandî jê bibin\? + Ma hûn dixwazin dîroka dakêşanê xwe paqij bikin an hemî pelên dakêşandî jê bibin? Dîroka dakêşanê paqij bikin Vê dakêşanê nikare paşde bibe Dema girêdanê @@ -430,8 +426,7 @@ Sînor tune Paşvegerrî Baweranîn - Ji bo ku em rêzê li Rêziknameya Parastina Daneya Giştî ya Ewropî (GDPR) bigirin, em herby bala we dikişînin ser siyaseta nepeniya NewPipe. Ji kerema xwe bi baldarî bixwînin. -\nDivê hûn wê qebûl bikin da ku em rapora çewtiyê ji me re bişînin. + Ji bo ku em rêzê li Rêziknameya Parastina Daneya Giştî ya Ewropî (GDPR) bigirin, em herby bala we dikişînin ser siyaseta nepeniya NewPipe. Ji kerema xwe bi baldarî bixwînin. \nDivê hûn wê qebûl bikin da ku em rapora çewtiyê ji me re bişînin. Reset bikin Gav Di dema bêdengiyê de zû-zû @@ -439,16 +434,9 @@ Avêtin Lez Kontrolên Leza Piştê tomarkirinê - Di hişê xwe de bimînin ev operasyon dikare bihayê torê be. -\n -\nMa hûn dixwazin berdewam bikin\? + Di hişê xwe de bimînin ev operasyon dikare bihayê torê be. \n \nMa hûn dixwazin berdewam bikin? Dixwaze, soundcloud.com/yourid - Bi navnîşana URL an Nasnameya xwe profîlek SoundCloud bikirin: -\n -\n1. Di rû-gerokê de \"moda sermaseyê\" çalak bike (malper ji bo cîhazên mobîl peyda nabe) -\n2. Herin vê URL-ê: %1$s -\n3. Dema ku ji we were pirsîn bikevin hundur -\n4. URL-ya profîlê ku hûn lê hatine rêve kirin kopî bikin. + Bi navnîşana URL an Nasnameya xwe profîlek SoundCloud bikirin: \n \n1. Di rû-gerokê de \"moda sermaseyê\" çalak bike (malper ji bo cîhazên mobîl peyda nabe) \n2. Herin vê URL-ê: %1$s \n3. Dema ku ji we were pirsîn bikevin hundur \n4. URL-ya profîlê ku hûn lê hatine rêve kirin kopî bikin. Nikare abonetiyê bişîne Nekarîn abone nekarin Hinardeya berê @@ -475,7 +463,7 @@ Mîcnama lîsteya lîstikê guherî. Lîsteya lîstinê Lîsteya lîstinê hate afirandin - Vê lîsteya lîstinê were jêbirin\? + Vê lîsteya lîstinê were jêbirin? Lîsteya lîsteyê nîşan hilînin Lîsteya lîsteyê nîşan bikin Wekî Thumbnailê Lîsteya Lîsteyê saz bikin @@ -513,8 +501,7 @@ Tiştên Trend Lîsansa NewPipe Polîtîkaya nepeniyê bixwînin - Projeya NewPipe nepenîtiya we pir cidî digire. Ji ber vê yekê, sepanê bêyî razîbûna we tu daneyan kom nake. -\nSiyaseta taybetîtiyê ya NewPipe dema ku hûn rapora qeza dişînin çi daneyên têne şandin û hilanîn bi berfirehî vedibêje. + Projeya NewPipe nepenîtiya we pir cidî digire. Ji ber vê yekê, sepanê bêyî razîbûna we tu daneyan kom nake. \nSiyaseta taybetîtiyê ya NewPipe dema ku hûn rapora qeza dişînin çi daneyên têne şandin û hilanîn bi berfirehî vedibêje. Siyaseta taybetîtiyê ya NewPipe Ji bo bêtir agahdarî û nûçeyan biçin Malpera NewPipe. Malper @@ -535,14 +522,7 @@ Kirî reCAPTCHA dijwarî xwestin Dema ku çareser bibe \"Kirî\" çap bikin - Tevlêbûnên YouTube-ê ji barkirina Google-ê bikişînin: -\n -\n1. Herin vê URL-ê: %1$s -\n2. Dema ku ji we tê xwestin bikevin hundur -\n3. Li ser \"Hemî daneyên tê de\" bikirtînin, dûre \"Hemî hilbijêrin\" hilbijêrinîn, paşê tenê \"abonetiyê\" hilbijêrin û \"OK\" bikirtînin -\n4. Li ser \"Pênga Next\" û paşê jî li ser \"Afirandina hinardeyê\" bitikînin -\n5. Bişkojka \"Dakêşanê\" bitikîne piştî ku xuya dibe û -\n6. Ji zip zipê dakêşandî pelê .json derxînin (bi gelemperî di bin \"YouTube û YouTube de Music/subscriptions/subscriptions.json\") û wê li vir îthal bikin. + Tevlêbûnên YouTube-ê ji barkirina Google-ê bikişînin: \n \n1. Herin vê URL-ê: %1$s \n2. Dema ku ji we tê xwestin bikevin hundur \n3. Li ser \"Hemî daneyên tê de\" bikirtînin, dûre \"Hemî hilbijêrin\" hilbijêrinîn, paşê tenê \"abonetiyê\" hilbijêrin û \"OK\" bikirtînin \n4. Li ser \"Pênga Next\" û paşê jî li ser \"Afirandina hinardeyê\" bitikînin \n5. Bişkojka \"Dakêşanê\" bitikîne piştî ku xuya dibe û \n6. Ji zip zipê dakêşandî pelê .json derxînin (bi gelemperî di bin \"YouTube û YouTube de Music/subscriptions/subscriptions.json\") û wê li vir îthal bikin. Hem ji bo paşnavê dîmendera kilît û hem jî ji bo agahdarkirinê wêneyên nîgarê bikar bînin Tu cîhaz li ser amûrê we nikare vê vebike Beş @@ -552,20 +532,8 @@ Bi %s Ji hêla %s ve hatî afirandin Avrêl avatar a Qenal - Vê naverok hîn ji hêla NewPipe ve nayê piştgirî kirin. -\n -\nEw ê hêvî dikim ku di guhertoyek pêşerojê de piştgirî bibe. - Li gorî we barkirina xwarinê pir hêdî ye\? Ger wusa ye, barkirina zû biceribîne (hûn dikarin wê di mîhengan de an bi tikandina bişkoja jêrîn biguherînin). -\n -\nNewPipe du stratejiyên barkirina xwarinê pêşkêşî dike: -\n• Dîtina tevahî kanala abonetiyê, ku hêdî ye lê temam e. -\n• Bikaranîna xala dawîn a karûbarê taybetî, ku bilez e lê bi gelemperî ne temam e. -\n -\nCûdaiya di navbera her duyan de ev e ku ya bilez bi gelemperî hin agahdarî, mîna dirêjahî an celebê (nekare vîdyoyên zindî û yên normal cuda bike) tune û dibe ku ew kêmtir tiştan jî vegerîne. -\n -\nYouTube nimûneyek xizmetê ye ku bi xwarina RSS-ê vê rêbaza bilez pêşkêşî dike. -\n -\nJi ber vê yekê bijarde bi tiştê ku hûn tercîh dikin ve girêdayî ye: leza an agahdariya rastîn. + Vê naverok hîn ji hêla NewPipe ve nayê piştgirî kirin. \n \nEw ê hêvî dikim ku di guhertoyek pêşerojê de piştgirî bibe. + Li gorî we barkirina xwarinê pir hêdî ye? Ger wusa ye, barkirina zû biceribîne (hûn dikarin wê di mîhengan de an bi tikandina bişkoja jêrîn biguherînin). \n \nNewPipe du stratejiyên barkirina xwarinê pêşkêşî dike: \n• Dîtina tevahî kanala abonetiyê, ku hêdî ye lê temam e. \n• Bikaranîna xala dawîn a karûbarê taybetî, ku bilez e lê bi gelemperî ne temam e. \n \nCûdaiya di navbera her duyan de ev e ku ya bilez bi gelemperî hin agahdarî, mîna dirêjahî an celebê (nekare vîdyoyên zindî û yên normal cuda bike) tune û dibe ku ew kêmtir tiştan jî vegerîne. \n \nYouTube nimûneyek xizmetê ye ku bi xwarina RSS-ê vê rêbaza bilez pêşkêşî dike. \n \nJi ber vê yekê bijarde bi tiştê ku hûn tercîh dikin ve girêdayî ye: leza an agahdariya rastîn. Modeya lezgîn neçalak bikin Modeya lezgîn çalak bikin Destûrên diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index 2ba73e178..1c7286e9c 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -42,4 +42,4 @@ ಅನ್‌ಸಬ್‌ಸ್ಕ್ರೈಬ್ ಮಾಡಿ ಹೌದು ಇಲ್ಲ - \ 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 073dafb81..227843680 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -1,7 +1,7 @@ %1$s에 업로드됨 - 스트림 플레이어가 발견되지 않았습니다. VLC를 설치할까요\? + 스트림 플레이어가 발견되지 않았습니다. VLC를 설치할까요? 설치 취소 브라우저에서 열기 @@ -9,14 +9,14 @@ 다운로드 검색 설정 - \"%1$s\"를 찾으셨나요\? + \"%1$s\"를 찾으셨나요? 다음으로 공유 비디오 다운로드 폴더 다운로드된 비디오 파일이 이 곳에 저장됩니다 비디오 파일이 다운로드 될 폴더를 선택하세요 기본 해상도 Kodi로 재생 - 누락된 Kore 앱을 설치하겠습니까\? + 누락된 Kore 앱을 설치하겠습니까? \"Kodi로 재생\" 옵션 표시 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 오디오 @@ -134,8 +134,7 @@ 잠시만 기다리세요… 클립보드에 복사됨 다운로드 할 폴더를 설정에서 지정하세요 - 이 권한은 팝업 모드에서 -\n열기 위해 필요합니다 + 이 권한은 팝업 모드에서 \n열기 위해 필요합니다 reCAPTCHA 확인 요청됨 다운로드 파일명에 허용되는 문자 @@ -255,25 +254,10 @@ 이전 내보내기 구독 목록 가져오기 실패 구독 목록 내보내기 실패 - Google 테이크아웃에서 YouTube 구독목록 가져오기: -\n -\n1. 이 URL로 이동합니다: %1$s -\n2. 요청에 따라 로그인 합니다 -\n3. \"모든 데이터 포함됨\"을 클릭한 뒤, \"모두 선택 해제\"를 클릭한 후 \"구독정보\"만 선택하고 \"확인\"을 클릭합니다 -\n4. \"다음 단계\"를 클릭한 다음 \"내보내기 생성\"을 클릭합니다 -\n5. \"다운로드\" 버튼이 나타나면 클릭합니다 -\n6. 아래의 \"파일 가져오기\"를 클릭하고 다운로드한 .zip 파일을 선택합니다 -\n7. [.zip 파일 가져오기를 실패한 경우] .csv 파일(일반적으로 \"YouTube 및 YouTube Music/구독정보/구독정보.csv\")을 압축해제한 다음, 아래의 \"파일 가져오기\"를 클릭한 후 압축해제한 csv 파일을 선택합니다 - URL 또는 ID를 입력하여 SoundCloud 프로필을 가져옵니다: -\n -\n1. 웹 브라우저에서 \"데스크톱 모드\"를 활성화합니다(모바일 장치에서는 사이트를 사용할 수 없습니다) -\n2. 다음 URL로 이동: %1$s -\n3. 요청 시 로그인 -\n4. 리디렉션된 프로필 URL을 복사합니다. + Google 테이크아웃에서 YouTube 구독목록 가져오기: \n \n1. 이 URL로 이동합니다: %1$s \n2. 요청에 따라 로그인 합니다 \n3. \"모든 데이터 포함됨\"을 클릭한 뒤, \"모두 선택 해제\"를 클릭한 후 \"구독정보\"만 선택하고 \"확인\"을 클릭합니다 \n4. \"다음 단계\"를 클릭한 다음 \"내보내기 생성\"을 클릭합니다 \n5. \"다운로드\" 버튼이 나타나면 클릭합니다 \n6. 아래의 \"파일 가져오기\"를 클릭하고 다운로드한 .zip 파일을 선택합니다 \n7. [.zip 파일 가져오기를 실패한 경우] .csv 파일(일반적으로 \"YouTube 및 YouTube Music/구독정보/구독정보.csv\")을 압축해제한 다음, 아래의 \"파일 가져오기\"를 클릭한 후 압축해제한 csv 파일을 선택합니다 + URL 또는 ID를 입력하여 SoundCloud 프로필을 가져옵니다: \n \n1. 웹 브라우저에서 \"데스크톱 모드\"를 활성화합니다(모바일 장치에서는 사이트를 사용할 수 없습니다) \n2. 다음 URL로 이동: %1$s \n3. 요청 시 로그인 \n4. 리디렉션된 프로필 URL을 복사합니다. 프로필ID, soundcloud.com/프로필ID - 경고: 데이터가 많이 소모될 수 있습니다. -\n -\n계속하시겠습니까\? + 경고: 데이터가 많이 소모될 수 있습니다. \n \n계속하시겠습니까? 이미지 캐시 지워짐 캐시된 메타데이터 지우기 캐시된 모든 웹페이지 데이터 지우기 @@ -291,21 +275,19 @@ 재생목록 시청 기록 삭제하기 동영상 시청 기록과 저장된 재생 위치를 삭제합니다 - 모든 시청 기록을 삭제하시겠습니까\? + 모든 시청 기록을 삭제하시겠습니까? 동영상 시청 기록이 삭제되었습니다 검색 기록 삭제 검색 기록을 모두 삭제합니다 - 모든 검색 기록을 삭제하시겠습니까\? + 모든 검색 기록을 삭제하시겠습니까? 검색 기록이 삭제되었습니다 NewPipe의 개인정보취급방침 - NewPipe 프로젝트는 사용자의 개인 정보 보호를 최우선으로 생각하며, 동의 없이 어떠한 정보도 수집하지 않습니다. -\nNewPipe 개인정보 보호 정책에서는 오류 보고 시 어떠한 정보가 수집되고 저장되는지 자세히 명시되어 있습니다. + NewPipe 프로젝트는 사용자의 개인 정보 보호를 최우선으로 생각하며, 동의 없이 어떠한 정보도 수집하지 않습니다. \nNewPipe 개인정보 보호 정책에서는 오류 보고 시 어떠한 정보가 수집되고 저장되는지 자세히 명시되어 있습니다. 개인정보취급방침 읽기 NewPipe는 카피레프트 자유 소프트웨어입니다: 마음대로 사용하고, 연구하고, 공유하고, 개선할 수 있습니다. 특히 자유 소프트웨어 재단에서 발행한 GNU 일반 공중 사용 라이센스의 조건에 따라 라이센스 버전 3 또는 (귀하의 선택에 따라) 이후 버전을 재배포 및/또는 수정할 수 있습니다. - 설정도 가져오시겠습니까\? + 설정도 가져오시겠습니까? 무음 구간 빨리 감기 - 유럽 연합 일반 데이터 보호 규정(GDPR)을 준수하기 위해 NewPipe의 개인 정보 보호 정책에 주의를 기울입니다. 주의 깊게 읽으십시오. -\n버그 보고서를 보내려면 수락해야 합니다. + 유럽 연합 일반 데이터 보호 규정(GDPR)을 준수하기 위해 NewPipe의 개인 정보 보호 정책에 주의를 기울입니다. 주의 깊게 읽으십시오. \n버그 보고서를 보내려면 수락해야 합니다. 동의 동의하지 않음 제한 없음 @@ -320,7 +302,7 @@ 앱 업데이트 알림 새 NewPipe 버전 알림 외부 저장소 없음 - SD 카드로 다운로드 할 수 없습니다. 다운로드 폴더 경로를 초기화 하시겠습니까\? + SD 카드로 다운로드 할 수 없습니다. 다운로드 폴더 경로를 초기화 하시겠습니까? 1개의 항목이 삭제되었습니다. 앱 전환시 최소화 비디오 플레이어에서 다른 앱으로 전환 시 다음과 같은 동작 실행 — %s @@ -331,7 +313,7 @@ 초기화 저장된 탭을 불러올 수 없었으므로, 기본 탭을 사용합니다 기본설정으로 되돌리기 - 초기 설정으로 복원하시겠습니까\? + 초기 설정으로 복원하시겠습니까? 구독자 수를 가져올 수 없습니다 메인 화면에 표시할 탭을 설정합니다 업데이트 @@ -389,18 +371,17 @@ 남은 저장공간이 없습니다 파일이 삭제되어 진행이 중지되었습니다 연결시간 초과 - 모든 다운로드 기록과 파일을 삭제합니다.확실합니까\? + 모든 다운로드 기록과 파일을 삭제합니다.확실합니까? 다운로드 대기 제한 다운로드 시작 다운로드 일시정지 다운로드 위치를 묻기 - 각 다운로드를 저장할 위치를 묻는 메시지가 표시됩니다. -\n외부 SD 카드에 다운로드하려면 시스템 폴더 선택기(SAF) 활성화 + 각 다운로드를 저장할 위치를 묻는 메시지가 표시됩니다. \n외부 SD 카드에 다운로드하려면 시스템 폴더 선택기(SAF) 활성화 시스템 폴더 선택기(SAF) 사용 \'저장영역 접속 프레임워크\'를 통해 외부 SD 카드로 다운로드 가능 재생 위치 삭제 모든 재생 위치를 삭제 - 모든 재생 위치를 삭제하시겠습니까\? + 모든 재생 위치를 삭제하시겠습니까? %s 동영상 @@ -436,7 +417,7 @@ %d 선택 - 이 그룹을 삭제하시겠어요\? + 이 그룹을 삭제하시겠어요? 새로운 피드 피드를 프로세싱합니다… @@ -452,9 +433,7 @@ ∞ 비디오 100+ 비디오 노래 - 이 비디오는 연령제한이 있습니다. -\n -\n만약, 시청을 원한다면 설정에 \"%1$s\"를 활성화 하세요. + 이 비디오는 연령제한이 있습니다. \n \n만약, 시청을 원한다면 설정에 \"%1$s\"를 활성화 하세요. 완료 아티스트 앨범 @@ -483,7 +462,7 @@ 시청 기록을 지우겠습니까? 시청 기록 지우기 재생목록 실행 - URL을 인식할 수 없습니다. 다른 앱으로 여시겠습니까\? + URL을 인식할 수 없습니다. 다른 앱으로 여시겠습니까? 대기열을 지우기 전에 확인 요청 안드로이드에서 썸네일 이미지의 기본 색상에 따라 알림 색상을 사용자 지정 (일부 기기에서는 사용할 수 없음) 버퍼링 @@ -561,7 +540,7 @@ 저품질 (작게) 표시하지 않음 업데이트 확인 중… - 디스크에서 다운로드한 모든 파일을 지우겠습니까\? + 디스크에서 다운로드한 모든 파일을 지우겠습니까? %1$s 다운로드 삭제됨 @@ -574,8 +553,7 @@ 태블릿 모드 지역 검색 제안 원격 검색 제안 - 이 동영상은 연령 제한이 있습니다. -\n연령 제한 동영상에 대한 새로운 YouTube 정책으로 인해 NewPipe는 동영상 스트림에 접속할 수 없으므로 재생할 수 없습니다. + 이 동영상은 연령 제한이 있습니다. \n연령 제한 동영상에 대한 새로운 YouTube 정책으로 인해 NewPipe는 동영상 스트림에 접속할 수 없으므로 재생할 수 없습니다. reCAPTCHA를 해결할 때 NewPipe가 저장하는 쿠키 지우기 설명 댓글 @@ -604,9 +582,7 @@ 새로운 피드 항목 그룹화되지 않은 구독만 표시 \'%s\'에 대한 피드를 불러올 수 없습니다. - 제작자의 계정이 해지되었습니다. -\nNewPipe는 앞으로 이 피드를 불러올 수 없습니다. -\n이 채널의 구독을 취소하겠습니까\? + 제작자의 계정이 해지되었습니다. \nNewPipe는 앞으로 이 피드를 불러올 수 없습니다. \n이 채널의 구독을 취소하겠습니까? 빠른 공급 모드는 이에 대한 자세한 정보를 제공하지 않습니다. 사용 가능한 경우 전용 피드에서 가져오기 이 콘텐츠는 유료 사용자만 사용할 수 있으므로 NewPipe에서 스트리밍 또는 다운로드할 수 없습니다. @@ -666,24 +642,10 @@ 선호하는 어두운 테마 선택 — %s 다운로드가 시작되었습니다 이제 설명 내에서 텍스트를 선택할 수 있습니다. 선택 모드에서는 페이지가 깜박이고 링크를 클릭할 수 없는 경우가 있습니다. - 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. -\n저장영역 접속 프레임워크 호환 파일 관리자를 설치하십시오 - 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. -\n파일 관리자를 설치하거나 다운로드 설정에서 \'%s\'을(를) 비활성화하십시오 - 피드 로딩이 너무 느리다고 생각하시나요\? 그렇다면 빠른 로딩을 활성화해 보세요. (설정에서 변경하거나 아래 버튼을 눌러 변경할 수 있습니다) -\n -\nNewPipe는 두 가지 피드 로딩 전략을 제공합니다: -\n• 전체 구독 채널 가져오기: 느리지만 완전합니다. -\n• 전용 서비스 엔드포인트 사용: 빠르지만 일반적으로 완전하지 않습니다. -\n -\n이 두 가지의 차이점은 빠른 방식이 일반적으로 항목의 길이나 유형(실시간 동영상과 일반 동영상을 구분할 수 없음)과 같은 일부 정보가 부족하고 더 적은 항목을 반환할 수 있다는 점입니다. -\n -\nYouTube는 RSS 피드를 통해 이 빠른 방법을 제공하는 서비스의 예입니다. -\n -\n따라서 선택은 속도와 정확한 정보 중 무엇을 선호하느냐에 달려 있습니다. - 이 기능은 아직 NewPipe에서 지원하지 않습니다. -\n -\n이후 버전에서 지원될 예정입니다. + 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. \n저장영역 접속 프레임워크 호환 파일 관리자를 설치하십시오 + 이 작업에 적합한 파일 관리자를 찾을 수 없습니다. \n파일 관리자를 설치하거나 다운로드 설정에서 \'%s\'을(를) 비활성화하십시오 + 피드 로딩이 너무 느리다고 생각하시나요? 그렇다면 빠른 로딩을 활성화해 보세요. (설정에서 변경하거나 아래 버튼을 눌러 변경할 수 있습니다) \n \nNewPipe는 두 가지 피드 로딩 전략을 제공합니다: \n• 전체 구독 채널 가져오기: 느리지만 완전합니다. \n• 전용 서비스 엔드포인트 사용: 빠르지만 일반적으로 완전하지 않습니다. \n \n이 두 가지의 차이점은 빠른 방식이 일반적으로 항목의 길이나 유형(실시간 동영상과 일반 동영상을 구분할 수 없음)과 같은 일부 정보가 부족하고 더 적은 항목을 반환할 수 있다는 점입니다. \n \nYouTube는 RSS 피드를 통해 이 빠른 방법을 제공하는 서비스의 예입니다. \n \n따라서 선택은 속도와 정확한 정보 중 무엇을 선호하느냐에 달려 있습니다. + 이 기능은 아직 NewPipe에서 지원하지 않습니다. \n \n이후 버전에서 지원될 예정입니다. 앱 사용에 문제가 있는 경우, 일반적인 질문에 대한 다음 답변을 확인하세요! 자주 묻는 질문 웹사이트에서 보기 @@ -699,8 +661,8 @@ 카드 클립보드 복사 실패 복제 삭제 - 복제를 삭제하시겠습니까\? - 이 재생목록의 모든 스트림 복사본을 삭제하겠습니까\? + 복제를 삭제하시겠습니까? + 이 재생목록의 모든 스트림 복사본을 삭제하겠습니까? 다음 스트림 표시 부분적 시청 완전 시청 @@ -732,9 +694,7 @@ 더빙됨 설명 디코더 초기화 문제가 있는 경우 이 옵션을 활성화하면 기본 디코더 초기화에 실패할 경우 우선순위가 낮은 디코더로 되돌아갑니다. 이 경우 기본 디코더를 사용할 때보다 재생 성능이 저하될 수 있음 - 이 해결 방법은 인터페이스가 변경될 때 인터페이스를 코덱으로 직접 설정하는 대신 비디오 코덱을 해제하고 다시 인스턴스화합니다. 이 문제가 있는 일부 기기에서 ExoPlayer가 이미 사용 중인 이 설정은 안드로이드 6 이상에서만 적용 -\n -\n이 옵션을 활성화하면 현재 동영상 플레이어를 전환하거나 전체 화면으로 전환할 때 재생 오류를 방지할 수 있음 + 이 해결 방법은 인터페이스가 변경될 때 인터페이스를 코덱으로 직접 설정하는 대신 비디오 코덱을 해제하고 다시 인스턴스화합니다. 이 문제가 있는 일부 기기에서 ExoPlayer가 이미 사용 중인 이 설정은 안드로이드 6 이상에서만 적용 \n \n이 옵션을 활성화하면 현재 동영상 플레이어를 전환하거나 전체 화면으로 전환할 때 재생 오류를 방지할 수 있음 메인 탭 선택기를 하단으로 이동 %1$s %2$s 메인 탭 위치 @@ -746,8 +706,7 @@ 채널 페이지에 표시되는 탭 URL 목록 공유 타이틀로 공유 - %1$s -\n%2$s + %1$s \n%2$s 채널 탭 쇼츠 메타데이터 불러오기 중… @@ -790,11 +749,8 @@ 기기에 저장공간이 충분하지 않습니다 덜보기 백업 및 복원 - NewPipe에서 자동으로 새 버전을 확인하고 업데이트가 있으면 알려줍니다. -\n이 기능을 켜시겠습니까? - 모든 설정을 초기화하면 설정해둔 사항이 모두 삭제되며 앱을 다시 시작합니다. -\n -\n정말 계속하시겠습니까? + NewPipe에서 자동으로 새 버전을 확인하고 업데이트가 있으면 알려줍니다. \n이 기능을 켜시겠습니까? + 모든 설정을 초기화하면 설정해둔 사항이 모두 삭제되며 앱을 다시 시작합니다. \n \n정말 계속하시겠습니까? 가져오려는 설정 파일이 NewPipe 0.27.0 이상에서는 권장하지 않는 취약한 형식으로 작성되어 있습니다. 설정 파일의 출처를 신뢰할 수 있는지 꼭 확인하시기 바라며, 다음부터는 가급적 NewPipe 0.27.0 이후의 설정 파일만 이용하시기 바랍니다. 이 취약한 형식의 설정 파일은 곧 더 이상 지원되지 않으며, 오래된 버전의 NewPipe에서 새 버전의 설정 파일을 가져오는 것도 불가능해질 예정입니다. 답글 %s개 diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index c788f252a..2364f45bd 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -164,8 +164,7 @@ تکایە چاوەڕێبکە… لەبەرگیرایەوە تکایە فۆڵدەرێک بۆ شوێنی دابەزاندن دیاریبکە لە ڕێکخستنەکان - ئەم دەسەڵاتە پێویستە بۆ -\nکردنەوەی دۆخی پەنجەرە + ئەم دەسەڵاتە پێویستە بۆ \nکردنەوەی دۆخی پەنجەرە reCAPTCHA داواکاری reCAPTCHA داواکراوە دابەزاندن @@ -228,21 +227,10 @@ هاوردەی پێشووتر ناتوانرێ بەشدارییەکان هەناردەبکرێنەوە ناتوانرێ بەشدارییەکان هاوردە بکرێن - بۆ هێنانەوەی بەشداربوونەکانی یوتوب پێویستە پەڕگەی خەزن بوو بگەڕێنیتەوە: -\n -\n1. ئەم بەستەرە بکەوە: s%1$s -\n2. بچۆرەژوورەوە گەر داوای‌ کرد -\n3. داگرتنێک دەست پێدەکات (ئەمە پەڕگەی خەزنکراوە) - هەناردەکردنەوەی پەڕەی کەسی SoundCloud بەدانانی بەستەر یاخوود ئایدی: -\n -\n1. دۆخی ”Desktop mode” لە وێبگەرەکەتدا چالاک بکە (ئەم ماڵپەڕە بۆ وێبگەری مۆبایلەکان بەردەست نییە) -\n2. ئەم بەستەرە بکەرەوە : %1$s -\n3. بچۆرە ژوورەوە گەر داواکرا -\n4. بەستەری پەڕەی کەسییەکەت دابنێ. + بۆ هێنانەوەی بەشداربوونەکانی یوتوب پێویستە پەڕگەی خەزن بوو بگەڕێنیتەوە: \n \n1. ئەم بەستەرە بکەوە: s%1$s \n2. بچۆرەژوورەوە گەر داوای‌ کرد \n3. داگرتنێک دەست پێدەکات (ئەمە پەڕگەی خەزنکراوە) + هەناردەکردنەوەی پەڕەی کەسی SoundCloud بەدانانی بەستەر یاخوود ئایدی: \n \n1. دۆخی ”Desktop mode” لە وێبگەرەکەتدا چالاک بکە (ئەم ماڵپەڕە بۆ وێبگەری مۆبایلەکان بەردەست نییە) \n2. ئەم بەستەرە بکەرەوە : %1$s \n3. بچۆرە ژوورەوە گەر داواکرا \n4. بەستەری پەڕەی کەسییەکەت دابنێ. ئایدییەکەت , soundcloud.com/yourid - ئەوە بزانە ئەم کردارە پێویستی بە هێڵێکی گران هەیە. -\n -\nدەتەوێ بەردەوامبیت؟ + ئەوە بزانە ئەم کردارە پێویستی بە هێڵێکی گران هەیە. \n \nدەتەوێ بەردەوامبیت؟ کۆنترۆڵی خێرایی کارپێکەر خێراییەکان شەپۆلی دەنگ @@ -258,11 +246,9 @@ تەواوی گەڕانەکانت بسڕدرێنەوە؟ مێژووی گەڕانەکانت سڕانەوە. 1 بابەت سڕایەوە. - ئەم ئەپە سەرچاوە کراوەیە : دەتوانی بەکاریبهێنی، بیخوێنیتەوە و هاوبەشی پێبکەیت و بەرەوپێشی ببەیت. -\nبەتایبەتی دەتوانی دابەشیبکەیتەوە یاخوود بگۆڕیت بەپێی مەرجەکانی GNU مۆڵەتنامەی گشتی وەک ئەپێکی بڵاوی خۆڕایی! + ئەم ئەپە سەرچاوە کراوەیە : دەتوانی بەکاریبهێنی، بیخوێنیتەوە و هاوبەشی پێبکەیت و بەرەوپێشی ببەیت. \nبەتایبەتی دەتوانی دابەشیبکەیتەوە یاخوود بگۆڕیت بەپێی مەرجەکانی GNU مۆڵەتنامەی گشتی وەک ئەپێکی بڵاوی خۆڕایی! سیاسەتی تایبەتی ئەپ - پڕۆژەی ئەپەکە زانیارییە تایبەتییەکانت بەوردی دەپارێزێ. هەروەها ئەپەکە هیچ داتایەک بەبێ ئاگاداری تۆ بەکارنابات. -\nسیاسەتی تایبەتی ئەپ بەوردەکاری ڕوونکردنەوەت دەداتێ لەسەر ئەو داتایانەی وەریاندەگرێ و بەکاریاندەبات. + پڕۆژەی ئەپەکە زانیارییە تایبەتییەکانت بەوردی دەپارێزێ. هەروەها ئەپەکە هیچ داتایەک بەبێ ئاگاداری تۆ بەکارنابات. \nسیاسەتی تایبەتی ئەپ بەوردەکاری ڕوونکردنەوەت دەداتێ لەسەر ئەو داتایانەی وەریاندەگرێ و بەکاریاندەبات. خوێندنەوەی سیاسەتی تایبەتی کەناڵەکان لیستەلێدانەکان @@ -276,8 +262,7 @@ پەیامی نوێکاری ئەپ پەیامەکانی وەشانی نوێی ئەپ بیرگەی دەرەکی بەردەست نییە - دابەزاندن لە بیرگەی دەرەکی ناکرێت. -\nشوێنی فۆڵدەری دابەزاندنەکان دابنرێتەوە؟ + دابەزاندن لە بیرگەی دەرەکی ناکرێت. \nشوێنی فۆڵدەری دابەزاندنەکان دابنرێتەوە؟ گێڕانەوە بۆ بنەڕەت ئایا دەتەوێ بگەڕێنرێتەوە بۆ شێوازی بنەڕەتی؟ ژمارەی بەشداربووان نادیارە @@ -356,8 +341,7 @@ کرداری ’کردنەوە’ی پێشنیارکراو کرداری بنەڕەتی لەکاتی کردنەوەی بابەت — %s ئایا دەتەوێت ڕێکخستنەکانیش هەناردەبکرێن؟ - بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی ئەپەکەمان. تکایە بەئاگادارییەوە بیخوێنەوە. -\nپێویستە قبوڵی بکەیت بۆ ناردنی سکاڵاکانت. + بۆ جێبەجێکردنی فرمانەکان لەگەڵ یاسای پاراستنی داتای گشتی ئەوروپیدا (GDPR) , ئێمە سەرنجت ڕادەکێشین بۆ سیاسەتە تایبەتییەکانی ئەپەکەمان. تکایە بەئاگادارییەوە بیخوێنەوە. \nپێویستە قبوڵی بکەیت بۆ ناردنی سکاڵاکانت. پەسەند ڕەتکردنەوە بێ سنوور @@ -425,8 +409,7 @@ پرسیاربکرێ لەکوێ دابەزێنرێت پرسیارت لێ دەکرێت بۆ شوێنی دابەزاندنی هەر پەڕگەیەک بەکارهێنانی SAF - چوارچێوەی گەیشتن بە بیرگە ڕێگەدەدات بە دابەزاندنی پەڕگەکان لە بیرگەی دەرەکیدا. -\nتێبینی: هەندێ لە مۆبایلەکان پشتگیری ناکرێن + چوارچێوەی گەیشتن بە بیرگە ڕێگەدەدات بە دابەزاندنی پەڕگەکان لە بیرگەی دەرەکیدا. \nتێبینی: هەندێ لە مۆبایلەکان پشتگیری ناکرێن ناوخۆ لەم ماوەیەدا بڵاوکرابێتەوە زۆرترین بەدڵبوون @@ -483,17 +466,9 @@ لەهەندێ خزمەتگوزاریدا بەردەستە، هەمیشە خێرایە بەڵام ڕەنگە هەندێ لە بابەتەکان زانیارییەکانیان ناتەواو بێت (وەک نەبوونی ماوە، جۆری بابەت ، نەبوونی پەخش). چالاککردنی دۆخی خێرا چالاک نەکردنی دۆخی خێرا - ئایا توانای بارکردن لاوازە؟ گەر وایە ئەوا بارکردنی خێرا تاقی بکەرەوە (دەتوانی بیگۆڕیت لە بەشی ڕێکخستنەکان لەڕێگای گرتەکردن لەم دوگمەیەی خوارەوە). -\n -\nئەم ئەپە دوو شێوازی بارکردنت بۆ پێشنیاز دەکات: -\n- بارکردنی تەواوی کەناڵە بەشدارییەکانت، ئەمەیان خاوە بەڵام تەواوە. -\n- تەرخانکردنی خزمەتگوزارییەکان ئەمەیان خێرایە بەڵام زۆر تەواو نییە. - ئەم ناوەڕۆکە پشتگیری نەکراوە لەلایەن ئەپەکەمانەوە. -\n -\nهیوادارین بتوانین لە وەشانەکانی داهاتوودا پشتگیری بکەین. - ئەم ڤیدیۆیە بۆ تەمەن سنوردارە. -\n -\n%1$s کارا بکە لە ڕێکخستنەکان گەر دەتەوێت بیبینیت. + ئایا توانای بارکردن لاوازە؟ گەر وایە ئەوا بارکردنی خێرا تاقی بکەرەوە (دەتوانی بیگۆڕیت لە بەشی ڕێکخستنەکان لەڕێگای گرتەکردن لەم دوگمەیەی خوارەوە). \n \nئەم ئەپە دوو شێوازی بارکردنت بۆ پێشنیاز دەکات: \n- بارکردنی تەواوی کەناڵە بەشدارییەکانت، ئەمەیان خاوە بەڵام تەواوە. \n- تەرخانکردنی خزمەتگوزارییەکان ئەمەیان خێرایە بەڵام زۆر تەواو نییە. + ئەم ناوەڕۆکە پشتگیری نەکراوە لەلایەن ئەپەکەمانەوە. \n \nهیوادارین بتوانین لە وەشانەکانی داهاتوودا پشتگیری بکەین. + ئەم ڤیدیۆیە بۆ تەمەن سنوردارە. \n \n%1$s کارا بکە لە ڕێکخستنەکان گەر دەتەوێت بیبینیت. ∞ ڤیدیۆ +١٠٠ ڤیدیۆ هونەرمەندەکان diff --git a/app/src/main/res/values-la/strings.xml b/app/src/main/res/values-la/strings.xml index 7e296a5f0..77400150a 100644 --- a/app/src/main/res/values-la/strings.xml +++ b/app/src/main/res/values-la/strings.xml @@ -39,7 +39,7 @@ Utere lusorem taeniae externum Communicare cum Praecessi propter: %s - Intendi \"%1$s\"\? + Intendi \"%1$s\"? Adaptabilitates Tange \"Quaere\" ad initium. Quaerere diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index d43a69fb0..3243b8c09 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -2,7 +2,7 @@ Norėdami pradėti paspauskite padidinimo stiklą. Publikuota %1$s - Nerastas srauto grotuvas. Įdiegti VLC\? + Nerastas srauto grotuvas. Įdiegti VLC? Įdiegti Atšaukti Atverti naršyklėje @@ -29,7 +29,7 @@ Rodyti didesnes raiškas Tik kai kurie įrenginiai palaiko 2K/4K vaizdo įrašų peržiūrą Groti su Kodi - Įdiegti nereastą Kode programėlę\? + Įdiegti nereastą Kode programėlę? Rodyti „Peržiūra su Kodi“ pasirinkimą Rodyti pasirinkimą peržiūrėti vaizdo įrašus per Kodi mediacentrą Garso įrašas @@ -87,11 +87,13 @@ %s prenumeratorius %s prenumeratoriai + %s prenumeratorių %s prenumeratorių %s vaizdo įrašas %s vaizdo įrašai + %s vaizdo įrašų %s vaizdo įrašų Pradėti @@ -107,8 +109,7 @@ Prašome palaukti… Nukopijuota į iškarpinę Prašome pasirinkti galimą atsisiuntimų aplankalą - Šis leidimas reikalingas -\natidarymui iššokančio lango rėžime + Šis leidimas reikalingas \natidarymui iššokančio lango rėžime reCAPTCHA iššūkis prašomas reCAPTCHA iššūkis Prenumeruoti @@ -144,6 +145,7 @@ %s peržiūra %s peržiūros + %s peržiūrų %s peržiūrų Nėra vaizdo įrašų @@ -233,7 +235,7 @@ Nustatyti kaip grojaraščio miniatiūrą Pridėti grojaraštį į žymes Pašalinti žymes - Ištrinti šį grojaraštį\? + Ištrinti šį grojaraštį? Grojaraštis sukurtas Pridėta į grojaraštį Grojaraščio paveikslėlis pakeistas. @@ -260,12 +262,14 @@ %s klausytojas %s klausytojai + %s klausytojų %s klausytojų Niekas neklauso %s žiūri %s žiūri + %s žiūri %s žiūri Niekas nežiūri @@ -277,7 +281,7 @@ Pranešti per GitHub Kopijuoti formatuotą pranešimą Suteikti leidimą rodyti virš kitų programų - Ar norite atstatyti numatytuosius\? + Ar norite atstatyti numatytuosius? Atstatyti numatytuosius Įkelti išsaugotų kortelių nepavyko, naudojamos numatytosios Nėra srautų parsiuntimui @@ -287,16 +291,16 @@ Tokio failo/turinio šaltinio nėra Tokio aplanko nėra Failas perkeltas ar ištrintas - Įrašyti į išorinę SD kortelę nepavyko. Atstatyti atsisiuntimo aplanką\? + Įrašyti į išorinę SD kortelę nepavyko. Atstatyti atsisiuntimo aplanką? Išorinė saugykla neprieinama Paieškos istorija pašalinta - Išvalyti visą paieškos istoriją\? + Išvalyti visą paieškos istoriją? Išvalo paieškos istoriją Išvalyti paieško istoriją Pašalina visas atkūrimo vietas Pašalinti atkūrimo vietas Žiūrėjimo istorija pašalinta - Išvalyti visą žiūrėjimo istoriją\? + Išvalyti visą žiūrėjimo istoriją? Išvalo atkurtų srautų ir atkūrimo vietos istoriją Išvalyti žiūrėjimo istoriją Išvalyti slapukus kuriuos NewPipe išsaugojo kai vedėte reCAPTCHA @@ -317,11 +321,8 @@ Vaizdo įrašai Grojaraščiai Kanalai - Šiam video taikomas amžiaus apribojimas. -\nDėl naujų YouTube amžiaus ribojimų NewPipe negali pasiekti ir atkurti šių video srautų. - Šiam video taikomas amžiaus apribojimas -\n -\nĮjunkite \"%1$s\" norėdami peržiūrėti. + Šiam video taikomas amžiaus apribojimas. \nDėl naujų YouTube amžiaus ribojimų NewPipe negali pasiekti ir atkurti šių video srautų. + Šiam video taikomas amžiaus apribojimas \n \nĮjunkite \"%1$s\" norėdami peržiūrėti. Youtube turi „apribotą režimą“ kuriame slepiamas galimai suaugusiems skirtas turinys Įjungti YouTube „apribotą režimą“ Rodyti turinį kuris gali būti netinkamas vaikams (18+) @@ -332,7 +333,7 @@ Pasirinkite patikusias kopijas %s Pasirinkite mėgiamiausias PeerTube kopijas PeerTube kopijos - URL neatpažintas. Atverti kita programa\? + URL neatpažintas. Atverti kita programa? Automatinis atkūrimas Išvalyti duomenis Sąraše rodyti atkūrimo vietos indikatorių @@ -364,7 +365,7 @@ Apkirpti video miniatiūrų rodomų pranešime kraštinių santykį iš 16:9 į 1:1 Apkirpti miniatiūrų dydi 1:1 santykiu Atkūrimo vietos pašalintos - Pašalinti visas atkūrimo vietas\? + Pašalinti visas atkūrimo vietas? Netinkama kopija Įveskite kopijos URL Atstatyti paskutinį atkūrimo laiką @@ -375,28 +376,15 @@ Prieš išvalant eilę prašyti patvirtinimo Greito prasukimo trukmė Netikslus prasukimas leidžia grotuvui greitai peršokti į kitą vietą su sumažintu tikslumu. 5, 15 ar 25 sekundės to nenaudoja - Importuokite „YouTube“ prenumeratas iš „Google Takeout“: -\n -\n1. Eikite į šį URL adresą: %1$s -\n2. Prisijunkite, kai būsite paprašyti -\n3. Spustelėkite „All data included“ (įtraukti visus duomenis), tada „Deselect all“ (panaikinti visų duomenų pasirinkimą), tada pasirinkite tik „Subscriptions“ (prenumeratos) ir spustelėkite „OK“ (gerai). -\n4. Spustelėkite „Next step“ (kitas žingsnis), tada „Create export“ (sukurti eksportą). -\n5. Pasirodžius mygtukui „Download“ (Atsisiųsti), spustelėkite jį ir -\n6. Spustelėkite toliau Importuoti failą ir pasirinkite atsisiųstą ZIP failą -\n7. [Jei nepavyksta importuoti ZIP failo] Ištraukite .csv failą (paprastai po „YouTube and YouTube Music/subscriptions/subscriptions.json“), spustelėkite toliau esantį Importuoti failą ir pasirinkite išgautą CSV failą + Importuokite „YouTube“ prenumeratas iš „Google Takeout“: \n \n1. Eikite į šį URL adresą: %1$s \n2. Prisijunkite, kai būsite paprašyti \n3. Spustelėkite „All data included“ (įtraukti visus duomenis), tada „Deselect all“ (panaikinti visų duomenų pasirinkimą), tada pasirinkite tik „Subscriptions“ (prenumeratos) ir spustelėkite „OK“ (gerai). \n4. Spustelėkite „Next step“ (kitas žingsnis), tada „Create export“ (sukurti eksportą). \n5. Pasirodžius mygtukui „Download“ (Atsisiųsti), spustelėkite jį ir \n6. Spustelėkite toliau Importuoti failą ir pasirinkite atsisiųstą ZIP failą \n7. [Jei nepavyksta importuoti ZIP failo] Ištraukite .csv failą (paprastai po „YouTube and YouTube Music/subscriptions/subscriptions.json“), spustelėkite toliau esantį Importuoti failą ir pasirinkite išgautą CSV failą NewPipe yra „copyleft libre“ programinė įranga: galite ją naudoti, studijuoti ir patobulinti. Konkrečiau, galite ją platinti ir (arba) modifikuoti pagal „Free Software Foundation“ paskelbtą GNU bendrosios viešosios licencijos sąlygas, pasirinktinai pagal 3 licencijos versiją arba (jūsų pasirinkimu) bet kurią vėlesnę versiją. - Importuokite \"SoundCloud\" profilį įvesdami URL arba savo ID: -\n -\n1. Interneto naršyklėje įjunkite darbalaukio režimą (svetainė neprieinama mobiliesiems įrenginiams). -\n2. Eikite šiuo adresu: %1$s -\n3. Prisijunkite, kai būsite paprašyti -\n4. Nukopijuokite profilio URL, į kurį buvote nukreipti. + Importuokite \"SoundCloud\" profilį įvesdami URL arba savo ID: \n \n1. Interneto naršyklėje įjunkite darbalaukio režimą (svetainė neprieinama mobiliesiems įrenginiams). \n2. Eikite šiuo adresu: %1$s \n3. Prisijunkite, kai būsite paprašyti \n4. Nukopijuokite profilio URL, į kurį buvote nukreipti. Šis turinys prieinamas tik sumokėjusiems naudotojams, todėl \"NewPipe\" negali jo transliuoti ar atsisiųsti. Šis vaizdo įrašas prieinamas tik \"YouTube Music Premium\" nariams, todėl \"NewPipe\" negali jo transliuoti ar atsisiųsti. Išjunkite medijos tuneliavimą, jei vaizdo įrašo atkūrimo metu atsiranda juodas ekranas arba užstrigimas. Pakeiskite grotuvo subtitrų teksto mastelį ir fono stilių. Pakeitimai įsigalios iš naujo paleidus programą Šis turinys yra privatus, todėl \"NewPipe\" jo negali transliuoti ar atsisiųsti. - Ar norite išvalyti atsisiuntimų istoriją ar ištrinti visus atsisiųstus failus\? + Ar norite išvalyti atsisiuntimų istoriją ar ištrinti visus atsisiųstus failus? Laikas po paskutinio atnaujinimo, po kurio prenumerata laikoma pasenusia — %s Serveris nepriima daugiasrautinių atsisiuntimų, pakartokite bandymą su @string/msg_threads = 1 Naudoti miniatiūrą užrakinimo ekrano fonui ir pranešimams @@ -429,16 +417,19 @@ %d diena %d dienos + %d dienų %d dienų %d minutes %d minutės + %d minučių %d minučių %d sekundė %d sekundės + %d sekundžių %d sekundžių Sistemos numatytoji @@ -492,55 +483,38 @@ Nesenai pridėta Vietinė Komentarų įkelti nepavyko - Ar norite importuoti nustatymus\? + Ar norite importuoti nustatymus? Kol kas nėra grojaraščio žymų Pasirinkite grojaraštį Numatytasis režimas Kokios kortelės rodomos pagrindiniame puslapyje Skaityti privatumo politiką - NewPipe į jūsų privatumą žiūri labai rimtai. Programa be jūsų sutikimo nerenka jokių duomenų. -\nNewPipe privatumo politika išsamiai parodo kokie duomenys siunčiami ir saugomi pranešant apie problemą. + NewPipe į jūsų privatumą žiūri labai rimtai. Programa be jūsų sutikimo nerenka jokių duomenų. \nNewPipe privatumo politika išsamiai parodo kokie duomenys siunčiami ir saugomi pranešant apie problemą. NewPipe privatumo politika Atlikta Išspręsta Paspauskite \"atlikta\" kai išspręsta Patikrinkite ar apie problemą su kuria susidūrėte dar nėra pranešta. Sukurdami kelis pranešimus apie tą pačią problemą atimate iš mūsų laiką kurį galėtume skirti klaidų taisymui. - Ar manote, kad kanalas kraunamas per lėtai\? Jei taip, pabandykite įjungti greitąjį įkrovimą (tai galite pakeisti nustatymuose arba paspaudę toliau esantį mygtuką). -\n -\n\"NewPipe\" siūlo dvi kanalo įkėlimo strategijas: -\n- Visos prenumeratos kanalo atsisiuntimas, kuris yra lėtas, bet išsamus. -\n- Naudojant specialų paslaugos galinį tašką, kuris yra greitas, bet paprastai neišsamus. -\n -\nSkirtumas tarp šių dviejų būdų yra tas, kad greitasis būdas paprastai neturi tam tikros informacijos, pavyzdžiui, elemento trukmės ar tipo (negalima atskirti tiesioginių ir įprastų vaizdo įrašų), ir gali grąžinti mažiau elementų. -\n -\n\"YouTube\" yra pavyzdys paslaugos, kuris siūlo šį greitąjį metodą su savo RSS kanalu. -\n -\nTaigi pasirinkimas priklauso nuo to, ko labiau norite: greičio ar tikslios informacijos. - Siekdami laikytis Europos bendrojo duomenų apsaugos reglamento (GDPR), atkreipiame jūsų dėmesį į NewPipe privatumo politiką. Prašome atidžiai ją perskaityti. -\nNorėdami išsiųsti mums pranešimą apie klaidą, turite su ja sutikti. + Ar manote, kad kanalas kraunamas per lėtai? Jei taip, pabandykite įjungti greitąjį įkrovimą (tai galite pakeisti nustatymuose arba paspaudę toliau esantį mygtuką). \n \n\"NewPipe\" siūlo dvi kanalo įkėlimo strategijas: \n- Visos prenumeratos kanalo atsisiuntimas, kuris yra lėtas, bet išsamus. \n- Naudojant specialų paslaugos galinį tašką, kuris yra greitas, bet paprastai neišsamus. \n \nSkirtumas tarp šių dviejų būdų yra tas, kad greitasis būdas paprastai neturi tam tikros informacijos, pavyzdžiui, elemento trukmės ar tipo (negalima atskirti tiesioginių ir įprastų vaizdo įrašų), ir gali grąžinti mažiau elementų. \n \n\"YouTube\" yra pavyzdys paslaugos, kuris siūlo šį greitąjį metodą su savo RSS kanalu. \n \nTaigi pasirinkimas priklauso nuo to, ko labiau norite: greičio ar tikslios informacijos. + Siekdami laikytis Europos bendrojo duomenų apsaugos reglamento (GDPR), atkreipiame jūsų dėmesį į NewPipe privatumo politiką. Prašome atidžiai ją perskaityti. \nNorėdami išsiųsti mums pranešimą apie klaidą, turite su ja sutikti. Prieinama kai kuriose tarnybose, paprastai yra daug greitesnė, tačiau gali grąžinti ribotą kiekį elementų ir dažnai neišsamią informaciją (pvz., nėra trukmės, elemento tipo, nėra tiesioginės būsenos) Vaizdo įrašai, kurie buvo peržiūrėti prieš juos įtraukiant į grojaraštį ir po to, kai jie buvo įtraukti į grojaraštį, bus pašalinti. \nAr tikrai? To negalima atšaukti! Tai \"SoundCloud Go+\" kūrinys, bent jau jūsų šalyje, todėl jo negalima transliuoti ar atsisiųsti per \"NewPipe\". - Šio turinio \"NewPipe\" dar nepalaiko. -\n -\nTikimės, kad jis bus palaikomas būsimoje versijoje. + Šio turinio \"NewPipe\" dar nepalaiko. \n \nTikimės, kad jis bus palaikomas būsimoje versijoje. \"Storage Access Framework\" leidžia atsisiųsti duomenis į išorinę SD kortelę - Atminkite, kad ši operacija gali brangiai kainuoti tinkle. -\n -\nAr norite tęsti\? + Atminkite, kad ši operacija gali brangiai kainuoti tinkle. \n \nAr norite tęsti? Rodyti pranešimą, kuriame raginama atnaujinti programą, kai yra nauja versija Dėl ExoPlayer apribojimų prasukimo trukmė buvo nustatyta %d sekundės Naudinga pereinant prie mobiliųjų duomenų, nors kai kurių atsisiuntimų sustabdyti negalima Veiksmas, kai iš pagrindinio vaizdo įrašų grotuvo pereinama į kitą programą — %s Srauto elementuose bus matomi orginalūs tekstai iš paslaugų - Jūsų bus paklausta, kur išsaugoti kiekvieną atsisiuntimą. -\nĮgalinkite sisteminį aplanko parinktuką (SAP) jeigu norite, kad būtų atsiųsta į išorinę SD kortelę + Jūsų bus paklausta, kur išsaugoti kiekvieną atsisiuntimą. \nĮgalinkite sisteminį aplanko parinktuką (SAP) jeigu norite, kad būtų atsiųsta į išorinę SD kortelę Žemiau galite pasirinkti mėgstamą nakties temą Šiuo pavadinimu yra laukiama atsisiuntimo Atsisiųstas failas su šiuo pavadinimu jau egzistuoja Didžiausias bandymų skaičius prieš atšaukiant atsisiuntimą Pasirinkite mėgstamiausią nakties temą — %s - Ar norite panaikinti šią grupę\? + Ar norite panaikinti šią grupę? Eiga prarasta, nes failas buvo panaikintas Failas šiuo pavadinimu jau egzistuoja Nepavyko sukurti paskirties aplanko @@ -580,6 +554,7 @@ %d pasirinktas %d pasirinkti + %d pasirinkta %d pasirinkta Pasirinkite prenumeratas @@ -588,6 +563,7 @@ %d valanda %d valandos + %d valandų %d valandų Pradėti siuntimus @@ -624,9 +600,7 @@ Dabar apraše galite pasirinkti tekstą aprašyme. Atminkite, kad puslapis gali mirgėti, o nuorodos gali būti nespustelėjamos, kai veikia pasirinkimo režimas. Paskyra anuliuota Greito srauto režimas nesuteikia daugiau informacijos apie tai. - Autoriaus paskyra anuliuota. -\n„NewPipe“ negalės įkelti šio kanalo ateityje. -\nAr norite atsisakyti šio kanalo prenumeratos\? + Autoriaus paskyra anuliuota. \n„NewPipe“ negalės įkelti šio kanalo ateityje. \nAr norite atsisakyti šio kanalo prenumeratos? Klaida įkeliant srautą Pradedant Android 10 palaikoma tik \'Storage Access Framework\' Jūsų bus paklausta, kur išsaugoti kiekvieną atsiuntimą @@ -643,11 +617,13 @@ Ištrintas %1$s atsiuntimas Ištrinti %1$s atsiuntimai + Ištrinta %1$s atsiuntimų Ištrinta %1$s atsiuntimų Atsiuntimas baigtas %s atsiuntimai baigti + %s atsiuntimų baigta %s atsiuntimų baigta Perbraukite elementus, kad juos pašalintumėte @@ -664,14 +640,12 @@ Naudojant grotuvą rodo lūžio parinkty Rodyti klaidos juostą Prisegtas komentaras - Nerasta tinkama failų tvarkyklė. -\nĮdiekite „Storage Access Framework“ suderinamą su šia failų tvarkykle + Nerasta tinkama failų tvarkyklė. \nĮdiekite „Storage Access Framework“ suderinamą su šia failų tvarkykle Pranešimai pranešimui apie klaidas Rodyti „Grotuvas užlūžo“ Kurti klaidos pranešimą NewPipe susidūrė su klaida, paspauskite norėdami pranešti - Šiam veiksmui nebuvo rasta tinkama failų tvarkyklė. -\nĮdiekite failų tvarkyklę arba pabandykite išjungti \"%s\" atsisiuntimo nustatymuose + Šiam veiksmui nebuvo rasta tinkama failų tvarkyklė. \nĮdiekite failų tvarkyklę arba pabandykite išjungti \"%s\" atsisiuntimo nustatymuose Užlūžo Klaidos pranešimo pranešimas Įvyko klaida, peržiūrėti pranešimą @@ -686,6 +660,7 @@ %s nauja transliacija %s naujos transliacijos + %s naujų transliacijų %s naujų transliacijų Gaukite pranešimą @@ -694,7 +669,7 @@ Transliacijos, kurių dar nepalaiko atsisiuntimo programa, nerodomos Nežinomas formatas Bet koks tinklas - Ištrinti visus atsisiųstus failus iš disko\? + Ištrinti visus atsisiųstus failus iš disko? Grotuvo pranešimas Pranešimai apie naujas transliacijas prenumeratoms Naujos transliacijos @@ -718,7 +693,7 @@ Greitasis režimas Naudojate naujausią „NewPipe“ versiją Bakstelėkite, kad atsisiųstumėte %s - Ar norite pašalinti visus pasikartojančius srautus iš šio grojaraščio\? + Ar norite pašalinti visus pasikartojančius srautus iš šio grojaraščio? Būsimas Grojaraščiai jau turintys šį elementą išaktyvuoti. Kartojasi pridėta %d kartus @@ -737,7 +712,7 @@ Audio takelis Kortelė Pašalinti besikartojančius - Pašalinti besikartojančius\? + Pašalinti besikartojančius? Rodyti šiuos srautus Iš dalies peržiūrėta \"ExoPlayer\" nustatymai @@ -755,9 +730,7 @@ Šiame sraute jau turėtų būti garso takelis Pasirinkite garso takelį išoriniams grotuvams Nežinomas - Šis apeinamasis sprendimas atlaisvina ir iš naujo nustato vaizdo kodekus, kai pasikeičia paviršius, užuot tiesiogiai nustatęs paviršių kodekui. Šis nustatymas jau naudojamas \"ExoPlayer\" kai kuriuose įrenginiuose, kuriuose buvo ši problema, šis nustatymas turi poveikį tik \"Android 6\" ir naujesniuose įrenginiuose. -\n -\nĮjungus šią parinktį gali būti išvengta atkūrimo klaidų, kai perjungiamas dabartinis vaizdo grotuvas arba pereinama į visą ekraną + Šis apeinamasis sprendimas atlaisvina ir iš naujo nustato vaizdo kodekus, kai pasikeičia paviršius, užuot tiesiogiai nustatęs paviršių kodekui. Šis nustatymas jau naudojamas \"ExoPlayer\" kai kuriuose įrenginiuose, kuriuose buvo ši problema, šis nustatymas turi poveikį tik \"Android 6\" ir naujesniuose įrenginiuose. \n \nĮjungus šią parinktį gali būti išvengta atkūrimo klaidų, kai perjungiamas dabartinis vaizdo grotuvas arba pereinama į visą ekraną dubliuotas Įjunkite šią parinktį, jei kyla dekoderio inicializavimo problemų, o nepavykus inicializuoti pagrindinių dekoderių, grįžtama prie žemesnio prioriteto dekoderių. Dėl to atkūrimo našumas gali būti prastesnis nei naudojant pirminius dekoderius aprašomasis @@ -768,9 +741,7 @@ Gyva transliacija Trumpi Rodyti daugiau - Visų nustatymų atstatymas į numatytasias reikšmes panaikins visus jūsų pasirinkimus ir iš naujo paleis programą. -\n -\nAr norite tęsti? + Visų nustatymų atstatymas į numatytasias reikšmes panaikins visus jūsų pasirinkimus ir iš naujo paleis programą. \n \nAr norite tęsti? Metaduomenų įkėlimas… Baneriai Prenumeratoriai @@ -781,8 +752,7 @@ Ne Pagrindinio skirtuko parinkiklio perkėlimas į apačią Medijos tuneliavimas buvo išjungtas pagal numatytuosius nustatymus jūsų prietaise, nes žinoma, kad jūsų prietaiso modelis jo nepalaiko. - \"NewPipe\" gali automatiškai patikrinti, ar yra naujų versijų, ir pranešti jums, kai jos pasirodys. -\nAr norite tai įjungti? + \"NewPipe\" gali automatiškai patikrinti, ar yra naujų versijų, ir pranešti jums, kai jos pasirodys. \nAr norite tai įjungti? Neįkelti paveikslėlių %1$s %2$s Redaguokite kiekvieną toliau pateiktą pranešimo veiksmą bakstelėdami jį. Pirmi trys veiksmai (groti/pauzė, ankstensnis ir paskesnis) yra sistemos numatytieji ir negali būti pakeisti. @@ -824,10 +794,10 @@ %s atsakymas %s atsakymai + %s atsakymų %s atsakymų - %1$s -\n%2$s + %1$s \n%2$s \? - %1$s: %2$s Grojaraščiai diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 8b1dd8531..5ee03164c 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -242,9 +242,7 @@ Lejupielādes Lejupielādes Tiešraide - Šis video ir vecuma ierobežots. -\n -\nIeslēdziet \"%1$s\" iestatījumos, ja vēlaties to redzēt. + Šis video ir vecuma ierobežots. \n \nIeslēdziet \"%1$s\" iestatījumos, ja vēlaties to redzēt. YouTube piedāvā \"ierobežotu režīmu\", kas slēpj potenciāli pieaugušo saturu Ieslēgt YouTube \"Ierobežoto režīmu\" Rādīt saturu, iespējams nepiemērotu bērniem, jo tam ir vecuma ierobežojums @@ -566,8 +564,7 @@ Izraisīt lietotnes nobrukšanu Rādīt kanāla informāciju Atrisināt - Šis video ir ierobežots ar vecumu. -\nŅemot vērā jauno YouTube politiku ar vecuma ierobežotiem videoklipiem, Newpipe nevar piekļūt šim videoklipam. + Šis video ir ierobežots ar vecumu. \nŅemot vērā jauno YouTube politiku ar vecuma ierobežotiem videoklipiem, Newpipe nevar piekļūt šim videoklipam. Nakts režīma motīvs Izslēgts Ieslēgts @@ -704,8 +701,7 @@ Sīkattēli Kārtot NewPipe pati var veikt jaunas versijas pārbaudi laiku pa laikam un informēt jūs, kad tā ir pieejama.\nVai tiešām vēlaties ieslēgt šo funkciju? - Netika atrasts atbilstošs failu pārvaldnieks šai darbībai. -\nLūdzu instalējiet failu pārvaldnieku vai pamēģiniet atspējot \'%s\' lejuplādēšanas iestatījumos + Netika atrasts atbilstošs failu pārvaldnieks šai darbībai. \nLūdzu instalējiet failu pārvaldnieku vai pamēģiniet atspējot \'%s\' lejuplādēšanas iestatījumos oriģinālais Nepieciešams tīkla savienojums Atiestata visus iestatījumus uz to sākotnējām vērtībām @@ -729,8 +725,7 @@ Kanāli Atskaņošanas saraksti Albumi - Netika atrasts atbilstošs failu pārvaldnieks šai darbībai. -\nLūdzu lejuplādējiet ar krātuves pieejas struktūras saderīgu failu pārvaldnieku + Netika atrasts atbilstošs failu pārvaldnieks šai darbībai. \nLūdzu lejuplādējiet ar krātuves pieejas struktūras saderīgu failu pārvaldnieku Nav tiešraides Rādīt kļūdas paziņojumu Piegādāt kanālu cilnes @@ -740,8 +735,7 @@ ExoPlayer iestatījumi Kanālu cilnes \? - %1$s -\n%2$s + %1$s \n%2$s Paziņot kanāla jaunumus Apakškanālu avatāri Augšuplādētāju avatāri @@ -818,8 +812,8 @@ Konts slēgts\n\n%1$s norāda, ka iemesls kādēļ: %2$s Atskaņošanas laikā no servera saņemta HTTP 403 kļūda, ko, iespējams, izraisīja straumēšanas URL derīguma beigu termiņš vai IP aizliegums Atskaņošanas laikā no servera saņemta HTTP %1$s kļūda - Atskaņošanas laikā no servera saņemta HTTP 403 kļūda, ko, iespējams, izraisīja IP aizliegums vai straumēšanas URL atšifrēšanas (deobfuskācijas) problēmas - 2025. gada augustā Google paziņoja, ka, sākot ar 2026. gada septembri, lai uzstādītu lietotnes, būs nepieciešama izstrādātāja verifikācija visām Android lietotnēm sertificētajās ierīcēs, tostarp arī tām, kuras uzstādītas ārpus Play veikala. Tā kā NewPipe izstrādātāji nepiekrīt un negrib pieņemt šo prasību, pēc šī datuma NewPipe vairs nedarbosies sertificētajās Android ierīcēs. + Atskaņošanas laikā no servera saņemta HTTP 403 kļūda, ko, iespējams, izraisīja IP aizliegums vai straumēšanas URL atšifrēšanas (deobfuskācijas) problēmas + 2025. gada augustā Google paziņoja, ka, sākot ar 2026. gada septembri, lai uzstādītu lietotnes, būs nepieciešama izstrādātāja verifikācija visām Android lietotnēm sertificētajās ierīcēs, tostarp arī tām, kuras uzstādītas ārpus Play veikala. Tā kā NewPipe izstrādātāji nepiekrīt un negrib pieņemt šo prasību, pēc šī datuma NewPipe vairs nedarbosies sertificētajās Android ierīcēs. Detalizētāka informācija Risinājums SoundCloud likvidēja oriģinālos Top 50 topus. Atbilstošā cilne noņemta no jūsu galvenās lapas. diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 8931cef3d..028dcb1be 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -2,7 +2,7 @@ Притиснете на лупата за да започнете. Објавено на %1$s - Не е пронајден плеер за стримови. Сакате да инсталирате VLC\? + Не е пронајден плеер за стримови. Сакате да инсталирате VLC? Не е пронајден плеер за стримови (можеш да инсталираш VLC) Инсталирај Откажи @@ -41,7 +41,7 @@ Прикажи повисоки резолуции Само одредени уреди поддржуваат 2К/4К видеа Пушти на Kodi - Апликацијата Kore не е најдена. Сакате да ја инсталирате\? + Апликацијата Kore не е најдена. Сакате да ја инсталирате? Прикажи ја „Пушти со Kodi“ опцијата Прикажи опција да се пушти видео со Kodi media center Звук @@ -177,8 +177,7 @@ Почекајте… Копирано во привремена меморија Ве молиме, определете папка за преземања подоцна во поставките - Оваа привилегија е потребна за -\nотворање во подпрозорче + Оваа привилегија е потребна за \nотворање во подпрозорче reCAPTCHA Предизвик Потребен е reCAPTCHA предизвик Превземања @@ -265,21 +264,10 @@ Претходно изнесување Неуспешно внесување членства Неуспешно изнесување членства - Внеси YouTube членства, преку симнување на извозен фајл: -\n -\n1. Оди на оваа врска: %1$s -\n2. Пријави се на твојот профил -\n3. Ќе започне превземање (тој фајл ти треба) - Внеси SoundCloud членства, преку внесување URL или ID на профилот: -\n -\n1. Вклучете „десктоп режим“ во вашиот пребарувач (страната не е достапна за мобилни уреди) -\n2. Одете на оваа врска: %1$s -\n3. Пријавете се на вашиот профил -\n4. Копирајте го URL-то на кое бевте пренасочени (тоа е URL-то на вашиот профил). + Внеси YouTube членства, преку симнување на извозен фајл: \n \n1. Оди на оваа врска: %1$s \n2. Пријави се на твојот профил \n3. Ќе започне превземање (тој фајл ти треба) + Внеси SoundCloud членства, преку внесување URL или ID на профилот: \n \n1. Вклучете „десктоп режим“ во вашиот пребарувач (страната не е достапна за мобилни уреди) \n2. Одете на оваа врска: %1$s \n3. Пријавете се на вашиот профил \n4. Копирајте го URL-то на кое бевте пренасочени (тоа е URL-то на вашиот профил). korisnickoime, soundcloud.com/korisnickoime - Треба да знаеш дека оваа операција троши многу интернет. -\n -\nСакаш да продолжиш? + Треба да знаеш дека оваа операција троши многу интернет. \n \nСакаш да продолжиш? Контрола на брзината на траката Темпо Тон @@ -301,11 +289,9 @@ Преводи Смени ја големината и стилот на преводот. Потребен е рестарт за промена NewPipe - политика за приватност - Проектот NewPipe сериозно ја сфаќа вашата приватност. Затоа апликацијата не собира ваши податоци без ваша дозвола. -\nПолитиката за приватност на NewPipe детално објаснува кои податоци се зачувани и пратени кога праќате извештај за грешка во апликацијата. + Проектот NewPipe сериозно ја сфаќа вашата приватност. Затоа апликацијата не собира ваши податоци без ваша дозвола. \nПолитиката за приватност на NewPipe детално објаснува кои податоци се зачувани и пратени кога праќате извештај за грешка во апликацијата. Прочитај ја политиката за приватност - За да постапуваме соодветно со регулацијата за заштита на податоци (GDPR) на ЕУ, вараме да обрнете внимание на политиката за приватност на NewPipe. -\nВе молиме прочитајте ја внимателно. Мора да ја прифатите за да ни го испратите извештајот за грешка во апликацијата. + За да постапуваме соодветно со регулацијата за заштита на податоци (GDPR) на ЕУ, вараме да обрнете внимание на политиката за приватност на NewPipe. \nВе молиме прочитајте ја внимателно. Мора да ја прифатите за да ни го испратите извештајот за грешка во апликацијата. Прифати Отфрли Неограничено @@ -385,8 +371,7 @@ Паузирај преземања Ќе бидете прашани каде да го зачувате секое преземање.\nАктивирајте го инструментот за избор на системска папка (SAF), ако сакате да преземате на SD картичка Користи го инструментот за избор на системска папка (SAF) - Рамката за пристап до складирање овозможува преземања во надворешна SD-картичка. -\nЗабелешка: некои уреди не се поддржани. + Рамката за пристап до складирање овозможува преземања во надворешна SD-картичка. \nЗабелешка: некои уреди не се поддржани. Исклучете за да ги скриете коментарите Позиции во листите Покажете ги индикаторите за позиција за репродукција во листите diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index 013802176..8c50e3d3a 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -7,24 +7,10 @@ പിച്ച് ടെംപോ പ്ലേബാക്ക് വേഗത നിയന്ത്രണങ്ങൾ - ഈ പ്രവർത്തനം നെറ്റ്‌വർക്ക് ചെലവേറിയതായിരിക്കുമെന്ന് ഓർമ്മിക്കുക. -\n -\nനിങ്ങൾ തുടരാൻ ആഗ്രഹിക്കുന്നുവോ\? + ഈ പ്രവർത്തനം നെറ്റ്‌വർക്ക് ചെലവേറിയതായിരിക്കുമെന്ന് ഓർമ്മിക്കുക. \n \nനിങ്ങൾ തുടരാൻ ആഗ്രഹിക്കുന്നുവോ? താങ്കളുടെ ID: yourID, soundcloud.com/yourid - URL അല്ലെങ്കിൽ നിങ്ങളുടെ ഐഡി ടൈപ്പുചെയ്തുകൊണ്ട് ഒരു സൗണ്ട്ക്ലൗഡ് പ്രൊഫൈൽ ഇമ്പോർട്ടുചെയ്യുക: -\n -\n1. ഒരു വെബ് ബ്രൗസറിൽ \"ഡെസ്ക്ടോപ്പ് മോഡ്\" പ്രാപ്തമാക്കുക (മൊബൈൽ ഉപകരണങ്ങൾക്കായി സൈറ്റ് ലഭ്യമല്ല) -\n2. ഈ URL- ലേക്ക് പോകുക: %1$s -\n3. ആവശ്യപ്പെടുമ്പോൾ ലോഗിൻ ചെയ്യുക -\n4. നിങ്ങളെ റീഡയറക്‌ടുചെയ്‌ത പ്രൊഫൈൽ URL പകർത്തുക. - ഗൂഗിൾ ടേക്ക് ഔട്ടിൽ നിന്ന് യൂട്യൂബ് സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ ഇമ്പോർട്ടുചെയ്യുക: -\n -\n1. ഈ URL ലേക്ക് പോകുക: %1$s -\n2. ആവശ്യപ്പെടുമ്പോൾ ലോഗിൻ ചെയ്യുക -\n3. \"All data included\" ക്ലിക്കുചെയ്യുക, തുടർന്ന് \"Deselect all\" എന്നതിൽ ക്ലിക്കുചെയ്യുക, തുടർന്ന് \"subscriptions\" മാത്രം തിരഞ്ഞെടുത്ത് \"OK\" ക്ലിക്കുചെയ്യുക. -\n4. \"Next Export\" ക്ലിക്കുചെയ്യുക, തുടർന്ന് \"Create Export\" ക്ലിക്കുചെയ്യുക -\n5. \"Download\" ബട്ടൺ പ്രത്യക്ഷപ്പെട്ടതിനുശേഷം അതിൽ ക്ലിക്കുചെയ്യുക -\n6. ഡൗൺ‌ലോഡുചെയ്‌ത ടേക്ക്ഔട്ട് സിപ്പിൽ നിന്ന് .json ഫയൽ എക്‌സ്‌ട്രാക്റ്റുചെയ്യുക (സാധാരണയായി \"YouTube, YouTube Music / subscription / subscription.json\" ന് കീഴിൽ) അത് ഇവിടെ ഇറക്കുമതി ചെയ്യുക. + URL അല്ലെങ്കിൽ നിങ്ങളുടെ ഐഡി ടൈപ്പുചെയ്തുകൊണ്ട് ഒരു സൗണ്ട്ക്ലൗഡ് പ്രൊഫൈൽ ഇമ്പോർട്ടുചെയ്യുക: \n \n1. ഒരു വെബ് ബ്രൗസറിൽ \"ഡെസ്ക്ടോപ്പ് മോഡ്\" പ്രാപ്തമാക്കുക (മൊബൈൽ ഉപകരണങ്ങൾക്കായി സൈറ്റ് ലഭ്യമല്ല) \n2. ഈ URL- ലേക്ക് പോകുക: %1$s \n3. ആവശ്യപ്പെടുമ്പോൾ ലോഗിൻ ചെയ്യുക \n4. നിങ്ങളെ റീഡയറക്‌ടുചെയ്‌ത പ്രൊഫൈൽ URL പകർത്തുക. + ഗൂഗിൾ ടേക്ക് ഔട്ടിൽ നിന്ന് യൂട്യൂബ് സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ ഇമ്പോർട്ടുചെയ്യുക: \n \n1. ഈ URL ലേക്ക് പോകുക: %1$s \n2. ആവശ്യപ്പെടുമ്പോൾ ലോഗിൻ ചെയ്യുക \n3. \"All data included\" ക്ലിക്കുചെയ്യുക, തുടർന്ന് \"Deselect all\" എന്നതിൽ ക്ലിക്കുചെയ്യുക, തുടർന്ന് \"subscriptions\" മാത്രം തിരഞ്ഞെടുത്ത് \"OK\" ക്ലിക്കുചെയ്യുക. \n4. \"Next Export\" ക്ലിക്കുചെയ്യുക, തുടർന്ന് \"Create Export\" ക്ലിക്കുചെയ്യുക \n5. \"Download\" ബട്ടൺ പ്രത്യക്ഷപ്പെട്ടതിനുശേഷം അതിൽ ക്ലിക്കുചെയ്യുക \n6. ഡൗൺ‌ലോഡുചെയ്‌ത ടേക്ക്ഔട്ട് സിപ്പിൽ നിന്ന് .json ഫയൽ എക്‌സ്‌ട്രാക്റ്റുചെയ്യുക (സാധാരണയായി \"YouTube, YouTube Music / subscription / subscription.json\" ന് കീഴിൽ) അത് ഇവിടെ ഇറക്കുമതി ചെയ്യുക. സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ എക്‌സ്‌പോർട്ടുചെയ്യാനായില്ല സബ്‌സ്‌ക്രിപ്‌ഷനുകൾ ഇറക്കുമതി ചെയ്യാൻ കഴിഞ്ഞില്ല മുമ്പത്തെ എക്സ്പോർട്ട് @@ -48,7 +34,7 @@ പ്ലേലിസ്റ്റ് ലഘുചിത്രം മാറ്റി. പ്ലേലിസ്റ്റ് ചെയ്തു പ്ലേലിസ്റ്റ് സൃഷ്‌ടിച്ചു - ഈ പ്ലേലിസ്റ്റ് ഇല്ലാതാക്കണോ\? + ഈ പ്ലേലിസ്റ്റ് ഇല്ലാതാക്കണോ? ബുക്ക്മാർക്ക് നീക്കംചെയ്യുക പ്ലേലിസ്റ്റ് ബുക്ക്മാർക്ക് ചെയ്യുക പ്ലേലിസ്റ്റ് ലഘുചിത്രമായി സജ്ജമാക്കുക @@ -82,7 +68,7 @@ മികച്ച 50 ട്രെൻഡിങ്ങ് കമെന്റുകൾ ലോഡുചെയ്യാനായില്ല - ക്രമീകരണങ്ങളും ഇമ്പോർട്ടുചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ\? + ക്രമീകരണങ്ങളും ഇമ്പോർട്ടുചെയ്യാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ? ഇത് നിങ്ങളുടെ നിലവിലെ സജ്ജീകരണത്തെ അസാധുവാക്കും. മുന്നറിയിപ്പ്: എല്ലാ ഫയലുകളും ഇറക്കുമതി ചെയ്യാൻ കഴിഞ്ഞില്ല. സാധുവായ ZIP ഫയലില്ല @@ -99,15 +85,14 @@ പ്രധാന പേജ് ഉള്ളടക്കം ഏറ്റവും കൂടുതൽ തവണ പ്ലേ ചെയ്തത് അവസാനം പ്ലേ ചെയ്തത് - സെർച്ച് ചരിത്രത്തിൽനിന്ന് ഈ item നീക്കം ചെയ്യട്ടെയോ\? + സെർച്ച് ചരിത്രത്തിൽനിന്ന് ഈ item നീക്കം ചെയ്യട്ടെയോ? ചരിത്രം ചരിത്രം ലൈസൻസ് വായിക്കൂ കോപ്പി‌ലെഫ്റ്റ് ലിബ്രെ സോഫ്റ്റ്വെയറാണ് ന്യൂ‌പൈപ്പ്: നിങ്ങൾക്ക് അത് ഉപയോഗിക്കാനും പഠിക്കാനും പങ്കിടാനും ഇഷ്ടാനുസരണം മെച്ചപ്പെടുത്താനും കഴിയും. സ്വതന്ത്ര സോഫ്റ്റ്‌വെയർ ഫൗണ്ടേഷൻ പ്രസിദ്ധീകരിച്ച ഗ്നു ജനറൽ പബ്ലിക് ലൈസൻസിന്റെ നിബന്ധനകൾ പ്രകാരം, ലൈസൻസിന്റെ മൂന്നാം പതിപ്പ് അല്ലെങ്കിൽ (നിങ്ങളുടെ ഓപ്ഷനിൽ) പിന്നീടുള്ള ഏതെങ്കിലും പതിപ്പ് പ്രകാരം നിങ്ങൾക്ക് ഇത് പുനർവിതരണം ചെയ്യാനും / അല്ലെങ്കിൽ പരിഷ്ക്കരിക്കാനും കഴിയും. ന്യൂപൈപ്പിന്റെ ലൈസൻസ് സ്വകാര്യതാനയം വായിക്കൂ - ദ ന്യൂപൈപ്പ് പ്രോജക്ട് നിങ്ങളുടെ സ്വകാര്യതയെ മാനിക്കുന്നു. അതുകൊണ്ടുതന്നെ, നിങ്ങളുടെ ഒരു ഡേറ്റയും ഞങ്ങൾ ശേഖരിക്കുന്നില്ല. -\nനിങ്ങൾ ഒരു ക്രാഷ് റിപ്പോർട്ട് അയക്കുമ്പോൾ അതിൻപ്രകാരം എന്ത് ഡാറ്റ ആണ് ശേഖരിക്കുന്നെന്നും സൂക്ഷിക്കുന്നതെന്നുമൊക്കെ ന്യൂപൈപ്പിന്റെ സ്വകാര്യതാനയം വ്യകതമാക്കുന്നതാണ്. + ദ ന്യൂപൈപ്പ് പ്രോജക്ട് നിങ്ങളുടെ സ്വകാര്യതയെ മാനിക്കുന്നു. അതുകൊണ്ടുതന്നെ, നിങ്ങളുടെ ഒരു ഡേറ്റയും ഞങ്ങൾ ശേഖരിക്കുന്നില്ല. \nനിങ്ങൾ ഒരു ക്രാഷ് റിപ്പോർട്ട് അയക്കുമ്പോൾ അതിൻപ്രകാരം എന്ത് ഡാറ്റ ആണ് ശേഖരിക്കുന്നെന്നും സൂക്ഷിക്കുന്നതെന്നുമൊക്കെ ന്യൂപൈപ്പിന്റെ സ്വകാര്യതാനയം വ്യകതമാക്കുന്നതാണ്. ന്യൂപൈപ്പിന്റെ സ്വകാര്യതാനയം കൂടുതൽ വിവരങ്ങൾക്കും വാർത്തകൾക്കും ന്യൂപൈപ്പിന്റെ വെബ്സൈറ്റ് സന്ദർശിക്കുക. വെബ്സൈറ്റ് @@ -135,8 +120,7 @@ തീർന്നാൽ \"Done\" അമർത്തുക reCAPTCHA ചാലഞ്ച് ഒരെണ്ണം നീക്കംചെയ്തു. - പോപപ് മോഡിന്ഈ -\nഅനുമതി ആവിശ്യമാണ് + പോപപ് മോഡിന്ഈ \nഅനുമതി ആവിശ്യമാണ് പിന്നീട് ക്രമീകരണങ്ങളിൽ ഒരു ഡൗൺലോഡ് ഫോൾഡർ തിരഞ്ഞെടുക്കണം ക്ലിപ്ബോർഡിലേക്ക് പകർത്തി കാത്തിരിക്കു… @@ -202,7 +186,7 @@ ഇമെയിൽ വഴി ഈ പിശക് റിപ്പോർട്ട് ചെയ്യുക ക്ഷമിക്കണം, അത് സംഭവിക്കാൻ പാടില്ലായിരുന്നു. മറ്റ് ആപ്പുകളുടെ മുകളിൽ വരാനുളള അനുമതി നൽകുക - എല്ലാം പഴയപടി ആക്കട്ടെയോ\? + എല്ലാം പഴയപടി ആക്കട്ടെയോ? പഴയപടി എല്ലാം പുനസ്ഥാപിക്കുക സേവ് ആയ ടാബുകൾ വായിക്കാൻ സാധിക്കുന്നില്ല, സ്ഥിര ടാബുകൾ ഉപയോഗെടുത്തുക ഡൗൺലോഡ് ചെയ്യാൻ സ്‌ട്രീമുകൾ ലഭ്യമല്ല @@ -224,19 +208,19 @@ വെബ്സൈറ്റ് വ്യാപരിക്കാനായില്ല ലഘുചിത്രങ്ങൾ ലോഡ് ചെയ്യാനായില്ല നെറ്റ്‌വർക്ക് പിശക് - എസ്ഡി കാർഡിലേക്ക്‌ ഡൗൺലോഡ് അസാധ്യം. ഡൗൺലോഡ് ഫോൾഡർ മാറ്റട്ടെ\? + എസ്ഡി കാർഡിലേക്ക്‌ ഡൗൺലോഡ് അസാധ്യം. ഡൗൺലോഡ് ഫോൾഡർ മാറ്റട്ടെ? എസ്ഡി സൗകര്യം ലഭ്യമല്ല പിശക് സെർച്ച് ചരിത്രം നീക്കം ചെയ്തു - സെർച്ച് ചരിത്രം നീക്കം ചെയ്യട്ടെയോ\? + സെർച്ച് ചരിത്രം നീക്കം ചെയ്യട്ടെയോ? സെർച്ച് കീവേർഡുകളെ നീക്കം ചെയ്യും സെർച്ച് ചരിത്രം നീക്കം ചെയ്യുക പ്ലേബാക്ക് സ്ഥാനങ്ങൾ നീക്കംചെയ്തു - പ്ലേബാക്ക് സ്ഥാനങ്ങളെ നീക്കം ചെയ്യട്ടെയോ\? + പ്ലേബാക്ക് സ്ഥാനങ്ങളെ നീക്കം ചെയ്യട്ടെയോ? എല്ലാ പ്ലേബാക്ക് സ്ഥാനങ്ങളെയും നീക്കംചെയ്യും പ്ലേബാക്ക് സ്ഥാനങ്ങൾ നീക്കംചെയ്യുക കാഴ്ച ചരിത്രം നീക്കംചെയ്തു - മൊത്തം കാഴ്ച ചരിത്രം നീക്കട്ടെയോ\? + മൊത്തം കാഴ്ച ചരിത്രം നീക്കട്ടെയോ? കണ്ട സ്ട്രീമുകളുടെയും പ്ലേബാക്ക് സ്ഥാനങ്ങളുടെയും ചരിത്രം നീക്കം ചെയ്യും കാഴ്ച ചരിത്രം നീക്കുക ചരിത്രം, സബ്സ്ക്രിബ്ഷനുകൾ, പ്ലേലിസ്റ്റുകൾ, സജ്ജീകരണങ്ങൾ എന്നിവ ഇറക്കുമതി ചെയ്യുക @@ -244,8 +228,7 @@ ഡാറ്റാബേസ് കയറ്റുമതി ചെയ്യുക ഡാറ്റാബേസ് അവതരിപ്പിക്കുക അംഗീകരിക്കുക - യൂറോപ്യൻ ജനറൽ ഡാറ്റാ പ്രൊട്ടക്ഷൻ റെഗുലേഷൻ (ജിഡിപിആർ) അനുസരിക്കുന്നതിന്, ന്യൂപൈപ്പിന്റെ സ്വകാര്യതാ നയത്തിലേക്ക് ഞങ്ങൾ നിങ്ങളുടെ ശ്രദ്ധ ആകർഷിക്കുന്നു. ദയവായി ഇത് ശ്രദ്ധാപൂർവ്വം വായിക്കുക. -\nബഗ് റിപ്പോർട്ട് ഞങ്ങൾക്ക് അയയ്ക്കാൻ നിങ്ങൾ അത് അംഗീകരിക്കണം. + യൂറോപ്യൻ ജനറൽ ഡാറ്റാ പ്രൊട്ടക്ഷൻ റെഗുലേഷൻ (ജിഡിപിആർ) അനുസരിക്കുന്നതിന്, ന്യൂപൈപ്പിന്റെ സ്വകാര്യതാ നയത്തിലേക്ക് ഞങ്ങൾ നിങ്ങളുടെ ശ്രദ്ധ ആകർഷിക്കുന്നു. ദയവായി ഇത് ശ്രദ്ധാപൂർവ്വം വായിക്കുക. \nബഗ് റിപ്പോർട്ട് ഞങ്ങൾക്ക് അയയ്ക്കാൻ നിങ്ങൾ അത് അംഗീകരിക്കണം. പ്രധാനപ്പെട്ടതിലേക്ക് മാറുക പോപ്പപ്പിലേക്ക് മാറുക ബാക്ക്ഗ്രൗണ്ടിലേക്ക്‌ മാറുക @@ -277,9 +260,7 @@ ഡൗൺലോഡുകൾ ഡൗൺലോഡുകൾ ലൈവ് - ഈ വീഡിയോ പ്രായപരിമിതി ഉള്ളതാണ്. -\n -\nനിങ്ങൾക്ക് ഇത് കാണണമെങ്കിൽ ക്രമീകരണങ്ങളിൽ \"%1$s\" ഓണാക്കുക. + ഈ വീഡിയോ പ്രായപരിമിതി ഉള്ളതാണ്. \n \nനിങ്ങൾക്ക് ഇത് കാണണമെങ്കിൽ ക്രമീകരണങ്ങളിൽ \"%1$s\" ഓണാക്കുക. പ്രായ നിയന്ത്രിത ഉള്ളടക്കം കാണിക്കുക കന്റെന്റ് പോപ്പപ്പ് മോഡിൽ പ്ലേ ചെയ്യുന്നു @@ -342,7 +323,7 @@ ഓഡിയോ Kodi media center വഴി വീഡിയോ പ്ലേ ചെയ്യാനുള്ള ഓപ്ഷൻ കാണിക്കുക \"Kodi ഉപയോഗിച്ച് പ്ലേ ചെയ്യുക\" ഓപ്ഷൻ കാണിക്കുക - Kore ഇൻസ്റ്റാൾ ചെയ്യട്ടെയോ\? + Kore ഇൻസ്റ്റാൾ ചെയ്യട്ടെയോ? Kodi ഉപയോഗിച്ച് പ്ലേ ചെയ്യുക ചില ഉപകരണങ്ങളിൽ മാത്രമേ 2K/4K വീഡിയോകൾ കാണാൻ സാധിക്കുകയുള്ളൂ ഉയർന്ന റിസല്യൂഷനുകൾ കാണിക്കുക @@ -371,7 +352,7 @@ ചില റിസല്യൂഷനുകളിൽ ശബ്ദം കേൾക്കില്ല പുറമെയുള്ള വീഡിയോ പ്ലേയർ ഉപയോഗിക്കുക പങ്കുവയ്ക്കൂ - തങ്കൾ ഉദ്ദേശിച്ചത് : \"%1$s\" ആണോ\? + തങ്കൾ ഉദ്ദേശിച്ചത് : \"%1$s\" ആണോ? ക്രമീകരണങ്ങൾ തിരയുക സ്ട്രീം ഫൈൽ ഡൗൺലോഡ് ചെയ്യുക @@ -382,23 +363,11 @@ റദ്ദാക്കുക ഇൻസ്റ്റാൾ സ്ട്രീം പ്ലയർ കണ്ടെത്താനായില്ല (VLC ഇൻസ്റ്റാൾ ചെയ്താൽ പ്ലേ ചെയ്യാനാകും). - സ്ട്രീം പ്ലയർ കണ്ടെത്താനായില്ല. VLC ഇൻസ്റ്റാൾ ചെയ്യട്ടെ\? + സ്ട്രീം പ്ലയർ കണ്ടെത്താനായില്ല. VLC ഇൻസ്റ്റാൾ ചെയ്യട്ടെ? %1$s - ന് പ്രസിദ്ധീകരിച്ചു തുടങ്ങാൻ \"തിരയൽ\" അമർത്തുക. - ഈ ഉള്ളടക്കത്തെ ഇതുവരെ ന്യൂ‌പൈപ്പ് പിന്തുണയ്‌ക്കുന്നില്ല. -\n -\nഭാവിയിലെ ഒരു പതിപ്പിൽ ഇത് പിന്തുണയ്‌ക്കുമെന്ന് പ്രതീക്ഷിക്കുന്നു. - ഫീഡ് ലോഡിംഗ് വളരെ മന്ദഗതിയിലാണെന്ന് നിങ്ങൾ കരുതുന്നുണ്ടോ\? അങ്ങനെയാണെങ്കിൽ, വേഗത്തിലുള്ള ലോഡിംഗ് പ്രവർത്തനക്ഷമമാക്കാൻ ശ്രമിക്കുക (നിങ്ങൾക്ക് ഇത് ക്രമീകരണങ്ങളിലോ ചുവടെയുള്ള ബട്ടൺ അമർത്തിയോ മാറ്റാം). -\n -\nന്യൂപൈപ്പ് രണ്ട് ഫീഡ് ലോഡിംഗ് തന്ത്രങ്ങൾ വാഗ്ദാനം ചെയ്യുന്നു: -\nSlow സബ്‌സ്‌ക്രിപ്‌ഷൻ ചാനൽ മുഴുവനും ലഭ്യമാക്കുന്നു, അത് മന്ദഗതിയിലുള്ളതും എന്നാൽ പൂർണ്ണവുമാണ്. -\nA ഒരു സമർപ്പിത സേവന എൻ‌ഡ്‌പോയിൻറ് ഉപയോഗിക്കുന്നു, അത് വേഗതയേറിയതും എന്നാൽ സാധാരണയായി പൂർത്തിയാകാത്തതുമാണ്. -\n -\nരണ്ടും തമ്മിലുള്ള വ്യത്യാസം, വേഗതയേറിയവയ്ക്ക് സാധാരണയായി ഇനത്തിന്റെ ദൈർഘ്യം അല്ലെങ്കിൽ തരം (തത്സമയ വീഡിയോകളും സാധാരണ വീഡിയോകളും തമ്മിൽ വേർതിരിച്ചറിയാൻ കഴിയില്ല) പോലുള്ള ചില വിവരങ്ങൾ ഇല്ല എന്നതാണ്, മാത്രമല്ല ഇത് കുറച്ച് ഇനങ്ങൾ തിരികെ നൽകിയേക്കാം. -\n -\nRSS ഫീഡിനൊപ്പം ഈ വേഗത്തിലുള്ള രീതി വാഗ്ദാനം ചെയ്യുന്ന ഒരു സേവനത്തിന്റെ ഉദാഹരണമാണ് YouTube. -\n -\nഅതിനാൽ ചോയ്‌സ് നിങ്ങൾ ഇഷ്ടപ്പെടുന്നതിലേക്ക് തിളച്ചുമറിയുന്നു: വേഗത അല്ലെങ്കിൽ കൃത്യമായ വിവരങ്ങൾ. + ഈ ഉള്ളടക്കത്തെ ഇതുവരെ ന്യൂ‌പൈപ്പ് പിന്തുണയ്‌ക്കുന്നില്ല. \n \nഭാവിയിലെ ഒരു പതിപ്പിൽ ഇത് പിന്തുണയ്‌ക്കുമെന്ന് പ്രതീക്ഷിക്കുന്നു. + ഫീഡ് ലോഡിംഗ് വളരെ മന്ദഗതിയിലാണെന്ന് നിങ്ങൾ കരുതുന്നുണ്ടോ? അങ്ങനെയാണെങ്കിൽ, വേഗത്തിലുള്ള ലോഡിംഗ് പ്രവർത്തനക്ഷമമാക്കാൻ ശ്രമിക്കുക (നിങ്ങൾക്ക് ഇത് ക്രമീകരണങ്ങളിലോ ചുവടെയുള്ള ബട്ടൺ അമർത്തിയോ മാറ്റാം). \n \nന്യൂപൈപ്പ് രണ്ട് ഫീഡ് ലോഡിംഗ് തന്ത്രങ്ങൾ വാഗ്ദാനം ചെയ്യുന്നു: \nSlow സബ്‌സ്‌ക്രിപ്‌ഷൻ ചാനൽ മുഴുവനും ലഭ്യമാക്കുന്നു, അത് മന്ദഗതിയിലുള്ളതും എന്നാൽ പൂർണ്ണവുമാണ്. \nA ഒരു സമർപ്പിത സേവന എൻ‌ഡ്‌പോയിൻറ് ഉപയോഗിക്കുന്നു, അത് വേഗതയേറിയതും എന്നാൽ സാധാരണയായി പൂർത്തിയാകാത്തതുമാണ്. \n \nരണ്ടും തമ്മിലുള്ള വ്യത്യാസം, വേഗതയേറിയവയ്ക്ക് സാധാരണയായി ഇനത്തിന്റെ ദൈർഘ്യം അല്ലെങ്കിൽ തരം (തത്സമയ വീഡിയോകളും സാധാരണ വീഡിയോകളും തമ്മിൽ വേർതിരിച്ചറിയാൻ കഴിയില്ല) പോലുള്ള ചില വിവരങ്ങൾ ഇല്ല എന്നതാണ്, മാത്രമല്ല ഇത് കുറച്ച് ഇനങ്ങൾ തിരികെ നൽകിയേക്കാം. \n \nRSS ഫീഡിനൊപ്പം ഈ വേഗത്തിലുള്ള രീതി വാഗ്ദാനം ചെയ്യുന്ന ഒരു സേവനത്തിന്റെ ഉദാഹരണമാണ് YouTube. \n \nഅതിനാൽ ചോയ്‌സ് നിങ്ങൾ ഇഷ്ടപ്പെടുന്നതിലേക്ക് തിളച്ചുമറിയുന്നു: വേഗത അല്ലെങ്കിൽ കൃത്യമായ വിവരങ്ങൾ. ഫാസ്റ്റ് മോഡ് അപ്രാപ്തമാക്കുക ക്യൂ വീണ്ടെടുക്കുന്നു @@ -430,7 +399,7 @@ ഫീഡ് അപ്‌ഡേറ്റ് പരിധി ഫീഡ് പുതിയത് - ഈ ഗ്രൂപ്പ് ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ\? + ഈ ഗ്രൂപ്പ് ഇല്ലാതാക്കാൻ നിങ്ങൾ ആഗ്രഹിക്കുന്നുണ്ടോ? ശൂന്യമായ ഗ്രൂപ്പ് പേര് %d തിരഞ്ഞെടുത്തു @@ -470,8 +439,7 @@ ഒരു സ്ഥിതി തിരഞ്ഞെടുക്കുക സ്റ്റോറേജ് ആക്സസ് ഫ്രെയിംവർക്ക്\' ഒരു ബാഹ്യ SD കാർഡിലേക്ക് ഡൗൺലോഡുകൾ അനുവദിക്കുന്നു സിസ്റ്റം ഫോൾഡർ പിക്കർ (SAF) ഉപയോഗിക്കുക - ഓരോ ഡൗൺ‌ലോഡും എവിടെ സംരക്ഷിക്കണമെന്ന് നിങ്ങളോട് ചോദിക്കും. -\nതാങ്കൾക്ക് എക്സ്റ്റർനെൽ SD കാർഡിലേക് ഡൌൺലോഡ് ചെയ്യണം എന്ന് ഉണ്ടെങ്കിൽ സിസ്റ്റം ഫോൾഡർ പിക്കർ (SAF) സജ്ജമാക്കുക + ഓരോ ഡൗൺ‌ലോഡും എവിടെ സംരക്ഷിക്കണമെന്ന് നിങ്ങളോട് ചോദിക്കും. \nതാങ്കൾക്ക് എക്സ്റ്റർനെൽ SD കാർഡിലേക് ഡൌൺലോഡ് ചെയ്യണം എന്ന് ഉണ്ടെങ്കിൽ സിസ്റ്റം ഫോൾഡർ പിക്കർ (SAF) സജ്ജമാക്കുക എവിടെ നിന്ന് ഡൗൺലോഡ് ചെയ്യണമെന്ന് ചോദിക്കുക ഡൗൺലോഡുകൾ താൽക്കാലികമായി നിർത്തുക ഡൗൺലോഡുകൾ ആരംഭിക്കുക @@ -484,7 +452,7 @@ പരമാവധി വീണ്ടും ശ്രമിക്കുന്നു നിർത്തുക ഡൗൺലോഡ് ചെയ്ത ഫയലുകൾ ഇല്ലാതാക്കുക - നിങ്ങളുടെ ഡൗൺലോഡ് ചരിത്രം മായ്‌ക്കണോ ഡൗൺലോഡ് ചെയ്ത എല്ലാ ഫയലുകളും ഇല്ലാതാക്കണോ\? + നിങ്ങളുടെ ഡൗൺലോഡ് ചരിത്രം മായ്‌ക്കണോ ഡൗൺലോഡ് ചെയ്ത എല്ലാ ഫയലുകളും ഇല്ലാതാക്കണോ? ഡൗൺലോഡ് ചരിത്രം മായ്‌ക്കുക ഈ ഡൗൺലോഡ് വീണ്ടെടുക്കാനാവില്ല കണക്ഷൻ കാലഹരണപ്പെട്ടു @@ -568,11 +536,10 @@ ReCAPTCHA കുക്കികൾ മായ്‌ക്കുക വീഡിയോ ഹാഷിംഗ് പുരോഗതിക്കായുള്ള അറിയിപ്പുകൾ വീഡിയോ ഹാഷ് അറിയിപ്പ് - ഈ വീഡിയോ പ്രായപരിധി നിർണ്ണയിച്ചിരിക്കുന്നു. -\nപ്രായ-നിയന്ത്രിത വീഡിയോകളുള്ള പുതിയ യൂട്യൂബ് നയങ്ങൾ കാരണം, ന്യൂപൈപ്പിന് അതിന്റെ വീഡിയോ സ്ട്രീമുകളിലൊന്നും ആക്സസ് ചെയ്യാൻ കഴിയില്ല, അതിനാൽ ഇത് പ്ലേ ചെയ്യാൻ കഴിയില്ല. + ഈ വീഡിയോ പ്രായപരിധി നിർണ്ണയിച്ചിരിക്കുന്നു. \nപ്രായ-നിയന്ത്രിത വീഡിയോകളുള്ള പുതിയ യൂട്യൂബ് നയങ്ങൾ കാരണം, ന്യൂപൈപ്പിന് അതിന്റെ വീഡിയോ സ്ട്രീമുകളിലൊന്നും ആക്സസ് ചെയ്യാൻ കഴിയില്ല, അതിനാൽ ഇത് പ്ലേ ചെയ്യാൻ കഴിയില്ല. പക്വതയുള്ള ഉള്ളടക്കം മറയ്ക്കുന്ന \"നിയന്ത്രിത മോഡ്\" യൂട്യൂബ് നൽകുന്നു കുട്ടികൾക്ക് അനുയോജ്യമല്ലാത്ത ഉള്ളടക്കം കാണിക്കുക കാരണം അതിന് പ്രായപരിധി ഉണ്ട് (18+ പോലെ) - URL തിരിച്ചറിയാൻ കഴിഞ്ഞില്ല. മറ്റൊരു അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് തുറക്കണോ\? + URL തിരിച്ചറിയാൻ കഴിഞ്ഞില്ല. മറ്റൊരു അപ്ലിക്കേഷൻ ഉപയോഗിച്ച് തുറക്കണോ? തനിയെ ക്യൂവിൽ കയറ്റുക സ്ട്രീം സ്രഷ്ടാവ്, സ്ട്രീം ഉള്ളടക്കം അല്ലെങ്കിൽ ഒരു തിരയൽ അഭ്യർത്ഥന എന്നിവയെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾ ഉൾക്കൊള്ളുന്ന മെറ്റാ വിവര ബോക്സുകൾ മറയ്ക്കുന്നതിന് ഓഫാക്കുക മെറ്റാഇൻഫോ കാണിക്കുക @@ -613,9 +580,7 @@ താക്കൾക് ഇപ്പോൾ ഡിസ്ക്രിപ്ഷൻ ബോക്സിലെ ടെക്സ്റ്റ്‌ തിരഞ്ഞെടുക്കാൻ സാധിക്കും. ശ്രെദ്ധിക്കുക സെലെക്ഷൻ മോഡിൽ പേജ് ചിലപ്പോൾ മിന്നുകയും ലിങ്കുകൾ ക്ലിക്ക് ചെയ്യാനാകാതെയും വന്നേക്കാം. അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു ഫാസ്റ്റ് ഫീഡ് മോഡ് കൂടുതൽ വിവരങ്ങൾ നൽകില്ല. - സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു. -\nഭാവിയിൽ ഫീഡ് ലോഡ് ചെയ്യാൻ ന്യൂ പൈപ്പിന് സാധിക്കില്ല. -\nതാക്കൾക്ക് ഈ ചാനൽ അൺ സബ്സ്ക്രൈബ് ചെയ്യണോ\? + സൃഷ്ടാവിന്റെ അക്കൗണ്ട് ഇല്ലാതായിരിക്കുന്നു. \nഭാവിയിൽ ഫീഡ് ലോഡ് ചെയ്യാൻ ന്യൂ പൈപ്പിന് സാധിക്കില്ല. \nതാക്കൾക്ക് ഈ ചാനൽ അൺ സബ്സ്ക്രൈബ് ചെയ്യണോ? \'%s\' ലെ ഫീഡ് ലോഡ് ചെയ്യാൻ സാധികില്ല. ഫീഡ് ലോഡ് ചെയ്യുന്നതിൽ പിശക് സംഭവിച്ചിരിക്കുന്നു ആൻഡ്രോയ്ഡ് 10 മുതൽ മാത്രമേ \"സ്റ്റോറേജ് അക്സസ് ഫ്രെയിംവർക്ക്\" പിന്തുണക്കു diff --git a/app/src/main/res/values-mn/strings.xml b/app/src/main/res/values-mn/strings.xml index a877e83f0..2562f95fb 100644 --- a/app/src/main/res/values-mn/strings.xml +++ b/app/src/main/res/values-mn/strings.xml @@ -40,4 +40,4 @@ Kodi-р тоглуулах Байхгүй Kore апп-ийг суулгах уу? \"Kodi-р тоглуулах\" цэсийг харуулах - \ No newline at end of file + diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index de6cec2a0..3193aa874 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -33,7 +33,7 @@ रद्द करा स्थापित करा प्लेअर सापडले नाही (तुम्ही VLC player वापरून फाईल चालवू शकता). - प्लेअर सापडले नाही. VLC प्लेअर इंस्टॉल करू इच्छिता का\? + प्लेअर सापडले नाही. VLC प्लेअर इंस्टॉल करू इच्छिता का? प्रारंभ करण्यासाठी मॅग्निफाइंग ग्लासवर टॅप करा. कोडी वापरून चालवा फक्त काही उपकरणे 2k/4k व्हिडिओ चालवू शकतात @@ -51,9 +51,9 @@ तिसरे क्रिया बटण चौथे क्रिया बटण पाचवे क्रिया बटण - तुम्हाला \"%1$s\" म्हणायचे आहे का\? + तुम्हाला \"%1$s\" म्हणायचे आहे का? काही रेसॉल्युशनवर ऑडिओ काढून टाकते - गहाळ Kode ॲप इंस्टॉल करायचे\? + गहाळ Kode ॲप इंस्टॉल करायचे? 16:9 ते 1:1 आस्पेक्ट रेशो पर्यंत नोटिफिकेशनमध्ये दाखवलेली व्हिडिओ थंबनेल क्रॉप करा प्रथम क्रिया बटण 1:1 आस्पेक्ट रेशोवर थंबनेल क्रॉप करा diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index 0f2cebebf..73b30f0fd 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -2,7 +2,7 @@ Tekan kanta kaca \"Cari\" untuk bermula Diterbitkan pada %1$s - Tiada pemain strim ditemui. Muat turun VLC\? + Tiada pemain strim ditemui. Muat turun VLC? Tiada pemain strim yang ditemui (anda boleh memasang VLC untuk memainkan). Pasang Batal @@ -13,7 +13,7 @@ Muat turun fail strim Carian Tetapan - Adakah anda maksudkan \"%1$s\"\? + Adakah anda maksudkan \"%1$s\"? Berkongsi dengan Guna pemain video luaran Mengalih keluar audio pada sesetengah resolusi @@ -121,15 +121,15 @@ Mengeksport sejarah, langganan dan senarai main Hapuskan sejarah tontonan Hapuskan sejarah strim yang telah dimain - Padamkan seluruh sejarah tontonan\? + Padamkan seluruh sejarah tontonan? Sejarah tontonan dipadamkan. Hapuskan sejarah carian Padamkan sejarah kata kunci carian - Padamkan seluruh sejarah carian\? + Padamkan seluruh sejarah carian? Sejarah carian dipadamkan. Ralat Penyimpanan luaran tidak tersedia - Tidak mampu Memuat turun ke kad SD luar. Tetapkan semula lokasi folder muat turun\? + Tidak mampu Memuat turun ke kad SD luar. Tetapkan semula lokasi folder muat turun? Ralat rangkaian Tidak dapat memuat semua thumbnail Tidak dapat menghuraikan laman web @@ -150,7 +150,7 @@ Tiada strim yang tersedia untuk dimuat turun Menggunakan tab utama, ralat semasa membaca tab tersimpan Kembali kepada asal - Adakah anda mahu kembali kepada asal\? + Adakah anda mahu kembali kepada asal? Maaf, itu tidak sepatutnya berlaku. Laporkan ralat melalui e-mel Maaf, ada ralat yang berlaku. @@ -196,8 +196,7 @@ Sila tunggu… Disalin ke papan klip Sila pilih folder muat turun nanti dalam tetapan - Kebenaran ini diperlukan untuk -\nbuka dalam mod popup + Kebenaran ini diperlukan untuk \nbuka dalam mod popup 1 item dipadamkan. Cabaran reCAPTCHA Meminta kod reCAPTCHA @@ -222,15 +221,14 @@ Laman Web Lawati Laman Web NewPipe untuk maklumat lanjut dan berita. Dasar Privasi NewPipe - Projek NewPipe mengambil perhatian privasi anda dengan sangat serius. Oleh itu, aplikasi tidak mengumpulkan sebarang data tanpa persetujuan anda. -\nDasar privasi NewPipe menerangkan secara terperinci apa data dihantar dan disimpan apabila anda menghantar laporan ranap. + Projek NewPipe mengambil perhatian privasi anda dengan sangat serius. Oleh itu, aplikasi tidak mengumpulkan sebarang data tanpa persetujuan anda. \nDasar privasi NewPipe menerangkan secara terperinci apa data dihantar dan disimpan apabila anda menghantar laporan ranap. Baca dasar privasi Lesen NewPipe NewPipe adalah perisian copyleft percuma: Anda boleh menggunakan, berkongsi kajian dan memperbaikinya mengikut kehendak. Khususnya anda boleh mengagihkan semula dan / atau mengubahnya di bawah syarat GNU General Public License seperti yang diterbitkan oleh Free Software Foundation, sama ada versi 3 dari Lesen, atau (pada pilihan anda) versi yang lebih baru. Baca lesen Sejarah Sejarah - Adakah anda mahu memadamkan item ini dari sejarah carian\? + Adakah anda mahu memadamkan item ini dari sejarah carian? Terakhir dimainkan Kebanyakan dimainkan Kandungan halaman utama @@ -246,7 +244,7 @@ Tiada fail ZIP yang sah Amaran: Tidak dapat mengimport semua fail. Ini akan menimpa tetapan semasa anda. - Adakah anda juga mahu mengimport tetapan\? + Adakah anda juga mahu mengimport tetapan? Sohor Kini Top 50 Baru & panas @@ -274,7 +272,7 @@ Tetapkan sebagai Thumbnail Senarai Main Menanda senarai main Hapuskan Penanda Halaman - Padamkan senarai main ini\? + Padamkan senarai main ini? Senarai main dibuat Ditambah ke senarai main Thumbnail senarai main berubah. @@ -297,21 +295,10 @@ Eksport terdahulu Tidak dapat mengimport langganan Tidak dapat mengeksport langganan - Import langganan YouTube dengan memuat turun fail eksport: -\n -\n1. Pergi ke URL ini: %1$s -\n2. Log masuk apabila ditanya -\n3. Muat turun harus bermula (itulah file eksport) - Import profil SoundCloud dengan menaip sama ada URL atau ID anda: -\n -\n1. Dayakan \"mod desktop\" dalam pelayar web (laman web tidak tersedia untuk peranti mudah alih) -\n2. Pergi ke URL ini: %1$s -\n3. Log masuk apabila ditanya -\n4. Salin URL profil yang diarahkan ke. + Import langganan YouTube dengan memuat turun fail eksport: \n \n1. Pergi ke URL ini: %1$s \n2. Log masuk apabila ditanya \n3. Muat turun harus bermula (itulah file eksport) + Import profil SoundCloud dengan menaip sama ada URL atau ID anda: \n \n1. Dayakan \"mod desktop\" dalam pelayar web (laman web tidak tersedia untuk peranti mudah alih) \n2. Pergi ke URL ini: %1$s \n3. Log masuk apabila ditanya \n4. Salin URL profil yang diarahkan ke. idAnda, soundcloud.com/idanda - Ingatkan bahawa operasi ini boleh menggunakan banyak data. -\n -\nAdakah anda mahu meneruskan\? + Ingatkan bahawa operasi ini boleh menggunakan banyak data. \n \nAdakah anda mahu meneruskan? Kawalan Kelajuan Pemain Tempo Nada @@ -319,8 +306,7 @@ Cepat ke hadapan semasa berdiam diri Langkah Tetapkan semula - Untuk mematuhi Peraturan Perlindungan Data Umum Eropah (GDPR), kami dengan ini menarik perhatian anda kepada dasar privasi NewPipe. Sila baca dengan teliti. -\nAnda mesti menerimanya untuk menghantar laporan bug kepada kami. + Untuk mematuhi Peraturan Perlindungan Data Umum Eropah (GDPR), kami dengan ini menarik perhatian anda kepada dasar privasi NewPipe. Sila baca dengan teliti. \nAnda mesti menerimanya untuk menghantar laporan bug kepada kami. Terima Tolak Tiada had @@ -394,13 +380,11 @@ Album Lagu Video - Video ini ada had umur. -\n -\nAktifkan \"%1$s\" dalam tetapan jika anda ingin melihatnya. + Video ini ada had umur. \n \nAktifkan \"%1$s\" dalam tetapan jika anda ingin melihatnya. YouTube menyediakan \"Mode Terhad\" yang menyembunyikan kandungan dewasa Aktifkan \"Mod Terhad\" YouTube Tunjuk kandungan yang mungkin tidak wajar untuk kanak-kanak kerana mempunyai had umur (seperti 18+) - URL tidak dikenali. Buka dengan aplikasi lain\? + URL tidak dikenali. Buka dengan aplikasi lain? Kosongkan data Matikan untuk menyembunyikan kotak maklumat meta yang mengandungi maklumat tambahan mengenai pencipta, kandungan siaran atau permintaan carian Matikan untuk menyembunyikan deskripsi video dan maklumat lanjut diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 5bb50d200..49c8f3e63 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -21,4 +21,4 @@ စတင်ရန် ဖောက်ထွင်းမှန်ကိုထိပါ။ ဖြင့် မျှဝေမည် အခြားဗီဒီယိုပလေယာ အားသုံးမည် - \ No newline at end of file + diff --git a/app/src/main/res/values-nap/strings.xml b/app/src/main/res/values-nap/strings.xml index 22b5ee371..88753b598 100644 --- a/app/src/main/res/values-nap/strings.xml +++ b/app/src/main/res/values-nap/strings.xml @@ -26,12 +26,12 @@ Leve l\'audio cu alcune risuluzioni Condividi cu Resultati pe\': %s - Vulive ricere \"%1$s\"\? + Vulive ricere \"%1$s\"? Impostazioni Scarica \'o flusso d\' \'o file Scarica Condividi Nisciuno lettore truvato (può installà VLC p\' \'o reprodurre). - Nisciuno lettore truvato. Vuo\' installà VLC\? + Nisciuno lettore truvato. Vuo\' installà VLC? Priemme \"Truova\" p\'accummencià - \ 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 e6fb51348..7fc708c26 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -9,7 +9,7 @@ Last ned Søk Innstillinger - Mente du «%1$s»\? + Mente du «%1$s»? Del med Bruk ekstern videoavspiller Bruk ekstern lydavspiller @@ -21,7 +21,7 @@ Velg nedlastingsmappe for lydfiler Standard oppløsning Spill av med Kodi - Installer manglende Kode-app\? + Installer manglende Kode-app? Vis \"Spill av med Kodi\"-valg Vis valg om å spille av video via Kodi mediasenter Lyd @@ -89,8 +89,7 @@ Spiller av i oppsprettsmodus Alle Avskrudd - Denne tilgangen trengs for -\nåpning i oppsprettsmodus + Denne tilgangen trengs for \nåpning i oppsprettsmodus reCAPTCHA-oppgave forespurt Fjerner lyd på noen oppløsninger Abonner @@ -229,7 +228,7 @@ Sett som miniatyrbilde for spilleliste Bokmerk spilleliste Fjern bokmerke - Slett denne spillelisten\? + Slett denne spillelisten? Spilleliste opprettet Lagt til i spilleliste Miniatyrbilde for spilleliste endret. @@ -262,19 +261,17 @@ Foretrekt \"åpne\"-handling Forvalgt handling ved åpning av innhold — %s din-ID, soundcloud.com/dinid - Husk at denne handlingen kan belaste nettverket tungt. -\n -\nØnsker du å fortsette? + Husk at denne handlingen kan belaste nettverket tungt. \n \nØnsker du å fortsette? Fartskontroller for avspilling Hastighet Tonehøyde Tøm avspillingshistorikk Slett historikken og posisjon for avspilte strømmer - Slett hele visningshistorikken\? + Slett hele visningshistorikken? Visningshistorikken er slettet Tøm søkehistorikk Sletter historikken for søkte nøkkelord - Slett hele søkehistorikken\? + Slett hele søkehistorikken? Søkehistorikken er slettet Ett element slettet. Undertekst @@ -283,21 +280,8 @@ Ønsker du også å importere innstillinger? Kunne ikke importere abonnementer Kunne ikke eksportere abonnementer - Importer YoutTube-abonnementer fra Google takeout: -\n -\n1. Gå til denne nettadressen: %1$s -\n2. Logg inn når forespurt -\n3. Klikk på \"All data inkludert\", så på \"Fjern merket for alle\", så på kun \"Abonnementer\", og klikk så \"OK\" -\n4. Klikk på \"Neste steg\" og så på \"Opprett eksport\" -\n5. Klikk på \"Last ned\"-knappen etter den vises -\n6. Klikk på IMPORTER FIL under og velg den nedlastede .zip filen -\n7. [Dersom .zip importen feiler] Pakk ut .csv filen (vanligvis under \"YouTube og YouTube Music/subscriptions/subscriptions.csv\"), klikk på IMPORTER FIL under og velg den utpakkede csv filen - Importer en SoundCloud-profil ved å skrive enten nettadressen eller din ID: -\n -\n1. Skru på \"skrivebordsmodus\" i en nettleser ( siden er ikke tilgjengelig for mobile enheter) -\n2. Gå til denne nettadressen: %1$s -\n3. Logg inn når forespurt -\n4. Kopier profil-nettadressen du ble videresendt til. + Importer YoutTube-abonnementer fra Google takeout: \n \n1. Gå til denne nettadressen: %1$s \n2. Logg inn når forespurt \n3. Klikk på \"All data inkludert\", så på \"Fjern merket for alle\", så på kun \"Abonnementer\", og klikk så \"OK\" \n4. Klikk på \"Neste steg\" og så på \"Opprett eksport\" \n5. Klikk på \"Last ned\"-knappen etter den vises \n6. Klikk på IMPORTER FIL under og velg den nedlastede .zip filen \n7. [Dersom .zip importen feiler] Pakk ut .csv filen (vanligvis under \"YouTube og YouTube Music/subscriptions/subscriptions.csv\"), klikk på IMPORTER FIL under og velg den utpakkede csv filen + Importer en SoundCloud-profil ved å skrive enten nettadressen eller din ID: \n \n1. Skru på \"skrivebordsmodus\" i en nettleser ( siden er ikke tilgjengelig for mobile enheter) \n2. Gå til denne nettadressen: %1$s \n3. Logg inn når forespurt \n4. Kopier profil-nettadressen du ble videresendt til. Unøyaktig spoling lar spilleren søke posisjoner raskere med redusert presisjon. Å søke i 5, 15 eller 25 sekunder fungerer ikke med dette Fortsett fullendt (ikke-repeterende) avspillingskø ved å legge til en relatert strøm Overvåkning av minnelekkasjer kan forårsake at appen ikke svarer under heap dumping @@ -307,8 +291,7 @@ NewPipes personvernerklæring NewPipe-prosjektet tar personvernet ditt veldig seriøst. Derfor samler ikke appen inn noe data uten ditt samtykke.\nNewPipes personvernerklæring forklarer i detalj hvilke data som sendes og lagres når du sender en kræsjrapport. Les personvernerklæring - For å overholde EUs personvernforordning (GDPR), vil vi rette oppmerksomheten din mot NewPipe sin personvernerklæring. Vennligst les den nøye. -\nDu må godta den, for å sende oss feilrapporten. + For å overholde EUs personvernforordning (GDPR), vil vi rette oppmerksomheten din mot NewPipe sin personvernerklæring. Vennligst les den nøye. \nDu må godta den, for å sende oss feilrapporten. Godta Avslå Ingen begrensning @@ -333,10 +316,10 @@ Varsel om appoppdatering Merknader for nye NewPipe-versjoner Ekstern lagring utilgjengelig - Nedlasting til eksternt SD-kort er ikke mulig. Tilbakestill plassering av nedlastingsmappe\? + Nedlasting til eksternt SD-kort er ikke mulig. Tilbakestill plassering av nedlastingsmappe? Kunne ikke leste lagrede faner, så bruker forvalgte Gjenopprett forvalg - Ønsker du å gjenopprette forvalg\? + Ønsker du å gjenopprette forvalg? Abonnementsantall utilgjengelig Hvilke faner vises på hovedsiden Konferanser @@ -394,19 +377,18 @@ Ingen ledig plass på enheten Framdrift gikk tapt, fordi filen ble slettet Tilkoblingsavbrudd - Ønsker du å slette din nedlastingshistorikk eller slette alle nedlastede filer\? + Ønsker du å slette din nedlastingshistorikk eller slette alle nedlastede filer? Begrens nedlastingskø Én nedlasting av gangen Start nedlastinger Sett nedlastinger på pause Spør om hvor ting skal lastes ned til - Du vil bli spurt om hvor hver nedlasting skal plasseres -\nAktiver system mappe velgeren (SAF) dersom du vil laste ned til et eksternt SD kort + Du vil bli spurt om hvor hver nedlasting skal plasseres \nAktiver system mappe velgeren (SAF) dersom du vil laste ned til et eksternt SD kort Bruk systemmappevelger (SAF) \'Lagringstilgangsrammeverk\' (SAF) tillater nedlasting til et eksternt SD-kort Slett avspillingsposisjoner Sletter alle avspillingsposisjoner - Slett alle avspillingsposisjoner\? + Slett alle avspillingsposisjoner? Skru tjeneste av/på, for tiden er dette status: Ingen ser på @@ -463,7 +445,7 @@ Ikke innlastet: %d Tomt gruppenavn - Ønsker du å slette denne gruppen\? + Ønsker du å slette denne gruppen? Ny Alltid oppdater @@ -479,9 +461,7 @@ Behandler strøm… Laster inn strøm… Strøm sist oppdatert: %s - Denne videoen er aldersbegrenset. -\n -\nSkru på «%1$s» i innstillingene hvis du vil se den. + Denne videoen er aldersbegrenset. \n \nSkru på «%1$s» i innstillingene hvis du vil se den. ∞ videoer 100+ videoer Artister @@ -505,17 +485,7 @@ Vis opprinnelig tidsforskjell for elementer Bygger mellomlager Tilfeldig rekkefølge - Synes du at strøminnlastingen er for treg\? Prøv å skru på rask innlasting (du kan endre det i innstillingene, eller ved å trykke på knappen nedenfor). -\n -\nNewPipe tilbyr to strøminnlastingsstrategier: -\n• Hent hele abonnementskanalen, noe som er tregt, men fullstendig. -\n• Bruk av et dedikert tjenesteendepunkt, noe som er raskt men vanligvis ikke fullstendig. -\n -\nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skille mellom direktesendinger og normale videoer) og det kan gi færre elementer. -\n -\nYouTube er et eksempel på en tjeneste som tilbyr denne raske metoden med sin RSS-informasjonskanal. -\n -\nValget koker ned til det du foretrekker: hastighet eller presis info. + Synes du at strøminnlastingen er for treg? Prøv å skru på rask innlasting (du kan endre det i innstillingene, eller ved å trykke på knappen nedenfor). \n \nNewPipe tilbyr to strøminnlastingsstrategier: \n• Hent hele abonnementskanalen, noe som er tregt, men fullstendig. \n• Bruk av et dedikert tjenesteendepunkt, noe som er raskt men vanligvis ikke fullstendig. \n \nForskjellen mellom dem er at den raske vanligvis mangler info, som elementers varighet eller type (kan ikke skille mellom direktesendinger og normale videoer) og det kan gi færre elementer. \n \nYouTube er et eksempel på en tjeneste som tilbyr denne raske metoden med sin RSS-informasjonskanal. \n \nValget koker ned til det du foretrekker: hastighet eller presis info. Originaltekster fra tjenester vil vises for elementer i strømmen Sjekk om det allerede eksisterer et problem som diskuterer ditt krasj. Når du oppretter duplikatbilletter, tar du tid fra oss som vi kan bruke på å fikse den faktiske feilen. Du kan maksimalt velge tre handlinger som skal vises i kompaktvarselet! @@ -527,10 +497,8 @@ Som følge av begrensninger i ExoPlayer er blafringsdistansen kun %d sekunder Videoer som har blitt sett før og etter at de er lagt til spillelisten, vil bli fjernet. \nEr du sikker? Dette kan ikke angres! Start avspilling automatisk — %s - Kunne ikke gjenkjenne angitt nettadresse. Åpne den med et annet program\? - Innholdet støttes ikke enda av NewPipe. -\n -\nStøtte vil forhåpentligvis komme til i en senere versjon. + Kunne ikke gjenkjenne angitt nettadresse. Åpne den med et annet program? + Innholdet støttes ikke enda av NewPipe. \n \nStøtte vil forhåpentligvis komme til i en senere versjon. Spillelisteside Kanalens avatar-miniatyrbilde Skru på hurtigmodus @@ -573,8 +541,7 @@ Vis beskrivelse Åpne med Krasj programmet - Denne videoen er aldersbegrenset. -\nSom følge av YouTube sin praksis med slike har ikke NewPipe tilgang til videostrømmene, og kan derfor ikke spille den. + Denne videoen er aldersbegrenset. \nSom følge av YouTube sin praksis med slike har ikke NewPipe tilgang til videostrømmene, og kan derfor ikke spille den. Innholdet er kun tilgjengelig for brukere som har betalt, så det kan ikke strømmes eller lastes ned av NewPipe. Innholdet er privat, så det kan ikke strømmes eller lastes ned av NewPipe. Videoen er kun tilgjengelig for YouTube Music Premium-medlemmer, så den kan ikke strømmes eller lastes ned av NewPipe. @@ -593,9 +560,7 @@ Skru av media-tunnelering Du kan nå velge tekst inne i beskrivelsen. Merk at siden kan flimre og lenker er kanskje ikke klikkbare i utvalgsmodus. Hurtigmodus for informasjonskanal tilbyr ikke mer info om dette. - Skaperens konto har blitt terminert. -\nNewPipe vil ikke kunne laste inn denne informasjonskanalen i fremtiden. -\nØnsker du å oppheve ditt abonnement på denne kanalen\? + Skaperens konto har blitt terminert. \nNewPipe vil ikke kunne laste inn denne informasjonskanalen i fremtiden. \nØnsker du å oppheve ditt abonnement på denne kanalen? Skru av merking av tekst i beskrivelsen Skru på merking av tekst i beskrivelsen Konto terminert @@ -657,10 +622,8 @@ NewPipe oppdaget en feil, trykk for å rapportere Opprett en feilmerknad Vis en feil hurtigbar - Ingen passende filbehandler ble funnet for denne handlingen. -\nVennligst installer en filbehandler, eller prøv å skru av \'%s\' i nedlastingsinnstillingene - Ingen passende filbehandler ble funnet for denne handlingen. -\nVennligst installer en Storage Access Framework kompatibel filbehandler + Ingen passende filbehandler ble funnet for denne handlingen. \nVennligst installer en filbehandler, eller prøv å skru av \'%s\' i nedlastingsinnstillingene + Ingen passende filbehandler ble funnet for denne handlingen. \nVennligst installer en Storage Access Framework kompatibel filbehandler LeakCanary er ikke tilgjengelig ExoPlayer-forvalg Intervallstørrelse for avspillingsinnlasting @@ -679,7 +642,7 @@ Halvtone Den valgte strømmen støttes ikke av eksterne spillere Laster inn strømdetaljer… - Slett alle nedlastede filer fra harddisken\? + Slett alle nedlastede filer fra harddisken? Varsler er deaktivert Du abonnerer nå på denne kanalen Strømmer som ennå ikke er støttet av nedlasteren, vises ikke @@ -717,20 +680,19 @@ Velg håndvending for høyre halvdel av avspillerskjermen Ingen Fjern duplikater - Fjern alle duplikatstrømmer i denne spillelisten\? + Fjern alle duplikatstrømmer i denne spillelisten? Kommende Venstre håndvendingshandling Høyre håndvendingshandling Volum - Fjern duplikater\? + Fjern duplikater? Vis/skjul strømmer Delvis sett Nyttig hvis hodsettet ditt har knapper som fungerer dårlig Vis følgende strømmer \? Abonnenter - %1$s -\n%2$s + %1$s \n%2$s Kanalfaner Laster inn metadata … Lav kvalitet diff --git a/app/src/main/res/values-ne/strings.xml b/app/src/main/res/values-ne/strings.xml index 06e2bacc1..11982c021 100644 --- a/app/src/main/res/values-ne/strings.xml +++ b/app/src/main/res/values-ne/strings.xml @@ -2,7 +2,7 @@ सुरू गर्न \"खोज\" चिन्ह दबाउनुहोस् %1$s मा प्रकाशित - कुनै स्ट्रिम प्लेयर फेला परेन। के तपाईं VLC इन्स्टल गर्न चाहनुहुन्छ\? + कुनै स्ट्रिम प्लेयर फेला परेन। के तपाईं VLC इन्स्टल गर्न चाहनुहुन्छ? कुनै स्ट्रिम प्लेयर फेला परेन (तपाईँ यसलाई प्ले गर्न VLC इन्स्टल गर्न सक्नुहुन्छ)। इन्स्टल गर्नुहोस् रद्द गर्नुहोस् @@ -13,7 +13,7 @@ स्ट्रिम् डाउनलोड गर्नुहोस् खोज्नुहोस् सेटिङ्गहरु - के तपाईंको मतलब \"%1$s\" हो\? + के तपाईंको मतलब \"%1$s\" हो? साझा गर्नुहोस् अन्य भिडियो प्लेयर प्रयोग गर्नुहोस् कुनै भिडियो रेजोलुसनहरुमा अडियो हट्न सक्छ @@ -42,7 +42,7 @@ उच्च रेजोलुसन देखाउनु केवल केही डिभाइसहरू मात्र 2k/4K भिडियो चलाउन सक्छन् Kodi सँग चलाउनुहोस् - \'Kore\' एप छैन, इन्स्टल गर्न चाहनुहुन्छ\? + \'Kore\' एप छैन, इन्स्टल गर्न चाहनुहुन्छ? \"Kodi सँग प्ले\" विकल्प देखाउनु Kodi मिडिया सेन्टर मार्फत भिडियो प्ले गर्न एक विकल्प देखाउनु अडियो @@ -128,14 +128,14 @@ इतिहास निर्यात, सदस्यताहरु र प्लेसूचीहरू हेरेको इतिहास सखाप प्ले प्रवाहको इतिहास र प्लेब्याक स्थान मेटाउँछ - सम्पूर्ण हेरेको इतिहास मेटाउने\? + सम्पूर्ण हेरेको इतिहास मेटाउने? खोज इतिहास हटाऊ किवर्ड खोजको इतिहास मेटाउँछ - सम्पूर्ण खोज इतिहास मेटाउने\? + सम्पूर्ण खोज इतिहास मेटाउने? खोज इतिहास मेटियो। त्रुटि बाह्य भण्डारण अनउपलब्ध - बाह्य एस डी कार्ड (SD card) छैन। डाउनलोड फोल्डर स्थान रिसेट गर्ने\? + बाह्य एस डी कार्ड (SD card) छैन। डाउनलोड फोल्डर स्थान रिसेट गर्ने? नेटवर्क त्रुटि सबै थम्बनेल लोड गर्न सकेन वेबसाइट पार्स गर्न सकिँएन @@ -156,7 +156,7 @@ कुनै धाराहरु डाउनलोड गर्न उपलब्ध छैनन् बचत गरिएका ट्याबहरू पढ्न सकिएन, पूर्वनिर्धारित प्रयोग गरिदै फेरी पहिलाकै अवस्थामा लैजाऊ - तपाईं पूर्वनिर्धारित पुनर्स्थापना गर्न चाहनुहुन्छ\? + तपाईं पूर्वनिर्धारित पुनर्स्थापना गर्न चाहनुहुन्छ? माफ गर्नुहोस्, त्यस्तो हुनु हुँदैनथियो। ई-मेल मार्फत यो त्रुटि रिपोर्ट माफ गर्नुहोस्, केही त्रुटिहरू भयो। @@ -205,8 +205,7 @@ कृपया पर्खनुहोस्… क्लिपबोर्डमा प्रतिलिपि कृपया पछि डाउनलोड फोल्डर सेटिङहरू मा परिभाषित गर्नुहोस - पपअप मोडमा खोल्न -\nयो अनुमति आवश्यक छ + पपअप मोडमा खोल्न \nयो अनुमति आवश्यक छ 1 वस्तु हटाइयो। reCAPTCHA चुनौती अनुरोध डाउनलोड @@ -230,15 +229,14 @@ वेबसाइट थप जानकारी र समाचार लागि NewPipe वेबसाइट मा जानुहोस्। NewPipe गोपनीयता नीति - न्यू पाइप परियोजना आफ्नो गोपनीयता धेरै गम्भीरतापूर्वक लिन्छ। तसर्थ, तपाईँको सहमति बिना कुनै पनि डाटा संकलन गर्दैन। -\nन्यू पाइपको गोपनीयता नीतिले क्र्यास रिपोर्ट पठाउने बित्तिकै कुन डाटा पठाइएको र भण्डारण गरिएको छ भनेर विस्तृत वर्णन गर्दछ। + न्यू पाइप परियोजना आफ्नो गोपनीयता धेरै गम्भीरतापूर्वक लिन्छ। तसर्थ, तपाईँको सहमति बिना कुनै पनि डाटा संकलन गर्दैन। \nन्यू पाइपको गोपनीयता नीतिले क्र्यास रिपोर्ट पठाउने बित्तिकै कुन डाटा पठाइएको र भण्डारण गरिएको छ भनेर विस्तृत वर्णन गर्दछ। गोपनीयता नीति पढ्नुहोस् NewPipe इजाजत पत्र NewPipe copyleft छ मुफ्त सफ्टवेयर: तपाईं प्रयोग गर्न सक्नुहुन्छ, अध्ययन शेयर र इच्छामा सुधार। विशेष तपाईं redistribute गर्न सक्नुहुन्छ र / वा रूपमा फ्री सफ्टवेयर फाउंडेशन द्वारा प्रकाशित GNU जनरल सार्वजनिक लाइसेन्स सर्तहरू अन्तर्गत यो परिमार्जन, कि त लाइसेन्स को संस्करण 3, वा (तपाईँको विकल्प मा) कुनै पनि पछि संस्करण। लाइसेन्स पढ्नुहोस् इतिहास इतिहास - तपाईं खोज इतिहासबाट यो वस्तु मेटाउन चाहनुहुन्छ\? + तपाईं खोज इतिहासबाट यो वस्तु मेटाउन चाहनुहुन्छ? पछिल्लो पालि खोलिएको धेरै हेरिएको मुख्य पृष्ठको सामग्री @@ -254,7 +252,7 @@ कुनै मान्य जिप फाइल भेटिएन चेतावनी: सबै फाइलहरू आयात गर्न सकिएन। तपाइको हालको सेटअप अधिलेखन हुनेछ। - तपाईं सेटिङहरू पनि आयात गर्न चाहनुहुन्छ\? + तपाईं सेटिङहरू पनि आयात गर्न चाहनुहुन्छ? टिप्पणीहरू लोड गर्न सकिएन लोकप्रिय शीर्ष 50 @@ -283,7 +281,7 @@ प्लेलिस्ट थम्बनेल रूपमा सेट बुकमार्क प्लेलिस्ट बुकमार्क हटाउ - यो प्लेसूची मेटाउने\? + यो प्लेसूची मेटाउने? प्लेलिस्ट सिर्जना गरियो प्लेसुचीमा राखियो प्लेसूची थम्बनेल परिवर्तन भयो। @@ -306,21 +304,10 @@ अघिल्लो निर्यात सदस्यताहरु आयात गर्न सकिएन सदस्यताहरु निर्यात गर्न सकेन - निर्यात फाइल डाउनलोड गरेर यूट्यूब सदस्यताहरू आयात गर्नुहोस्: -\n -\n1. जानुहोस् यो URL:%1$s -\n2. सोधिएको बेलामा लग इन गर्नुहोस् -\n3. एउटा डाउनलोड सुरु हुनुपर्दछ (त्यो निर्यात फाईल हो) - या त URL वा तपाईंको ID टाइप गरेर साउन्डक्लाउड(SoundCloud) प्रोफाइल आयात गर्नुहोस्: -\n -\n1. वेब ब्राउजरमा \"डेस्कटप मोड\" सक्षम गर्नुहोस् (साइट मोबाइल उपकरणहरूको लागि उपलब्ध छैन) -\n2. यस URL:%1$s मा जानुहोस् -\n3. सोधिएको बेलामा लग इन गर्नुहोस् -\n4. तपाईंलाई URL मा निर्देशित गरिएको प्रोफाइल URL प्रतिलिपि गर्नुहोस्। + निर्यात फाइल डाउनलोड गरेर यूट्यूब सदस्यताहरू आयात गर्नुहोस्: \n \n1. जानुहोस् यो URL:%1$s \n2. सोधिएको बेलामा लग इन गर्नुहोस् \n3. एउटा डाउनलोड सुरु हुनुपर्दछ (त्यो निर्यात फाईल हो) + या त URL वा तपाईंको ID टाइप गरेर साउन्डक्लाउड(SoundCloud) प्रोफाइल आयात गर्नुहोस्: \n \n1. वेब ब्राउजरमा \"डेस्कटप मोड\" सक्षम गर्नुहोस् (साइट मोबाइल उपकरणहरूको लागि उपलब्ध छैन) \n2. यस URL:%1$s मा जानुहोस् \n3. सोधिएको बेलामा लग इन गर्नुहोस् \n4. तपाईंलाई URL मा निर्देशित गरिएको प्रोफाइल URL प्रतिलिपि गर्नुहोस्। yourID, soundcloud.com/youridyourID, soundcloud.com/yourid - दिमागमा राख्नुहोस् यो अपरेशन नेटवर्क महँगो हुन सक्छ। -\n -\nतपाईँ जारी राख्न चाहनुहुन्छ\? + दिमागमा राख्नुहोस् यो अपरेशन नेटवर्क महँगो हुन सक्छ। \n \nतपाईँ जारी राख्न चाहनुहुन्छ? प्लेब्याक परिमिति टेम्पो पिच @@ -328,8 +315,7 @@ मौन समयमा छिटो-फर्वार्ड चरण रिसेट - यूरोपीय सामान्य डाटा संरक्षण नियमन (GDPR) अनुपालन गर्न, हामी हर्बी न्यूपिपको गोपनीयता नीतिमा तपाईंको ध्यान आकर्षित गर्दछौं। कृपया यसलाई ध्यानपूर्वक पढ्नुहोस्। -\nतपाईंले हामीलाई बग रिपोर्ट पठाउन यसलाई स्वीकार्नुपर्दछ। + यूरोपीय सामान्य डाटा संरक्षण नियमन (GDPR) अनुपालन गर्न, हामी हर्बी न्यूपिपको गोपनीयता नीतिमा तपाईंको ध्यान आकर्षित गर्दछौं। कृपया यसलाई ध्यानपूर्वक पढ्नुहोस्। \nतपाईंले हामीलाई बग रिपोर्ट पठाउन यसलाई स्वीकार्नुपर्दछ। स्वीकार अस्वीकार असीमित @@ -389,7 +375,7 @@ उपकरणमा कुनै ठाउँ बाकी छैन प्रगति हरायो, किनभने फाइल मेटिएको थियो जडान समय सकियो - तपाईं आफ्नो डाउनलोड इतिहास वा डाउनलोड फाइल मेटाउन चाहनुहुन्छ\? + तपाईं आफ्नो डाउनलोड इतिहास वा डाउनलोड फाइल मेटाउन चाहनुहुन्छ? डाउनलोड लामको सीमा एक डाउनलोड एकै समयमा चालू हुनेछ डाउनलोडहरु सुरु @@ -397,11 +383,10 @@ डाउनलोड कहाँ गर्ने सोध प्रत्येक डाउनलोड कहाँ सेव गर्ने भनि आग्रह गरिनेछ साफ (SAF) प्रयोग - \'भण्डारण पहुँच फ्रेमवर्क\' बाह्य एसडी कार्डमा डाउनलोड गर्न अनुमति दिन्छ। -\nकेहि उपकरणहरू असंगत छन् + \'भण्डारण पहुँच फ्रेमवर्क\' बाह्य एसडी कार्डमा डाउनलोड गर्न अनुमति दिन्छ। \nकेहि उपकरणहरू असंगत छन् प्लेब्याक स्थान मेटाउ सबै प्लेब्याक स्थानहरु मेटाउँछ - सबै प्लेब्याक स्थान मेटाउने\? + सबै प्लेब्याक स्थान मेटाउने? सेवा टगल गर्नुहोस्, हाल चयन गरिएको: कसैले हेर्दै हुनुहुँदैन @@ -446,17 +431,7 @@ ExoPlayer अवरोधका कारण खोजी अवधि %d सेकेन्डमा सेट गरियो म्युट ध्वनि सुचारु - के तपाईलाई लाग्छ फिड लोडि एकदम ढिलो छ\? यदि हो भने, छिटो लोडिङ् सक्षम गर्न प्रयास गर्नुहोस् (तपाईं यसलाई सेटिंङ्हरूमा वा तलको बटन थिचेर बदल्न सक्नुहुन्छ)। -\n -\nनयाँ पाइपले दुई फिड लोड गर्ने रणनीति प्रदान गर्दछ: -\nसम्पूर्ण सदस्यता च्यानल ल्याउँदै, जुन ढिलो तर पूरा छ। -\nएक समर्पित सेवा अन्तिम पोइन्ट प्रयोग गर्दै, जुन छिटो छ तर सामान्यतया पूरा हुँदैन। -\n -\nदुई बीचको भिन्नता यो छ कि द्रुत गतिमा सामान्यतया केही जानकारीको अभाव हुन्छ, जस्तै वस्तुको अवधि वा प्रकार (प्रत्यक्ष भिडियोहरू र सामान्य बिचमा भिन्नता लिन सक्दैन) र यसले कम वस्तुहरू फिर्ता गर्न सक्छ। -\n -\n(YouTube) युटुब एक सेवाको उदाहरण हो जुन यस आरएसएस फिडको साथ यो द्रुत विधि प्रदान गर्दछ। -\n -\nत्यसो भए छनौटमा तपाईको प्राथमिकतामा निर्भर छ: गति वा सटीक जानकारी। + के तपाईलाई लाग्छ फिड लोडि एकदम ढिलो छ? यदि हो भने, छिटो लोडिङ् सक्षम गर्न प्रयास गर्नुहोस् (तपाईं यसलाई सेटिंङ्हरूमा वा तलको बटन थिचेर बदल्न सक्नुहुन्छ)। \n \nनयाँ पाइपले दुई फिड लोड गर्ने रणनीति प्रदान गर्दछ: \nसम्पूर्ण सदस्यता च्यानल ल्याउँदै, जुन ढिलो तर पूरा छ। \nएक समर्पित सेवा अन्तिम पोइन्ट प्रयोग गर्दै, जुन छिटो छ तर सामान्यतया पूरा हुँदैन। \n \nदुई बीचको भिन्नता यो छ कि द्रुत गतिमा सामान्यतया केही जानकारीको अभाव हुन्छ, जस्तै वस्तुको अवधि वा प्रकार (प्रत्यक्ष भिडियोहरू र सामान्य बिचमा भिन्नता लिन सक्दैन) र यसले कम वस्तुहरू फिर्ता गर्न सक्छ। \n \n(YouTube) युटुब एक सेवाको उदाहरण हो जुन यस आरएसएस फिडको साथ यो द्रुत विधि प्रदान गर्दछ। \n \nत्यसो भए छनौटमा तपाईको प्राथमिकतामा निर्भर छ: गति वा सटीक जानकारी। द्रुत मोड असक्षम गर्नुहोस् फास्ट मोड सक्षम पार्नुहोस् केहि सेवाहरूमा उपलब्ध छ, यो प्राय: धेरै छिटो हुन्छ तर सीमित वस्तुहरू र अक्सर अपूर्ण जानकारी फिर्ता गर्न सक्दछ (उदाहरणका लागि कुनै अवधि, वस्तुको प्रकार, कुनै लाइभ स्थिति)। @@ -466,7 +441,7 @@ फिड अपडेट अबधि फिड नयाँ - के तपाइँ यो समूह हटाउन चाहानुहुन्छ\? + के तपाइँ यो समूह हटाउन चाहानुहुन्छ? समूहको नाम खाली गर %d चयन @@ -503,15 +478,11 @@ कलाकारहरू एल्बमहरू गित - यो भिडियो उमेर प्रतिबन्धित छ।… -\n… -\nएदी तपैंलाई हेर्न परेमा, सेटिंगमा गई “%1$s” सक्षम गर्नुहोस्। + यो भिडियो उमेर प्रतिबन्धित छ।… \n… \nएदी तपैंलाई हेर्न परेमा, सेटिंगमा गई “%1$s” सक्षम गर्नुहोस्। यूट्यूब प्रतिबन्धित मोड %s द्वारा %s द्वारा सिर्जना गरिएको - यो सामग्री अझै NewPipeमा समर्थित छैन। -\n… -\nआशा छ कि भविष्यको संस्करणमा समर्थित हुनेछ। + यो सामग्री अझै NewPipeमा समर्थित छैन। \n… \nआशा छ कि भविष्यको संस्करणमा समर्थित हुनेछ। हो र आंशिक रूपमा हेरिएको भिडियोहरू सूचना पाटी रंगिन बनाउनु केहि छैन diff --git a/app/src/main/res/values-nl-rBE/strings.xml b/app/src/main/res/values-nl-rBE/strings.xml index 237e9238c..01da0694b 100644 --- a/app/src/main/res/values-nl-rBE/strings.xml +++ b/app/src/main/res/values-nl-rBE/strings.xml @@ -2,7 +2,7 @@ Tik op het loepje om te beginnen. Gepubliceerd op %1$s - Er is geen stream videospeler gevonden. Wilt u VLC installeren\? + Er is geen stream videospeler gevonden. Wilt u VLC installeren? Geen speler met stream ondersteuning gevonden (je kan VLC installeren om af te spelen). Installeren Annuleren @@ -13,7 +13,7 @@ Stream bestand downloaden Zoeken Instellingen - Bedoelde je \"%1$s\"\? + Bedoelde je \"%1$s\"? Delen met Externe videospeler gebruiken Verwijdert het geluid bij sommige resoluties @@ -41,7 +41,7 @@ Hogere resoluties weergeven Slechts enkele toestellen kunnen 2K- en 4K-video\'s afspelen Afspelen met Kodi - Wilt u de missende Kore-app installeren\? + Wilt u de missende Kore-app installeren? Toon “Afspelen met Kodi”-optie Toont een optie om video af te spelen op een Kodi media center Audio @@ -178,8 +178,7 @@ Even geduld… Gekopieerd naar klembord Kies een beschikbare download map - Deze toestemming is vereist om -\nte openen in pop-up modus + Deze toestemming is vereist om \nte openen in pop-up modus reCAPTCHA-uitdaging reCAPTCHA-uitdaging gevraagd Download @@ -206,7 +205,7 @@ Licentie lezen Geschiedenis Geschiedenis - Wilt u dit item verwijderen uit uw zoekgeschiedenis\? + Wilt u dit item verwijderen uit uw zoekgeschiedenis? Laatst afgespeeld Meest afgespeeld Inhoud van hoofdpagina @@ -247,7 +246,7 @@ Instellen als miniatuur voor afspeellijst Afspeellijst toevoegen aan bladwijzers Bladwijzer verwijderen - Deze afspeellijst verwijderen\? + Deze afspeellijst verwijderen? Afspeellijst aangemaakt Toegevoegd aan afspeellijst Miniatuur voor afspeellijst gewijzigd. @@ -270,46 +269,29 @@ Vorige exportering Kon abonnementen niet importeren Kon abonnementen niet exporteren - Importeer je YouTube-abonnementen vanaf Google Takeout: -\n -\n1. Ga naar dit adres: %1$s -\n2. Log in op je account -\n3. Klik op \"Alle YouTube-gegevens inbegrepen\", dan op \"Selectie van alle items ongedaan maken\", dan selecteer alleen \"abonnementen\" en klik op \"OK\" -\n4. Klik op \"Volgende stap\", dan op \"Export maken\" -\n5. Klik op de knop \"Downloaden\" nadat deze verschijnt -\n6. Klik op IMPORTEER BESTAND hieronder en selecteer het gedownloade zip-bestand -\n7. [Als de zip import faalt] Pak het .csv bestand uit (gebruikelijk in de folder \"YouTube en YouTube Music/abonnementen/abonnementen.csv), klik op IMPORTEER BESTAND hieronder en selecteer het uitgepakt csv bestand - Importeer een SoundCloud-profiel door de URL of het ID ervan in te voeren: -\n -\n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten) -\n2. Ga naar dit adres: %1$s -\n3. Log in op uw account -\n4. Kopieer de koppeling van de pagina waar u op terechtkomt (dat is uw profiel-URL). + Importeer je YouTube-abonnementen vanaf Google Takeout: \n \n1. Ga naar dit adres: %1$s \n2. Log in op je account \n3. Klik op \"Alle YouTube-gegevens inbegrepen\", dan op \"Selectie van alle items ongedaan maken\", dan selecteer alleen \"abonnementen\" en klik op \"OK\" \n4. Klik op \"Volgende stap\", dan op \"Export maken\" \n5. Klik op de knop \"Downloaden\" nadat deze verschijnt \n6. Klik op IMPORTEER BESTAND hieronder en selecteer het gedownloade zip-bestand \n7. [Als de zip import faalt] Pak het .csv bestand uit (gebruikelijk in de folder \"YouTube en YouTube Music/abonnementen/abonnementen.csv), klik op IMPORTEER BESTAND hieronder en selecteer het uitgepakt csv bestand + Importeer een SoundCloud-profiel door de URL of het ID ervan in te voeren: \n \n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten) \n2. Ga naar dit adres: %1$s \n3. Log in op uw account \n4. Kopieer de koppeling van de pagina waar u op terechtkomt (dat is uw profiel-URL). uwID, soundbutt.com/uwid - Let op: deze actie kan veel MB’s van uw netwerk gebruiken. -\n -\nWilt u doorgaan\? + Let op: deze actie kan veel MB’s van uw netwerk gebruiken. \n \nWilt u doorgaan? Afspeelsnelheidsbesturing Tempo Toon Ontkoppelen (kan ruis veroorzaken) Wissen afspeel geschiedenis Verwijdert de geschiedenis van bekeken video\'s en afspeelposities - Alle afspeel geschiedenis verwijderen\? + Alle afspeel geschiedenis verwijderen? Afspeel geschiedenis verwijderd Zoekgeschiedenis wissen Verwijdert de gebruikte zoektermen - De hele zoekgeschiedenis verwijderen\? + De hele zoekgeschiedenis verwijderen? Zoekgeschiedenis verwijderd 1 item verwijderd. NewPipe is vrije software: u kan het gebruiken, bestuderen, delen en verbeteren zoveel u maar wil. U kan het opnieuw uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) om het even welke latere versie. - Wilt u ook de instellingen importeren\? + Wilt u ook de instellingen importeren? Privacybeleid van NewPipe - Het NewPipe-project neemt privacy serieus. Daarom verzamelt de app geen gegevens zonder uw toestemming. -\nNewPipe\'s privacybeleid legt gedetailleerd uit welke gegevens verstuurd en opgeslagen worden als u een crashrapport verstuurt. + Het NewPipe-project neemt privacy serieus. Daarom verzamelt de app geen gegevens zonder uw toestemming. \nNewPipe\'s privacybeleid legt gedetailleerd uit welke gegevens verstuurd en opgeslagen worden als u een crashrapport verstuurt. Privacybeleid lezen - Om de Europese Algemene Verordening Gegevensbescherming (ook wel: AVG of GDPR) na te leven, wijzen we u op het nieuwe privacybeleid van NewPipe. Lees dit zorgvuldig. -\nU moet het beleid aanvaarden om ons het foutrapport te kunnen opsturen. + Om de Europese Algemene Verordening Gegevensbescherming (ook wel: AVG of GDPR) na te leven, wijzen we u op het nieuwe privacybeleid van NewPipe. Lees dit zorgvuldig. \nU moet het beleid aanvaarden om ons het foutrapport te kunnen opsturen. Aanvaarden Weigeren Onbeperkt @@ -334,10 +316,10 @@ Appupdatemelding Meldingen voor nieuwe versies van NewPipe Externe opslag niet beschikbaar - Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen\? + Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen? Fout bij het lezen van de opgeslagen tabbladen, waardoor standaard tabbladen worden gebruikt Standaard instellingen herstellen - Wil je de standaard instellingen herstellen\? + Wil je de standaard instellingen herstellen? Aantal abonnees niet beschikbaar Welke tabbladen er worden weergegeven op de hoofdpagina Conferenties @@ -386,20 +368,8 @@ Door %s Gemaakt door %s Kanaal avatar afbeelding - Deze inhoud wordt nog niet ondersteund door NewPipe. -\n -\nHopelijk zal dit bij een toekomstige versie ondersteund worden. - Denk je dat het laden van de feed te sloom is\? Zo ja, probeer snel laden in te schakelen (in de instellingen of door op onderstaande knop te drukken). -\n -\nNewPipe biedt twee strategieën aan voor het laden van de feed: -\n• Het hele abonnementskanaal ophalen, wat sloom maar compleet is. -\n• Een speciale feed ophalen, wat snel maar meestal incompleet is. -\n -\nHet verschil tussen de twee is dat de snelle meestal wat informatie mist, zoals de duur of type (live of een normale video) van het item en dat er mogelijk minder items zijn. -\n -\nYouTube is een voorbeeld van een service die deze snelle methode aanbiedt door zijn RSS-feed. -\n -\nDe keuze komt dus neer op wat je liever hebt: snelheid of precieze informatie. + Deze inhoud wordt nog niet ondersteund door NewPipe. \n \nHopelijk zal dit bij een toekomstige versie ondersteund worden. + Denk je dat het laden van de feed te sloom is? Zo ja, probeer snel laden in te schakelen (in de instellingen of door op onderstaande knop te drukken). \n \nNewPipe biedt twee strategieën aan voor het laden van de feed: \n• Het hele abonnementskanaal ophalen, wat sloom maar compleet is. \n• Een speciale feed ophalen, wat snel maar meestal incompleet is. \n \nHet verschil tussen de twee is dat de snelle meestal wat informatie mist, zoals de duur of type (live of een normale video) van het item en dat er mogelijk minder items zijn. \n \nYouTube is een voorbeeld van een service die deze snelle methode aanbiedt door zijn RSS-feed. \n \nDe keuze komt dus neer op wat je liever hebt: snelheid of precieze informatie. Snelle modus uitschakelen Snelle modus inschakelen Beschikbaar in sommige services, het is meestal veel sneller, maar kan een beperkte hoeveelheid items en vaak onvolledige informatie (bijv. geen duur, item type, of live status) bevatten. @@ -410,7 +380,7 @@ Feed Toon enkel niet gegroepeerde abonnementen Nieuw - Wilt u deze groep verwijderen\? + Wilt u deze groep verwijderen? Lege groepsnaam %d geselecteerd @@ -447,8 +417,7 @@ Systeem standaard App taal Kies een instantie - Het \'Storage Access Framework\' laat downloads naar een externe SD kaart toe. -\nNiet alle toestellen zijn compatibel + Het \'Storage Access Framework\' laat downloads naar een externe SD kaart toe. \nNiet alle toestellen zijn compatibel Gebruik SAF Vraag waar te downloaden U wordt gevraagd waar elk bestand wordt opgeslagen @@ -457,7 +426,7 @@ Maximaal 1 bestand tegelijk zal worden gedownload Limiteer de download wachtrij Verwijder gedownloade bestanden - Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen\? + Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen? Download geschiedenis verwijderen Kan deze download niet herstellen Verbinding time-out @@ -506,7 +475,7 @@ Geef toestemming voor weergave over andere apps Stream bestand downloaden Afspeelposities verwijderd - Alle afspeelposities verwijderen\? + Alle afspeelposities verwijderen? Verwijdert alle geschiedenis van afspeelposities Verwijder geschiedenis afspeelposities Verwijder cookies die NewPipe opslaat wanneer u een reCAPTCHA oplost @@ -516,9 +485,7 @@ Albums Nummers Video\'s - Deze video heeft een leeftijdsbeperking. -\n -\nSchakel \"%1$s\" in bij de instellingen als u die wilt zien. + Deze video heeft een leeftijdsbeperking. \n \nSchakel \"%1$s\" in bij de instellingen als u die wilt zien. YouTube biedt een \"beperkte modes\" aan, dit verbergt mogelijk materiaal voor volwassenen YouTube \"beperkte modus\" aanzetten Toon inhoud die mogelijk niet geschikt is voor kinderen omwille van een leeftijdslimiet (zoals 18+) @@ -530,7 +497,7 @@ Vind het kanaal dat u leuk vindt op %s Selecteer je favoriete PeerTube kanaal PeerTube kanaal - Kon de URL niet herkennen. In een andere app openen\? + Kon de URL niet herkennen. In een andere app openen? Wis data Laat afspeeltijd in afspeellijst zien Posities in lijst @@ -571,8 +538,7 @@ Beschrijving Gerelateerde items Reacties - Deze video heeft een leeftijdsbeperking. -\nAls gevolg van het nieuwe YouTube-beleid met video\'s met leeftijdsbeperkingen heeft NewPipe geen toegang tot deze videostreams en kan deze dus niet afspelen. + Deze video heeft een leeftijdsbeperking. \nAls gevolg van het nieuwe YouTube-beleid met video\'s met leeftijdsbeperkingen heeft NewPipe geen toegang tot deze videostreams en kan deze dus niet afspelen. Zet uit om videobeschrijving en extra informatie te verbergen Toon beschrijving Nacht thema diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 82a6f4a7c..f23a9c90f 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -1,7 +1,7 @@ Gepubliceerd op %1$s - Geen videospeler met streamondersteuning gevonden. VLC installeren\? + Geen videospeler met streamondersteuning gevonden. VLC installeren? Installeren Annuleren Openen in browser @@ -9,14 +9,14 @@ Downloaden Zoeken Instellingen - Bedoelde je \"%1$s\"\? + Bedoelde je \"%1$s\"? Delen met Downloadlocatie voor video\'s Locatie om gedownloade video\'s in op te slaan Voer de downloadlocatie in voor video\'s Standaardresolutie Afspelen met Kodi - Ontbrekende Kore-app installeren\? + Ontbrekende Kore-app installeren? Optie ‘Afspelen met Kodi’ tonen Toont een optie om een video af te spelen via Kodi media center Audio @@ -84,8 +84,7 @@ reCAPTCHA-uitdaging gevraagd Openen in pop-upmodus Alles - Deze machtiging is vereist om te -\nopenen in pop-upmodus + Deze machtiging is vereist om te \nopenen in pop-upmodus Speelt af in pop-upmodus Standaard­videoformaat Uitgeschakeld @@ -229,7 +228,7 @@ Instellen als miniatuur voor afspeellijst Afspeellijst toevoegen aan bladwijzers Bladwijzer verwijderen - Deze afspeellijst verwijderen\? + Deze afspeellijst verwijderen? Afspeellijst gecreëerd Toegevoegd aan afspeellijst Miniatuur voor afspeellijst gewijzigd. @@ -261,25 +260,10 @@ Vorige exportering De abonnementen kunnen niet worden geïmporteerd De abonnementen kunnen niet worden geëxporteerd - Importeer je YouTube-abonnementen vanaf Google Takeout: -\n -\n1. Ga naar dit adres: %1$s -\n2. Log in op je account -\n3. Druk op ‘Alle YouTube-gegevens inbegrepen’, dan op ‘Selectie van alle items ongedaan maken’, dan selecteer alleen ‘abonnementen’ en druk op ‘OK’ -\n4. Druk op ‘Volgende stap’, dan op ‘Export maken’ -\n5. Druk op de knop ‘Downloaden’ nadat deze verschijnt -\n6. Druk onder op ‘Bestand importeren’ en selecteer de gedownloade zip file -\n7. [Als de zip-import faalt] Uit het zip-bestand, pak de .csv uit (normaal in de map ‘YouTube en YouTube Music/abonnementen/abonnementen.csv’), druk onder op ‘Bestand importeren’ en selecteer het uitgepakte zip-bestand - Importeer een SoundCloud-profiel door de URL of het ID ervan in te voeren: -\n -\n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten) -\n2. Ga naar dit adres: %1$s -\n3. Log in op je account -\n4. Kopieer de koppeling van de pagina waar je op terechtkomt (dat is je profiel-URL). + Importeer je YouTube-abonnementen vanaf Google Takeout: \n \n1. Ga naar dit adres: %1$s \n2. Log in op je account \n3. Druk op ‘Alle YouTube-gegevens inbegrepen’, dan op ‘Selectie van alle items ongedaan maken’, dan selecteer alleen ‘abonnementen’ en druk op ‘OK’ \n4. Druk op ‘Volgende stap’, dan op ‘Export maken’ \n5. Druk op de knop ‘Downloaden’ nadat deze verschijnt \n6. Druk onder op ‘Bestand importeren’ en selecteer de gedownloade zip file \n7. [Als de zip-import faalt] Uit het zip-bestand, pak de .csv uit (normaal in de map ‘YouTube en YouTube Music/abonnementen/abonnementen.csv’), druk onder op ‘Bestand importeren’ en selecteer het uitgepakte zip-bestand + Importeer een SoundCloud-profiel door de URL of het ID ervan in te voeren: \n \n1. Kies een webbrowser en schakel bureaubladmodus in (de website is niet beschikbaar voor mobiele apparaten) \n2. Ga naar dit adres: %1$s \n3. Log in op je account \n4. Kopieer de koppeling van de pagina waar je op terechtkomt (dat is je profiel-URL). jouwID, soundcloud.com/jouwid - Let op: deze actie kan veel MB’s van je mobiele netwerk gebruiken. -\n -\nWil je doorgaan? + Let op: deze actie kan veel MB’s van je mobiele netwerk gebruiken. \n \nWil je doorgaan? Afbeeldingscache gewist Gecachete metagegevens wissen Alle gecachete webpagina-gegevens wissen @@ -295,21 +279,19 @@ Ondertitelgrootte en -achtergrondstijlen wijzigen. Vereist een herstart van de app Kijkgeschiedenis wissen Verwijdert de geschiedenis van bekeken video\'s en afspeelposities - De gehele kijkgeschiedenis wissen\? + De gehele kijkgeschiedenis wissen? Kijkgeschiedenis gewist Zoekgeschiedenis wissen Verwijdert de gebruikte zoektermen - De gehele zoekgeschiedenis wissen\? + De gehele zoekgeschiedenis wissen? Zoekgeschiedenis gewist 1 item verwijderd. NewPipe is vrije software: je kan het gebruiken, bestuderen, delen en verbeteren zoveel je maar wilt. Je kan het opnieuw uitgeven en/of aanpassen volgens de voorwaarden van de GNU General Public License, gepubliceerd door de Free Software Foundation, versie 3 van de licentie, of (indien gewenst) om het even welke latere versie. Wil je ook de instellingen importeren? Privébeleid van NewPipe - Het NewPipe-project neemt privacy serieus. Daarom verzamelt de app geen gegevens zonder jouw toestemming. -\nNewPipe\'s privacybeleid legt gedetailleerd uit welke gegevens verstuurd en opgeslagen worden als je een crashrapport verstuurt. + Het NewPipe-project neemt privacy serieus. Daarom verzamelt de app geen gegevens zonder jouw toestemming. \nNewPipe\'s privacybeleid legt gedetailleerd uit welke gegevens verstuurd en opgeslagen worden als je een crashrapport verstuurt. Privébeleid lezen - Om de Europese Algemene Verordening Gegevensbescherming (ook wel: AVG of GDPR) na te leven, wijzen we je op het nieuwe privacybeleid van NewPipe. Lees dit zorgvuldig. -\nJe moet het beleid accepteren om ons het foutrapport te kunnen sturen. + Om de Europese Algemene Verordening Gegevensbescherming (ook wel: AVG of GDPR) na te leven, wijzen we je op het nieuwe privacybeleid van NewPipe. Lees dit zorgvuldig. \nJe moet het beleid accepteren om ons het foutrapport te kunnen sturen. Accepteren Weigeren Ongelimiteerd @@ -333,10 +315,10 @@ App-updates Meldingen voor nieuwe New Pipe versies Externe opslag niet beschikbaar - Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen\? + Downloaden naar externe SD-kaart is niet mogelijk. Download map opnieuw instellen? Fout bij lezen van opgeslagen tabbladen, standaard­tabbladen worden gebruikt Standaardinstellingen herstellen - Wil je de standaardinstellingen herstellen\? + Wil je de standaardinstellingen herstellen? Aantal abonnees niet beschikbaar Welke tabbladen worden weergegeven op de hoofdpagina Bijwerken @@ -395,18 +377,17 @@ Er is al een download met deze naam bezig Geen vrije ruimte meer op het apparaat Voortgang verloren, omdat bestand was verwijderd - Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen\? + Wilt u de downloadgeschiedenis of alle gedownloade bestanden verwijderen? Download­wachtrij limiteren Er zal maximaal 1 bestand tegelijk worden gedownload Downloads starten Downloads pauzeren Vragen waar bestanden gedownload moeten worden - U wordt gevraagd waar elk bestand wordt opgeslagen. -\nSchakel de systeem map kiezer (SAF) in als u naar een externe SD-kaart wilt downloaden + U wordt gevraagd waar elk bestand wordt opgeslagen. \nSchakel de systeem map kiezer (SAF) in als u naar een externe SD-kaart wilt downloaden Mapkiezer van systeem gebruiken (SAF) Afspeelposities verwijderen Verwijdert alle afspeelposities - Alle afspeelposities verwijderen\? + Alle afspeelposities verwijderen? Niemand is aan het kijken %s kijker @@ -472,7 +453,7 @@ %d geselecteerde Lege groepsnaam - Wilt u deze groep verwijderen\? + Wilt u deze groep verwijderen? Nieuw Feed Drempel voor feedupdate @@ -482,34 +463,20 @@ Beschikbaar in sommige services, het is meestal veel sneller, maar kan een beperkte hoeveelheid items en vaak onvolledige informatie (bijv. geen duur, itemtype, of livestatus) bevatten Snelle modus inschakelen Snelle modus uitschakelen - Denk je dat het laden van de feed te sloom is\? Zo ja, probeer snel laden in te schakelen (in de instellingen of door op onderstaande knop te drukken). -\n -\nNewPipe biedt twee strategieën aan voor het laden van de feed: -\n• Het hele abonnementskanaal ophalen, wat sloom maar compleet is. -\n• Een speciale feed ophalen, wat snel maar meestal incompleet is. -\n -\nHet verschil tussen de twee is dat de snelle meestal wat informatie mist, zoals de duur of type (live of een normale video) van het item en dat er mogelijk minder items zijn. -\n -\nYouTube is een voorbeeld van een service die deze snelle methode aanbiedt door zijn RSS-feed. -\n -\nDe keuze komt dus neer op wat je liever hebt: snelheid of precieze informatie. + Denk je dat het laden van de feed te sloom is? Zo ja, probeer snel laden in te schakelen (in de instellingen of door op onderstaande knop te drukken). \n \nNewPipe biedt twee strategieën aan voor het laden van de feed: \n• Het hele abonnementskanaal ophalen, wat sloom maar compleet is. \n• Een speciale feed ophalen, wat snel maar meestal incompleet is. \n \nHet verschil tussen de twee is dat de snelle meestal wat informatie mist, zoals de duur of type (live of een normale video) van het item en dat er mogelijk minder items zijn. \n \nYouTube is een voorbeeld van een service die deze snelle methode aanbiedt door zijn RSS-feed. \n \nDe keuze komt dus neer op wat je liever hebt: snelheid of precieze informatie. Service wisselen, momenteel geselecteerd: Meest geliked NewPipe werd gesloten terwijl het bezig was met het bestand Nummers Albums Artiesten - Deze inhoud wordt nog niet ondersteund door NewPipe. -\n -\nHopelijk zal dit bij een toekomstige versie ondersteund worden. + Deze inhoud wordt nog niet ondersteund door NewPipe. \n \nHopelijk zal dit bij een toekomstige versie ondersteund worden. Ja, en deels bekeken video\'s Streams die zijn bekeken voor, en na ze werden toegevoegd aan de afspeellijst worden verwijderd. \nWeet u dit zeker? Bekeken streams verwijderen? ∞ video\'s 100+ video\'s - Deze video heeft een leeftijdsbeperking. -\n -\nSchakel ‘%1$s’ in onder instellingen als u het wilt zien. + Deze video heeft een leeftijdsbeperking. \n \nSchakel ‘%1$s’ in onder instellingen als u het wilt zien. Bekeken verwijderen Originele teksten van services zijn zichtbaar in stream-items YouTube\'s ‘Beperkte modus’ inschakelen @@ -529,7 +496,7 @@ Enkel via Wi-Fi Start automatisch met afspelen — %s Wachtrij afspelen - Kon de URL niet herkennen. In een andere app openen\? + Kon de URL niet herkennen. In een andere app openen? De actieve speler­wachtrij zal worden vervangen Veranderen van één speler naar een andere kan jouw wachtrij vervangen Vraag bevestiging alvorens de wachtrij te wissen @@ -582,8 +549,7 @@ Deze inhoud is niet beschikbaar in uw land. App laten crashen Oplossen - Deze video heeft een leeftijdsbeperking. -\nVanwege nieuw YouTube-beleid over video\'s met leeftijdsbeperking, heeft NewPipe geen toegang tot zijn videostreams en kan deze dus niet afspelen. + Deze video heeft een leeftijdsbeperking. \nVanwege nieuw YouTube-beleid over video\'s met leeftijdsbeperking, heeft NewPipe geen toegang tot zijn videostreams en kan deze dus niet afspelen. Downloaden is gestart U kunt uw favoriete nachtthema hieronder selecteren Selecteer uw favoriete nachtthema — %s @@ -613,9 +579,7 @@ Website openen Account getermineerd De snelle feed mode levert hierover niet meer informatie. - De account van de auteur is getermineerd. -\nNewPipe zal niet in staat zijn deze feed in de toekomst te laden. -\nWeet u zeker dat u wilt unsubscriben van dit kanaal\? + De account van de auteur is getermineerd. \nNewPipe zal niet in staat zijn deze feed in de toekomst te laden. \nWeet u zeker dat u wilt unsubscriben van dit kanaal? Kan geen feed laden voor \'%s\'. Error bij het inladen van de feed Vanaf Android 10 is enkel \'Storage Access Framework\' ondersteund @@ -657,10 +621,8 @@ Er is een fout opgetreden, zie de melding Maak een foutmelding Korte foutmelding weergeven - Er is geen geschikte bestandsbeheerder gevonden voor deze actie. -\nInstalleer een bestandsbeheerder of probeer \'%s\' uit te schakelen in de download instellingen - Er is geen geschikte bestandsbeheerder gevonden voor deze actie. -\nInstalleer een bestandsbeheerder die compatibel is met het Storage Access Framework + Er is geen geschikte bestandsbeheerder gevonden voor deze actie. \nInstalleer een bestandsbeheerder of probeer \'%s\' uit te schakelen in de download instellingen + Er is geen geschikte bestandsbeheerder gevonden voor deze actie. \nInstalleer een bestandsbeheerder die compatibel is met het Storage Access Framework Vastgemaakt commentaar LeakCanary is niet beschikbaar ExoPlayer standaard @@ -687,7 +649,7 @@ %s nieuwe streams Je bent nu geabonneerd op dit kanaal - Alle gedownloade bestanden van schijf wissen\? + Alle gedownloade bestanden van schijf wissen? De geselecteerde stream wordt niet ondersteund door externe spelers Er zijn geen videostreams beschikbaar voor externe spelers Onbekende kwaliteit @@ -714,8 +676,8 @@ Rechter gebaaractie Geen Duplicaten verwijderen - Duplicaten verwijderen\? - Wil je alle dubbele streams in deze afspeellijst verwijderen\? + Duplicaten verwijderen? + Wil je alle dubbele streams in deze afspeellijst verwijderen? Streams weergeven/verbergen Volledig bekeken Gedeeltelijk bekeken @@ -728,9 +690,7 @@ Kies een gebaar voor de linkerhelft van het spelersscherm Laat de volgende streams zien Selecteer een audiotrack met beschrijvingen voor slechtzienden, indien beschikbaar - Deze tijdelijke oplossing geeft videocodecs vrij en activeert ze opnieuw wanneer er een oppervlakteverandering optreedt, in plaats van de oppervlakte rechtstreeks op de codec in te stellen. Dit wordt al gebruikt door ExoPlayer op sommige apparaten met dit probleem; deze instelling heeft alleen effect op Android 6 en hoger -\n -\nAls je deze optie inschakelt, voorkom je mogelijk afspeelfouten bij het wisselen van de huidige videospeler of het overschakelen naar volledig scherm + Deze tijdelijke oplossing geeft videocodecs vrij en activeert ze opnieuw wanneer er een oppervlakteverandering optreedt, in plaats van de oppervlakte rechtstreeks op de codec in te stellen. Dit wordt al gebruikt door ExoPlayer op sommige apparaten met dit probleem; deze instelling heeft alleen effect op Android 6 en hoger \n \nAls je deze optie inschakelt, voorkom je mogelijk afspeelfouten bij het wisselen van de huidige videospeler of het overschakelen naar volledig scherm Wijzig de grootte van het laadinterval voor progressieve inhoud (momenteel %s). Een lagere waarde kan het initiële laden versnellen Geef de voorkeur aan originele audio Selecteer de originele audiotrack, ongeacht de taal @@ -793,8 +753,7 @@ Live URL-lijst delen Delen met titels - %1$s -\n%2$s + %1$s \n%2$s Afspeellijst delen - %1$s: %2$s @@ -807,13 +766,10 @@ Onvoldoende vrije ruimte op het apparaat Ja Herstelt alle instellingen naar hun standaard­waarde - Als u alle instellingen reset worden al uw voorkeurs­instellingen verwijderd en wordt de app opnieuw gestart. -\n -\nWeet u zeker dat u verder wilt gaan? + Als u alle instellingen reset worden al uw voorkeurs­instellingen verwijderd en wordt de app opnieuw gestart. \n \nWeet u zeker dat u verder wilt gaan? Nee Back-up en herstel - NewPipe kan van tijd tot tijd auto­matisch controleren op nieuwe versies en u op de hoogte stellen zodra deze beschik­baar zijn. -\nWilt u dit inschakelen? + NewPipe kan van tijd tot tijd auto­matisch controleren op nieuwe versies en u op de hoogte stellen zodra deze beschik­baar zijn. \nWilt u dit inschakelen? Instellingen resetten De instellingen in de export die wordt geïmporteerd, gebruiken een kwetsbaar formaat dat verouderd is sinds NewPipe 0.27.0. Zorg ervoor dat de export die wordt geïmporteerd afkomstig is van een vertrouwde bron, en geef er de voorkeur aan om in de toekomst alleen exporten te gebruiken die zijn verkregen van NewPipe 0.27.0 of nieuwer. Ondersteuning voor het importeren van instellingen in dit kwetsbare formaat zal binnenkort volledig worden verwijderd, en oude versies van NewPipe zullen dan geen export­instellingen meer uit nieuwe versies kunnen importeren. secundair diff --git a/app/src/main/res/values-nn/strings.xml b/app/src/main/res/values-nn/strings.xml index 876e69e0e..4191439cd 100644 --- a/app/src/main/res/values-nn/strings.xml +++ b/app/src/main/res/values-nn/strings.xml @@ -2,7 +2,7 @@ Trykk på aukeglaset for å byrja. Gjeve ut den %1$s - Fann ingen straumavspelarar. Legg inn VLC\? + Fann ingen straumavspelarar. Legg inn VLC? Fann ingen straumavspelarar (du kan leggja inn VLC for å spela av straumen). Legg inn Avbryt @@ -14,7 +14,7 @@ Del Søk Innstillingar - Meinte du «%1$s»\? + Meinte du «%1$s»? Del med Nytt ytre videospelar Tek bort ljod ved somme oppløysingar @@ -42,7 +42,7 @@ Videohentingsmappe Henta ljodfiler vert gøymde her Vel hentemappe for ljodfiler - Legg inn saknande Kore-app\? + Legg inn saknande Kore-app? Viser svar for: %s Greidde ikkje å brigde fylginga Nettbrettvising @@ -99,7 +99,7 @@ Vis søkjeframlegg ved søk Visingshistorikk Spel av der du slapp - Kjente ikkje att nettadressa. Opn med ein annan app\? + Kjente ikkje att nettadressa. Opn med ein annan app? Forvalt innhaldsland Avspelar Krasj avspelaren diff --git a/app/src/main/res/values-nqo/strings.xml b/app/src/main/res/values-nqo/strings.xml index ee17b0921..eaba0cd74 100644 --- a/app/src/main/res/values-nqo/strings.xml +++ b/app/src/main/res/values-nqo/strings.xml @@ -188,11 +188,8 @@ ߕߏߟߏ߲ߟߊ߲߫ ߠߊ߫ ߛߐߓߌ߬ߘߐ߬ߓߏ߲ ߞߊ߬ ߞߣߐߘߐ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߦߌ߬ߘߊ߬ ߞߊ߬ ߞߣߐߘߐ ߟߎ߬ ߦߌ߬ߘߊ߬ ߤߊߟߌ߬ ߘߋ߲ߣߍ߲ ߠߎ߬ ߡߊ߲ߞߊ߲߫ ߞߊ߬ ߡߍ߲ ߡߊߝߍߣߍ߲߫ (ߦߏ߫ +߁߈) - ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߮ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. -\n -\n\"%1$s\" ߟߊߢߊ߯ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߝߟߍ߫. - ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߯ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. -\nߦߕߎߓߎ߫ ߟߊ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߏߛߐ߲߬ ߞߊ߬ ߓߍ߲߬ ߖߌ߬ߦߊ߬ߖߟߎ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲ߠߊߕߍ߰ߣߍ߲ ߠߎ߬ ߠߊ߫ ߞߏ ߡߊ߬، ߣߌߎߔߌߔ ߕߍ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߥߦߏ ߣߌ߲߬ ߛߌ߫ ߟߊߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߏ߬ ߞߏߟߐ߲߬ ߊ߬ ߕߍ߫ ߛߴߊ߬ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫. + ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߮ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. \n \n\"%1$s\" ߟߊߢߊ߯ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߝߟߍ߫. + ߛߐ߬ߘߐ߲߬ߛߌ߰ ߘߊ߲ߠߊߕߍ߯ ߦߋ߫ ߖߌ߬ߦߊ߬ߖߟߎ ߣߌ߲߬ ߠߊ߫. \nߦߕߎߓߎ߫ ߟߊ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߏߛߐ߲߬ ߞߊ߬ ߓߍ߲߬ ߖߌ߬ߦߊ߬ߖߟߎ߫ ߛߐ߬ߘߐ߲߬ߛߌ߯ ߘߊ߲ߠߊߕߍ߰ߣߍ߲ ߠߎ߬ ߠߊ߫ ߞߏ ߡߊ߬، ߣߌߎߔߌߔ ߕߍ߫ ߛߋ߫ ߦߋߡߍ߲ߕߊ߫ ߥߦߏ ߣߌ߲߬ ߛߌ߫ ߟߊߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߏ߬ ߞߏߟߐ߲߬ ߊ߬ ߕߍ߫ ߛߴߊ߬ߟߎ߬ ߕߏߟߏ߲߫ ߠߊ߫. ߞߊ߬ ߟߐ߲ߕߊߓߘߐ ߟߊߛߣߍ߫ ߞߐߕߐ߮ ߓߘߊ߫ ߖߏ߬ߛߌ߫ ߣߌߎߔߌߔ ߕߏߟߏ߲ߟߊ߲߫ ߛߏ߬ߓߌ߬ߘߐ߬ߓߏ߲ ߠߎ߬ @@ -370,8 +367,7 @@ ߊ߬ ߓߘߊ߫ ߓߊߓߌߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫ ߊ߬ ߡߊ߫ ߛߋ߫ ߓߊߓߌߟߊ߫ ߟߊ߫ ߞߓߊ߬ߞߘߐ߬ߘߏ߲ ߘߐ߫ ߢߋߙߋ߲ߞߎ߲߫ ߖߊ߬ߕߋ߬ߓߐ - ߡߊ߬ߞߏ ߦߋ߫ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߣߌ߲߬ ߠߊ߫ ߞߊ߬ -\nߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߊߦߟߍ߬ + ߡߊ߬ߞߏ ߦߋ߫ ߟߊ߬ߘߌ߬ߢߍ߬ߟߌ ߣߌ߲߬ ߠߊ߫ ߞߊ߬ \nߝߎ߲ߞߊ߲ߡߊ߫ ߗߏ߯ߦߊ ߘߊߦߟߍ߬ ߝߛߌ߬ ߞߋߟߋ߲߫ ߓߘߊ߫ ߖߏ߬ߛߌ߬. ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭ ߡߐ߰ߦߊ߬ߟߐ߲߫ ߓߋ߭ ߡߊߢߌߣߌ߲ߣߍ߲߫ @@ -444,8 +440,7 @@ ߛߓߍߘߋ߲ ߣߋ߫ ߖߊ߬ߕߋ߬ߘߋ߲ ߠߎ߬ ߥߦߏ߬ ߘߐ߬ߞߊ߬ߙߊ߲߬ߠߊ ߞߊߟߌ߲ ߣߌ߫ ߝߍ߯ߡߊ߲ ߊ߲ߘߙߏߦߌߘ ߞߊ߲߬. ߣߌߎߔߌߔ ߟߊߥߙߌߞߌߣߍ߲߫ ߓߐߒߖߘߍߘߐߓߊ߮ ߟߎ߫ ߟߋ߬ ߓߟߏ߫ ߊ߬ߟߎ߬ ߟߊ߫ ߕߎ߬ߡߊ߬ ߘߐ߬ߞߏߟߏ߲ ߠߎ߬ ߘߐ߫߸ ߞߴߊ߬ ߟߊߢߊ߬ ߊ߬ߟߎ߬ ߛߋߞߏ߫ ߘߊ߬ߡߊ߬ߦߌߙߊ ߟߊ߫. ߌ ߘߌ߫ ߛߋ߫ ߝߌ߬ߙߋ߲߬ߕߎ߬ ߛߐ߲ߞߐ ߘߌ߫ ߟߴߊ߬ߟߎ߫ ߡߊ߬߸ ߞߴߊ߬ߟߎ߬ ߞߣߐߘߐߘߌߦߊ߫ ߟߢߊ߬ߟߌ ߟߊ߫ ߓߘߍߞߍ. - ߣߌߎߔߌߔ ߘߊߞߎ߲ ߦߴߊߟߎ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߕߊ߬ ߟߊ߫ ߛߍ߬ߓߍ ߖߍ߬ߘߍߖߍ߬ߘߍ ߟߋ߬ ߟߊ߫. ߏ߬ ߘߐ߫߸ ߟߥߊߟߌߟߊ߲ ߕߍ߫ ߟߐ߲ߕߊ߫ ߛߌ߫ ߟߥߊ߫ ߟߊ߫ ߣߴߊ߬ ߡߴߌ ߟߊ߫ ߘߌ߬ߢߍ ߢߌߣߌ߲߫. -\nߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߦߴߊ߬ ߝߊߙߊ߲ߝߊ߯ߛߌ߫ ߟߴߌ ߢߍ߫ ߟߋ߬ ߥߘߋ߬ߥߘߋ߬ߟߌ ߘߝߊߣߍ߲ ߘߐ߫߸ ߟߐ߲ߕߊ߫ ߢߌ߬ߡߊ߲߬ ߠߥߊߕߐ߫ ߊ߬ ߣߌ߫ ߢߌ߬ߡߊ߲߬ ߠߊߞߎ߲߬ߘߎ߲߬ߕߐ߫ ߌ ߓߊ߫ ߞߍ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߟߊ߫. + ߣߌߎߔߌߔ ߘߊߞߎ߲ ߦߴߊߟߎ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߕߊ߬ ߟߊ߫ ߛߍ߬ߓߍ ߖߍ߬ߘߍߖߍ߬ߘߍ ߟߋ߬ ߟߊ߫. ߏ߬ ߘߐ߫߸ ߟߥߊߟߌߟߊ߲ ߕߍ߫ ߟߐ߲ߕߊ߫ ߛߌ߫ ߟߥߊ߫ ߟߊ߫ ߣߴߊ߬ ߡߴߌ ߟߊ߫ ߘߌ߬ߢߍ ߢߌߣߌ߲߫. \nߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ ߓߘߍ߬ߓߘߍ߬ߟߌ ߦߴߊ߬ ߝߊߙߊ߲ߝߊ߯ߛߌ߫ ߟߴߌ ߢߍ߫ ߟߋ߬ ߥߘߋ߬ߥߘߋ߬ߟߌ ߘߝߊߣߍ߲ ߘߐ߫߸ ߟߐ߲ߕߊ߫ ߢߌ߬ߡߊ߲߬ ߠߥߊߕߐ߫ ߊ߬ ߣߌ߫ ߢߌ߬ߡߊ߲߬ ߠߊߞߎ߲߬ߘߎ߲߬ߕߐ߫ ߌ ߓߊ߫ ߞߍ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߟߊ߫. ߣߌߎߔߌߔ (NewPipe) ߦߋ߫ ߡߊ߬ߞߏ߬ߟߊ߬ߓߐ߬ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߋ߬ ߘߌ߫: ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߓߊ߯ߙߊ߫ ߟߊ߫߸ ߞߵߊ߬ ߞߊ߬ߙߊ߲߬߸ ߞߵߊ߬ ߘߐߕߟߊ߫߸ ߊ߬ߣߌ߫ ߞߵߊ߬ ߟߊߢߊ߬ ߦߏ߫ ߊ߬ ߘߎߡߊ߲߫ ߌ ߢߍ߫ ߢߊ ߡߍ߲. ߊ߬ ߕߌ߯ߕߌ߮ ߘߐ߫߸ ߌ ߘߌ߫ ߛߴߊ߬ ߟߊߖߍ߲ߛߍ߲߫ ߠߊ߫ ߥߟߊ߫ ߞߊ߬ ߘߐ߬ߝߊ߬ߟߋ߲߬ߠߌ߲ ߞߍ߫ ߊ߬ ߘߐ߫ ߝߘߏ߬ߓߊ߬ ߟߊߘߌߢߍ߫ ߛߙߊߕߌ ߟߎ߬ ߞߘߐ߫ (GNU General Public License) ߦߏ߫ ߊ߬ ߟߊߖߍ߲ߛߍ߲ߣߍ߲߫ ߛߎ߲ߝߘߍ߫ ߟߊߓߌ߬ߟߊ߬ߣߍ߲ ߠߎ߬ ߛߌ߲ߘߌߘߊ ߓߟߏ߫ ߢߊ ߡߍ߲ (Free Software Foundation) ߊ߬ ߓߐߞߏ߫ ߃߲ ߘߐ߫߸ ߥߟߊ߫߸ ߌ ߛߊ߬ߥߏ߬ߣߍ߲߬ߕߊ ߟߊ߫ ߞߊ߬ ߓߍ߲߬ ߊ߬ ߓߐߞߏ߫ ߞߘߐ߫ ߛߌ߫ ߡߊ߬. ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߢߊߓߐߟߌ ߟߎ߬ ߝߊߣߊ߲߫ ߟߊߛߣߍ߫؟ ߞߊ߬ ߕߏߟߏ߲ ߘߊߡߌ߬ߣߊ߬ ߝߊ߲߬ߝߘߊ ߞߘߐ߫ @@ -462,13 +457,10 @@ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߣߍ߫ ߟߊߛߣߍ߫ ߟߊ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߕߍ߫ ߛߋ߫ ߟߊߓߐ߫ ߟߊ߫ ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮߸ soundcloud.com/ߌߟߊ߫ߜߊ߲߬ߞߎ߲߬ߕߐ߮ - ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߗߋߥߊߟߌ ߣߌ߲߬ ߘߌߣߊ߬ ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߖߛߐ߫ ߞߏߛߓߍ߫. -\n -\nߞߵߊ߬ ߓߟߏߕߎ߲߰؟ + ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߗߋߥߊߟߌ ߣߌ߲߬ ߘߌߣߊ߬ ߞߙߏ߬ߝߏ߫ ߜߊ߲߬ߞߎ߲߬ߠߌ߲ ߖߛߐ߫ ߞߏߛߓߍ߫. \n \nߞߵߊ߬ ߓߟߏߕߎ߲߰؟ ߞߵߊ߬ ߢߡߊߛߊ߬ߦߌ߬ ߞߊ߲ߡߊߛߙߋ߫-ߕߟߊ - ߞߊ߬ ߓߍ߲߬ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߞߊ߲ߘߊ߫ ߝߘߏ߬ߓߊ߬ ߞߎߙߎ߲ߘߎ (GDPR) ߡߊߓߏ߲߬ߧߊ ߡߊ߬߸ ߊ߲ ߧߴߌ ߖߊ߲߭ߓߌ߬ߟߊ߬ ߟߊ߫ ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߐ߫. ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߘߐߞߊ߬ߙߊ߲߬ ߞߏߢߌ߲߬ߡߊ߬. -\nߌ ߞߊߞߊ߲߫ ߠߋ߬ ߞߵߌ ߛߐ߲߬ ߊ߬ ߡߊ߬ ߞߏ߫ ߛߴߌ ߘߌ߫ ߛߋ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߊ߲ ߡߊ߬. + ߞߊ߬ ߓߍ߲߬ ߟߐ߲ߕߊ ߟߎ߬ ߟߊߞߊ߲ߘߊ߫ ߝߘߏ߬ߓߊ߬ ߞߎߙߎ߲ߘߎ (GDPR) ߡߊߓߏ߲߬ߧߊ ߡߊ߬߸ ߊ߲ ߧߴߌ ߖߊ߲߭ߓߌ߬ߟߊ߬ ߟߊ߫ ߣߌߎߔߌߔ ߟߊ߫ ߜߎ߲߬ߘߎ߬ߞߏ߫ ߓߘߍ߬ߓߘߍ߬ߟߌ ߞߐ߫. ߘߌ߬ߢߍ߬ ߦߴߊ߬ ߘߐߞߊ߬ߙߊ߲߬ ߞߏߢߌ߲߬ߡߊ߬. \nߌ ߞߊߞߊ߲߫ ߠߋ߬ ߞߵߌ ߛߐ߲߬ ߊ߬ ߡߊ߬ ߞߏ߫ ߛߴߌ ߘߌ߫ ߛߋ߫ ߜߊߛߊ߲ߠߌ߲߫ ߘߊ߲߬ߕߍ߰ߟߌ ߟߥߊ߫ ߊ߲ ߡߊ߬. ߌ ߛߐ߲߬ ߌ ߓߊ߲߬ ߘߊ߲߬ ߕߴߊ߬ ߟߊ߫ @@ -545,8 +537,7 @@ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߘߊߡߌ߬ߣߊ߬ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ ߟߎ߬ ߟߊߘߎ߲߫ ߞߊ߬ ߟߊ߬ߖߌ߰ߟߌ߫ ߥߊ߫ ߦߙߐ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߫ - ߌ ߣߊ߬ߕߐ߫ ߟߋ߬ ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ ߟߊ߫ ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߟߊߞߎ߲߬ߘߎ߲߬ ߦߙߐ ߡߊ߬. -\nߟߊ߬ߘߌߢߍ ߘߌ߫ ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߡߊ߬ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߟߊߖߌ߰ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߠߋ߫ ߞߊ߲߬ + ߌ ߣߊ߬ߕߐ߫ ߟߋ߬ ߡߊ߬ߢߌ߬ߣߌ߲߬ߞߊ߬ ߟߊ߫ ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߟߊߞߎ߲߬ߘߎ߲߬ ߦߙߐ ߡߊ߬. \nߟߊ߬ߘߌߢߍ ߘߌ߫ ߞߊ߲ߞߋ߫ ߞߎ߲ߓߍ߲߫ ߛߎߥߊ߲ߘߌߟߊ߲ (SAF) ߡߊ߬ ߣߴߌ ߦߴߊ߬ ߝߍ߬ ߞߵߊ߬ ߟߊߖߌ߰ ߞߐߞߊ߲߫ ߦߟߌߕߏߟߊ߲ ߠߋ߫ ߞߊ߲߬ ߞߊ߬ ߘߊ߲߭ߛߌ߰ ߟߊ߬ߖߌ߰ߟߌ߫ ߕߎ߲߰ߠߌ߲ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߬ ߞߋߟߋ߲߫ ߔߋ߫ ߟߋ߫ ߣߊ߬ߕߐ߬ ߞߍ߫ ߟߊ߫ ߕߎ߬ߡߊ߬ߣߍ߲߬ ߞߋߟߋ߲ ߠߊ߫ ߟߊ߬ߖߌ߰ߟߌ߫ ߞߋ߬ߟߋ߲߬ߞߋ߬ߟߋ߲߬ߠߊ߫ ߓߍ߯ ߟߊߞߎ߲߬ߘߎ߬ ߦߙߐ ߘߌߣߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߵߌ ߟߊ߫ @@ -555,21 +546,8 @@ ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߫ ߖߏ߬ߛߌ߫ ؟ ߌ ߦߴߊ߬ ߝߍ߬ ߟߋ߬ ߞߊ߬ ߓߊߟߌߣߍ߲ ߠߎ߬ ߓߍ߯ ߖߏ߬ߛߌ߬ ߛߙߍߘߍ ߣߌ߲߬ ߘߐ߫ ؟ - ߌ ߟߊ߫ ߦߕߎߓߎ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߫ Google Takeout: -\n -\n߁. ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߐߡߌ߬ߘߊ߬: %1$s -\n߂. ߌ ߜߊ߲߬ߞߎ߲߬ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߟߊ߫ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ -\n߃. ߌ ߦߋ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫ \"ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߦߴߊ߬ ߘߐ߫\"߸ ߏ߬ ߞߐ߫ ߦߋ߫ \"ߞߊ߬ ߓߍ߯ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߓߐ߫\"߸ ߏ߬ ߞߐ߫߸ ߌ ߦߋ߫ \"ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬\" ߘߐߙߐ߲߫ ߓߊߕߐߡߐ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߏ߬ߞߍ߫\" ߛߐ߲߬ߞߌ߲߫ -\n߄. ߌ ߦߋ߫ \"ߢߍߕߊ\" ߛߐ߲߬ߞߌ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߟߊ߬ߓߐߟߌ ߘߏ߫ ߛߌ߲ߘߌ߫\" ߛߐ߲߬ߞߌ߲߫ -\n߅. ߌ ߦߋ߫ \"ߞߊ߬ ߟߊߖߌ߰\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߫ ߊ߬ ߟߊ߲ߞߣߍߡߊߣߍ߲ ߞߐ߫ -\n߆. ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫ ߦߊ߬߸ ߦߋ߫ .zip ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߛߎߥߊ߲ߘߌ߫ -\n߇. [ߣߌ߫ ߝߝߝ ߟߊߛߣߍ ߗߌߙߏ߲߫ ߘߊ߲߫] ߦߋ߫ ߝߝߝ ߞߐߕߐ߮ ߓߐ߬ߛߌ߬ ߊ߬ ߘߐ߫ (ߊ߬ ߛߌߦߊߡߊ߲ ߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߠߋ߬ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\")߸ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߐߕߐ߮ ߟߊߛߣߍ߲߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫߸ ߞߊ߬ csv ߞߐߕߐ߯ ߓߐ߬ߛߌ߬ߣߍ߲ ߛߎ߲ߥߊ߲ߘߌ߫ - ߌ ߟߊ߫ SoundCloud ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߠߊߘߏ߬ ߥߊߟߴߌߟߊ߫ ߜߊ߬ߞߎ߲߬ߕߐ߮ ߞߊ߬ SoundCloud ߢߊߞߙߍ߫ ߘߏ߫ ߟߊߛߣߍ߫: -\n -\n߁. \"ߛߓߍߘߊ߫ ߗߏ߯ߦߊ\" ߟߊߢߊ߯ ߌߟߊ߫ ߓߟߐߟߐ߫ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫ (ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߏ߬ ߕߴߌߟߊ߫ ߕߙߏߞߏ߫ ߕߊ߬ߕߊ ߟߊ߫) -\n߂. ߥߊ߫ ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߊ߲߬: %1$s -\n߃. ߌ ߜߊ߲߬ߞߎ߲߬ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ -\n߄. ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߓߊߓߌߟߊ߫߸ ߌ ߟߊߛߌ߲߫ ߛߊ߲ ߦߋ߫ ߡߍ߲ ߡߊ߬ ߏ߬ ߘߌ߬. + ߌ ߟߊ߫ ߦߕߎߓߎ߫ ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬ ߟߊߛߣߍ߫ ߞߊ߬ߓߌ߫ Google Takeout: \n \n߁. ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߐߡߌ߬ߘߊ߬: %1$s \n߂. ߌ ߜߊ߲߬ߞߎ߲߬ ߌ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߟߊ߫ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ \n߃. ߌ ߦߋ߫ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫ \"ߟߐ߲ߕߊ ߟߎ߬ ߓߍ߯ ߦߴߊ߬ ߘߐ߫\"߸ ߏ߬ ߞߐ߫ ߦߋ߫ \"ߞߊ߬ ߓߍ߯ ߓߊߕߐߡߐ߲ߣߍ߲߫ ߓߐ߫\"߸ ߏ߬ ߞߐ߫߸ ߌ ߦߋ߫ \"ߡߊ߬ߝߘߎ߬ߟߌ ߟߎ߬\" ߘߐߙߐ߲߫ ߓߊߕߐߡߐ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߏ߬ߞߍ߫\" ߛߐ߲߬ߞߌ߲߫ \n߄. ߌ ߦߋ߫ \"ߢߍߕߊ\" ߛߐ߲߬ߞߌ߲߫ ߞߊ߬ ߓߊ߲߫ ߞߊ߬ \"ߟߊ߬ߓߐߟߌ ߘߏ߫ ߛߌ߲ߘߌ߫\" ߛߐ߲߬ߞߌ߲߫ \n߅. ߌ ߦߋ߫ \"ߞߊ߬ ߟߊߖߌ߰\" ߞߎ߬ߘߎ ߛߐ߲߬ߞߌ߲߫ ߊ߬ ߟߊ߲ߞߣߍߡߊߣߍ߲ ߞߐ߫ \n߆. ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߊ߬ ߞߐߕߐ߮ ߟߊߛߣߍ߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫ ߦߊ߬߸ ߦߋ߫ .zip ߞߐߕߐ߯ ߟߊߖߌ߰ߣߍ߲ ߛߎߥߊ߲ߘߌ߫ \n߇. [ߣߌ߫ ߝߝߝ ߟߊߛߣߍ ߗߌߙߏ߲߫ ߘߊ߲߫] ߦߋ߫ ߝߝߝ ߞߐߕߐ߮ ߓߐ߬ߛߌ߬ ߊ߬ ߘߐ߫ (ߊ߬ ߛߌߦߊߡߊ߲ ߘߐ߫ ߕߐ߯ ߛߎ߮ ߣߌ߲߬ ߠߋ߬ \"YouTube and YouTube Music/subscriptions/subscriptions.csv\")߸ߊ߬ ߛߐ߲߬ߞߌ߲߫ \"ߞߐߕߐ߮ ߟߊߛߣߍ߲߫\" ߞߊ߲߬ ߘߎ߰ߟߊ߫߸ ߞߊ߬ csv ߞߐߕߐ߯ ߓߐ߬ߛߌ߬ߣߍ߲ ߛߎ߲ߥߊ߲ߘߌ߫ + ߌ ߟߊ߫ SoundCloud ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߠߊߘߏ߬ ߥߊߟߴߌߟߊ߫ ߜߊ߬ߞߎ߲߬ߕߐ߮ ߞߊ߬ SoundCloud ߢߊߞߙߍ߫ ߘߏ߫ ߟߊߛߣߍ߫: \n \n߁. \"ߛߓߍߘߊ߫ ߗߏ߯ߦߊ\" ߟߊߢߊ߯ ߌߟߊ߫ ߓߟߐߟߐ߫ ߛߏ߲߯ߓߊߟߊ߲ ߞߣߐ߫ (ߣߴߊ߬ ߞߵߊ߬ ߕߘߍ߬ ߏ߬ ߕߴߌߟߊ߫ ߕߙߏߞߏ߫ ߕߊ߬ߕߊ ߟߊ߫) \n߂. ߥߊ߫ ߛߘߌ߬ߜߋ߲ ߣߌ߲߬ ߞߊ߲߬: %1$s \n߃. ߌ ߜߊ߲߬ߞߎ߲߬ ߣߴߊ߬ ߡߊߢߌ߬ߣߌ߲߬ߞߊ߬ ߘߊ߫ \n߄. ߢߊߞߙߍ߫ ߛߘߌ߬ߜߋ߲ ߓߊߓߌߟߊ߫߸ ߌ ߟߊߛߌ߲߫ ߛߊ߲ ߦߋ߫ ߡߍ߲ ߡߊ߬ ߏ߬ ߘߌ߬. ߘߐ߬ߛߊ߬ߙߌ߬ߟߌ߫ ߓߏ߬ߙߌ߬ߛߋ߲ ߡߊ߬ߡߙߊ߬ߟߌ ߟߎ߬ ߞߍߛߋ߲ ߞߊ߲ߡߊߛߙߋ @@ -617,12 +595,9 @@ ߕߎ߬ߡߊ ߡߍ߲ ߕߊ߬ߡߌ߲ ߞߐ ߘߐ߫߸ ߥߏ߬ߦߏ ߟߎ߬ ߞߊߞߊ߲߫ ߞߊ߬ ߖߊ߬ߕߋ߬ ߞߘߐ߬ߡߊ߲ ߘߌ߫ — %s ߞߊ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߟߊߢߊ߯ ߞߊ߬ ߥߏ߬ߦߏ ߟߎ߫ ߦߌ߬ߘߊ߬/ߢߡߊߘߏ߲߰ - ߣߌߎߔߌߔ ߕߍ߫ ߞߣߐߘߐ ߣߌ߲߬ ߕߊ߬ ߟߊ߫ ߡߎߣߎ߲߬. -\n -\nߕߎ߬ߡߊ߬ ߘߐ߫߸ ߊ߬ ߘߌ߫ ߛߴߊ߬ ߕߊ߬ ߟߊ߫ ߓߐߞߏ߫ ߣߊ߬ߕߐ ߟߎ߬ ߘߐ߫. + ߣߌߎߔߌߔ ߕߍ߫ ߞߣߐߘߐ ߣߌ߲߬ ߕߊ߬ ߟߊ߫ ߡߎߣߎ߲߬. \n \nߕߎ߬ߡߊ߬ ߘߐ߫߸ ߊ߬ ߘߌ߫ ߛߴߊ߬ ߕߊ߬ ߟߊ߫ ߓߐߞߏ߫ ߣߊ߬ߕߐ ߟߎ߬ ߘߐ߫. ߥߙߏߝߋ߫ ߞߐߖߌߦߊ߫ ߞߏ߬ߋߞߏ߬ߋ - ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. -\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߡߍ߲ ߣߌ߫ ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ ߘߌ߫ ߓߍ߲߬ + ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. \nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߡߍ߲ ߣߌ߫ ߡߙߊ߬ߘߐ߬ߦߊ ߟߊߛߐ߬ߘߐ߲ ߡߎ߬ߙߊ߲߬ߞߊ߲ߞߋ ߘߌ߫ ߓߍ߲߬ ߦߋߡߍ߲ߕߊ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߬ YouTube Music Premium ߛߌ߲߬ߝߏ߲ ߠߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ. ߛߊ߲ߞߊߥߟߌ ߥߎߢߊ߲ߓߍ߲ @@ -674,9 +649,7 @@ ߝߎ߬ߕߎ߲߬ߕߌ ߥߏ߬ߦߏ ߖߛߐ߫ ߕߎߡߊ \'%s\' ߥߏ߬ߦߏ ߕߍ߫ ߛߋ߫ ߖߛߐ߫ ߟߊ߫. - ߛߌ߲ߘߌߓߊ߮ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߕߍ߰. -\nߣߌߎߔߌߔ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߖߛߐ߫ ߟߊ߫ ߡߎ߬ߕߎ߲߬. -\nߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߛߊ߬ ߥߙߏߝߋ ߣߌ߲߬ ߡߊ߬ ؟ + ߛߌ߲ߘߌߓߊ߮ ߟߊ߫ ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߕߍ߰. \nߣߌߎߔߌߔ ߕߍ߫ ߣߊ߬ ߛߋ߫ ߟߊ߫ ߥߏ߬ߦߏ ߣߌ߲߬ ߖߛߐ߫ ߟߊ߫ ߡߎ߬ߕߎ߲߬. \nߞߊ߬ ߡߊ߬ߝߘߎ߬ߟߌ ߛߊ߬ ߥߙߏߝߋ ߣߌ߲߬ ߡߊ߬ ؟ ߥߦߏ߬ ߞߊߟߌ߲ ߗߏ߯ߦߊ ߕߍ߫ ߟߌ߬ߤߟߊ߬ ߘߌߦߊߡߊ߲߫ ߘߌ߫ ߟߊ߫ ߝߐߡߊ ߣߌ߲߬ ߞߊ߲߬. ߞߵߊ߬ ߟߊߛߐ߬ߘߐ߲߬ ߥߦߏ߬ ߓߟߏߡߊߞߊ߬ߣߍ߲ ߘߏ߫ ߝߍ߬ ߣߴߏ ߘߌ߫ ߓߍ߲߬ ߞߵߊ߬ ߟߊߞߎߘߦߊ߫ ߞߘߊߎ߫ @@ -690,8 +663,7 @@ ߛߌ߰ߘߊ ߟߎ߬ ߞߊ߬ ߞߏ߬ߋߞߏ߬ߋ ߦߌ߬ߘߊ߬ ߟߥߊߟߌߟߊ߲߫ ߛߌ߫ ߕߴߌ ߟߊ߫ ߕߙߏߞߏ ߞߊ߲߬ ߡߍ߲ ߘߌ߫ ߛߋ߫ ߣߌ߲߬ ߠߊߞߊ߬ ߟߊ߫ - ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. -\nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߥߟߊ߫ ߦߴߊ߬ ߡߊߝߍߣߍ߲߫ ߞߊ߬ \'%s\' ߟߊߛߊ߬ ߟߊ߬ߖߌ߰ߟߌ߲߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ + ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲߫ ߛߌ߫ ߡߊ߫ ߛߐ߬ߘߐ߲߬ ߞߋߥߊߟߌ ߣߌ߲߬ ߞߊ߲ߡߊ߬. \nߘߌ߬ߢߍ߬ ߦߋ߫ ߞߐߕߐ߯ ߡߊߡߙߊߟߊ߲ ߘߏ߫ ߡߊߞߍ߫ ߥߟߊ߫ ߦߴߊ߬ ߡߊߝߍߣߍ߲߫ ߞߊ߬ \'%s\' ߟߊߛߊ߬ ߟߊ߬ߖߌ߰ߟߌ߲߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߘߎ߲߬ߘߎ߬ߡߊ ߟߋ߬ ߘߌ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫. ߖߊ߬ߕߋ߬ߘߊ ߓߘߊ߫ ߓߍ߰ ߞߊ߬ ߞߟߏߜߍ߫ ߓߊߕߐߡߐ߲ ߠߊߢߊ߯ ߞߊ߲߬ߛߓߍ ߘߐ߫ @@ -701,17 +673,7 @@ ߣߌ߲߬ ߦߋ߫ SoundCloud Go+ ߜߋ߬ߙߋ ߘߏ߫ ߟߋ߬ ߘߌ߫߸ ߡߍ߲ ߕߴߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ߫. ߊ߬ ߦߋ߫ ߗߋߢߊ ߘߏ߫ ߟߎ߫ ߘߐ߫߸ ߊ߬ߟߋ߬ ߞߊߟߌߡߊ߲ߓߊ ߟߋ߬ ߝߊߣߊ߲߫ ߦߋ߫߸ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߌ߫ ߛߋ߫ ߝߌ߬ߛߌ߫ ߘߊ߲߬ߠߊߕߍ߰ߣߍ߲ ߠߥߊ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߟߌ߬ߤߟߊ߬ ߘߝߊߓߊߟߌ ߟߎ߬ (ߟߊߒߡߊ߫ ߘߐ߫߸ ߥߎ߬ߛߎ߸ ߝߌ߬ߛߌ ߛߎ߯ߦߊ ߥߟߊ߫ ߝߊ߲ߞߢߊ߫ ߟߌ߬ߤߟߊ) ߞߣߐߘߐ ߣߌ߲߬ ߦߋ߫ ߡߊߛߐ߬ߘߐ߲߬ ߠߊ߫ ߕߣߐ߬ߓߐ߬ߟߊ߫ ߛߙߊ߬ߓߐ߬ߟߊ ߟߎ߬ ߟߋ߬ ߘߐߙߐ߲߫ ߓߟߏ߫߸ ߏ߬ ߘߐ߫ ߊ߬ ߕߍ߫ ߛߋ߫ ߘߐߛߊߙߌ߫ ߟߊ߫ ߥߟߊ߫ ߞߵߊ߬ ߟߊߖߌ߰ ߣߌߎߔߌߔ ߓߟߏ. - ߊ߬ ߦߴߌ ߢߣߊ߫ ߟߋ߬ ߞߏ߫ ߥߏ߬ߦߏ ߟߎ߬ ߖߛߐ ߟߊߛߎߡߊߡߊ߲߫ ߠߋ߬ ߞߏߖߎ߯ߦߊ߫؟ ߣߴߏ߬ ߟߋ߸ ߖߛߐߟߌ߫ ߞߊߟߌ߲ ߡߊߝߍߣߍ߲߫ (ߌ ߘߌ߫ ߛߴߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߥߟߊ߫ ߘߎ߰ߟߊ߬ߘߐ߬ ߞߘߎ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫). -\n -\nߣߌߎߔߌߔ ߘߌ߫ ߛߋ߫ ߥߏ߬ߦߏ ߟߎ߬ ߟߊߞߎߘߦߊ߫ ߟߊ߫ ߢߊ߫ ߝߌ߬ߟߊ߫ ߟߋ߫ ߡߊ߬: -\n• ߞߊ߬ ߝߙߏߝߋ߫ ߡߊߝߘߎߣߍ߲ ߠߎ߬ ߡߎ߰ߡߍ ߡߊߛߐ߲߬ߘߐ߲߬߸ ߏ߬ ߛߎߡߊߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫. -\n• ߞߊ߬ ߗߋߢߊ߫ ߓߟߏߡߞߊ߬ߣߍ߲ ߘߏ߫ ߟߊߓߊ߯ߙߊ߫߸ ߏ߬ ߟߞߊߟߌߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫ ߕߍ߫. -\n -\nߞߍߢߊ߫ ߝߌ߬ߟߊ ߏ߬ ߘߊ߲߬ߝߘߊ߬ߓߐ ߦߋ߫ ߟߋ߬߸ ߡߍ߲ ߞߊߟߌߡߊ߲߫ ߏ߬ ߕߍ߫ ߟߌ߬ߤߟߊ߫ ߓߍ߯ ߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߦߏ߫ ߝߌ߬ߛߌ ߥߎ߬ߛߎ ߣߴߊ߬ ߛߎ߯ߦߊ (ߢߟߊ߫ ߦߋߟߌ ߘߐ߫ ߘߊ߲߬ߝߘߊ߬ߓߐ߬ ߕߴߊ߬ ߝߊ߲ߞߢߊ߫ ߦߋߡߍ߲ߕߊ ߟߎ߬ ߣߌ߫ ߘߏ߫ ߜߘߍ߫ ߟߎ߫ ߕߍ߫)߸ ߊ߬ ߘߏ߲߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߴߊ߬ ߡߊ߫ ߥߙߏߝߋ߫ ߝߌ߬ߛߌ ߟߎ߬ ߓߍ߯ ߡߊߛߐ߬ߘߐ߲߬. -\n -\nߟߊߒߡߊ߫ ߘߐ߫߸ ߦߕߎߓߎ ߦߋ߫ ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ߬ ߞߊߟߌ߲ (RSS ߥߏ߬ߦߏ) ߕߊ߬ ߟߊ߫. -\n -\nߏ߬ ߘߐ߫߸ ߌߟߋ ߟߵߊ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߠߊ߫: ߣߴߌ ߦߋ߫ ߞߊߟߌߦߊ ߟߋ߫ ߝߍ߬ ߥߟߊ߫ ߟߌ߬ߤߟߊ߬ ߖߐ߲ߖߐ߲. + ߊ߬ ߦߴߌ ߢߣߊ߫ ߟߋ߬ ߞߏ߫ ߥߏ߬ߦߏ ߟߎ߬ ߖߛߐ ߟߊߛߎߡߊߡߊ߲߫ ߠߋ߬ ߞߏߖߎ߯ߦߊ߫؟ ߣߴߏ߬ ߟߋ߸ ߖߛߐߟߌ߫ ߞߊߟߌ߲ ߡߊߝߍߣߍ߲߫ (ߌ ߘߌ߫ ߛߴߊ߬ ߡߊߝߊ߬ߟߋ߲߬ ߠߊ߫ ߢߊߓߐߟߌ ߟߎ߬ ߘߐ߫ ߥߟߊ߫ ߘߎ߰ߟߊ߬ߘߐ߬ ߞߘߎ ߣߌ߲߬ ߛߐ߲߬ߞߌ߲߫). \n \nߣߌߎߔߌߔ ߘߌ߫ ߛߋ߫ ߥߏ߬ߦߏ ߟߎ߬ ߟߊߞߎߘߦߊ߫ ߟߊ߫ ߢߊ߫ ߝߌ߬ߟߊ߫ ߟߋ߫ ߡߊ߬: \n• ߞߊ߬ ߝߙߏߝߋ߫ ߡߊߝߘߎߣߍ߲ ߠߎ߬ ߡߎ߰ߡߍ ߡߊߛߐ߲߬ߘߐ߲߬߸ ߏ߬ ߛߎߡߊߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫. \n• ߞߊ߬ ߗߋߢߊ߫ ߓߟߏߡߞߊ߬ߣߍ߲ ߘߏ߫ ߟߊߓߊ߯ߙߊ߫߸ ߏ߬ ߟߞߊߟߌߡߊ߲߫ ߞߏ߬ߣߌ߲߬ ߊ߬ ߘߝߊߣߍ߲߫ ߕߍ߫. \n \nߞߍߢߊ߫ ߝߌ߬ߟߊ ߏ߬ ߘߊ߲߬ߝߘߊ߬ߓߐ ߦߋ߫ ߟߋ߬߸ ߡߍ߲ ߞߊߟߌߡߊ߲߫ ߏ߬ ߕߍ߫ ߟߌ߬ߤߟߊ߫ ߓߍ߯ ߛߐ߬ߘߐ߲߬ ߠߊ߫߸ ߦߏ߫ ߝߌ߬ߛߌ ߥߎ߬ߛߎ ߣߴߊ߬ ߛߎ߯ߦߊ (ߢߟߊ߫ ߦߋߟߌ ߘߐ߫ ߘߊ߲߬ߝߘߊ߬ߓߐ߬ ߕߴߊ߬ ߝߊ߲ߞߢߊ߫ ߦߋߡߍ߲ߕߊ ߟߎ߬ ߣߌ߫ ߘߏ߫ ߜߘߍ߫ ߟߎ߫ ߕߍ߫)߸ ߊ߬ ߘߏ߲߬ ߘߌ߫ ߛߋ߫ ߞߍ߫ ߟߴߊ߬ ߡߊ߫ ߥߙߏߝߋ߫ ߝߌ߬ߛߌ ߟߎ߬ ߓߍ߯ ߡߊߛߐ߬ߘߐ߲߬. \n \nߟߊߒߡߊ߫ ߘߐ߫߸ ߦߕߎߓߎ ߦߋ߫ ߟߊ߬ߞߎ߬ߘߦߊ߬ߟߌ߬ ߞߊߟߌ߲ (RSS ߥߏ߬ߦߏ) ߕߊ߬ ߟߊ߫. \n \nߏ߬ ߘߐ߫߸ ߌߟߋ ߟߵߊ߬ ߡߊߝߍߣߍ߲ߣߍ߲߫ ߠߊ߫: ߣߴߌ ߦߋ߫ ߞߊߟߌߦߊ ߟߋ߫ ߝߍ߬ ߥߟߊ߫ ߟߌ߬ߤߟߊ߬ ߖߐ߲ߖߐ߲. ߞߣߐߘߐ ߣߌ߲߬ ߕߍ߫ ߡߊߛߐ߬ߘߐ߲߬ ߌ ߟߊ߫ ߖߡߊ߬ߣߊ ߞߣߐ߫. ߢߣߊߕߊ ߣߌ߲߬ ߘߌ߫ ߡߊߛߐ߬ߘߐ߲߫ ߠߋ߬ ߘߐߙߐ߲߫ ߣߌ߫ %s ߛߎߥߊ߲ߘߌߣߍ߲߫ ߛߊߛߊ ߢߍ߫ ߌ ߘߌ߫ ߛߋ߫ ߞߟߏߜߍ ߓߊߕߐߡߐ߲߫ ߠߊ߫ ߞߊ߲߬ߛߓߍ ߘߐ߫ ߡߎ߬ߕߎ߲߬. ߦߴߊ߬ ߟߐ߲߫ ߞߏ߫ ߞߐߜߍ߫ ߘߌ߫ ߛߋ߫ ߡߣߍߡߣߍ߫ ߟߊ߫ ߊ߬ߣߌ߫ ߛߘߌ߬ߜߋ߲ ߠߎ߬ ߝߊߣߊ߲߫ ߘߌ߫ ߛߋ߫ ߟߊߝߏߦߊ߫ ߟߴߊ߬ ߘߐ߫. diff --git a/app/src/main/res/values-oc/strings.xml b/app/src/main/res/values-oc/strings.xml index 6341e6700..8f03ab011 100644 --- a/app/src/main/res/values-oc/strings.xml +++ b/app/src/main/res/values-oc/strings.xml @@ -1,7 +1,7 @@ Publicat lo %1$s - Cap de legidor de flus trobat. Volètz installar VLC\? + Cap de legidor de flus trobat. Volètz installar VLC? Cap de legidor de flus trobat (podètz installar VLC per lo legir). Installar Anullar @@ -12,7 +12,7 @@ Telecargar lo fichièr de flus Recercar Paramètres - Voliatz dire: %1$s\? + Voliatz dire: %1$s? Partejar amb Utilizar un legidor de vidèo extèrne S\'abonar @@ -43,7 +43,7 @@ Afichar de resolucions mai nautas Totes los dispositius pòdon pas legir de vidèos 2K/4K Jogar amb Kodi - Trobam pas l\'aplicacion Kore. La volètz installar\? + Trobam pas l\'aplicacion Kore. La volètz installar? Afichar l\'opcion \"Legir amb Kodi\" Afichar una opcion per legir una vidèo dempuèi Kodi Àudio @@ -61,4 +61,4 @@ Afichar los comentaris Desactivar per afichar pas mai los comentaris Apondre la vidèo seguenta dins la coa de lectura - \ No newline at end of file + diff --git a/app/src/main/res/values-or/strings.xml b/app/src/main/res/values-or/strings.xml index 57459de10..367df4bfe 100644 --- a/app/src/main/res/values-or/strings.xml +++ b/app/src/main/res/values-or/strings.xml @@ -37,7 +37,7 @@ ନୂଆ %1$s ରେ ପ୍ରକାଶିତ - କୌଣସି ଷ୍ଟ୍ରିମ୍ ପ୍ଲେୟାର୍ ମିଳିଲା ନାହିଁ । VLC ସଂସ୍ଥାପନ କରନ୍ତୁ \? + କୌଣସି ଷ୍ଟ୍ରିମ୍ ପ୍ଲେୟାର୍ ମିଳିଲା ନାହିଁ । VLC ସଂସ୍ଥାପନ କରନ୍ତୁ ? କୌଣସି ଷ୍ଟ୍ରୀମ ପ୍ଲେୟାର ନାହିଁ । ସଂସ୍ଥାପନ କରନ୍ତୁ ପପ୍ଅପ୍ ମୋଡ୍ ରେ ଖୋଲନ୍ତୁ @@ -46,7 +46,7 @@ ଦେଖାଯାଇଥିବା ପରି ଚିହ୍ନିତ କର ଡାଉନଲୋଡ୍ କରନ୍ତୁ ସେଟିଂ - ତୁମେ ଏହା ଚାଂହ କି \"%1$s\"\? + ତୁମେ ଏହା ଚାଂହ କି \"%1$s\"? ଫାଇଲ୍ ଡାଉନଲୋଡ କରନ୍ତୁ ପଠାନ୍ତୁ ସନ୍ଧାନ @@ -115,7 +115,7 @@ ଖେଳିବା ଆରମ୍ଭ କରନ୍ତୁ ଫୁଲ ସ୍କ୍ରିନରେ ମୁଖ୍ୟ ପ୍ଲେୟାର ଆରମ୍ଭ କରନ୍ତୁ ସ୍ୱତଃଚାଳନ - URL ଚିହ୍ନି ପାରିଲା ନାହିଁ । ଅନ୍ୟ ଏକ ଆପ୍ ସହିତ ଖୋଲନ୍ତୁ\? + URL ଚିହ୍ନି ପାରିଲା ନାହିଁ । ଅନ୍ୟ ଏକ ଆପ୍ ସହିତ ଖୋଲନ୍ତୁ? ଡିଫଲ୍ଟ ବିଷୟବସ୍ତୁ ଦେଶ ଡିଫଲ୍ଟ ବିଷୟବସ୍ତୁ ଭାଷା PeerTube ଉଦାହରଣ @@ -149,43 +149,21 @@ ଏହା ଉପରେ ଟ୍ୟାପ କରି ନିମ୍ନରେ ଦିଆଯାଇଥିବା ପ୍ରତ୍ୟେକ ବିଜ୍ଞପ୍ତି କାର୍ଯ୍ୟକୁ ସମ୍ପାଦନ କରନ୍ତୁ । ଡାହାଣ ପଟେ ଥିବା ଚେକବକ୍ସଗୁଡ଼ିକୁ ବ୍ୟବହାର କରି କମ୍ପାକ୍ଟ ବିଜ୍ଞପ୍ତିରେ ଦର୍ଶାଇବା ପାଇଁ ସେଗୁଡ଼ିକ ମଧ୍ୟରୁ ତିନିଟି ଚୟନ କରନ୍ତୁ । ଷ୍ଟ୍ରିମ୍ ସୃଷ୍ଟିକର୍ତ୍ତା, ଷ୍ଟ୍ରିମ୍ ବିଷୟବସ୍ତୁ କିମ୍ବା ଏକ ସନ୍ଧାନ ଅନୁରୋଧ ବିଷୟରେ ଅତିରିକ୍ତ ସୂଚନା ସହିତ ମେଟା ସୂଚନା ବାକ୍ସଗୁଡ଼ିକୁ ଲୁଚାଇବାକୁ ବନ୍ଦ କରନ୍ତୁ ପିଲାମାନଙ୍କ ପାଇଁ ସମ୍ଭବତ content ଅନୁପଯୁକ୍ତ ବିଷୟବସ୍ତୁ ଦେଖାନ୍ତୁ କାରଣ ଏହାର ବୟସ ସୀମା ଅଛି (ଯେପରିକି 18+) - ଏହି ଭିଡିଓ ବୟସ-ସୀମିତ ଅଟେ । -\nବୟସ-ସୀମିତ ଭିଡିଓ ସହିତ ନୂତନ ୟୁଟ୍ୟୁବ୍ ନୀତି ହେତୁ, NewPipe ଏହାର କୌଣସି ଭିଡିଓ ଷ୍ଟ୍ରିମ୍ ପ୍ରବେଶ କରିପାରିବ ନାହିଁ ଏବଂ ଏହିପରି ଏହାକୁ ଚଲାଇବାରେ ଅସମର୍ଥ । + ଏହି ଭିଡିଓ ବୟସ-ସୀମିତ ଅଟେ । \nବୟସ-ସୀମିତ ଭିଡିଓ ସହିତ ନୂତନ ୟୁଟ୍ୟୁବ୍ ନୀତି ହେତୁ, NewPipe ଏହାର କୌଣସି ଭିଡିଓ ଷ୍ଟ୍ରିମ୍ ପ୍ରବେଶ କରିପାରିବ ନାହିଁ ଏବଂ ଏହିପରି ଏହାକୁ ଚଲାଇବାରେ ଅସମର୍ଥ । NewPipe ହେଉଛି copyleft libre ସଫ୍ଟୱେର୍: ଆପଣ ନିଜ ଇଚ୍ଛାରେ ଏହାକୁ ବ୍ୟବହାର, ଅଧ୍ୟୟନ, ଅଂଶୀଦାର ଏବଂ ଉନ୍ନତି କରିପାରିବେ । ନିର୍ଦ୍ଦିଷ୍ଟ ଭାବରେ ଆପଣ ମାଗଣା ସଫ୍ଟୱେର୍ ଫାଉଣ୍ଡେସନ୍ ଦ୍ଵାରା ପ୍ରକାଶିତ GNU ଜେନେରାଲ୍ ପବ୍ଲିକ୍ ଲାଇସେନ୍ସର ସର୍ତ୍ତାବଳୀ ଅନୁଯାୟୀ ଏହାକୁ ପୁନ istr ବଣ୍ଟନ ଏବଂ / କିମ୍ବା ରୂପାନ୍ତର କରିପାରିବେ, ଲାଇସେନ୍ସର ସଂସ୍କରଣ 3 କିମ୍ବା ପରବର୍ତ୍ତୀ ସଂସ୍କରଣରେ (ଆପଣଙ୍କ ବିକଳ୍ପରେ) । \"ପ୍ଲେୟାର୍ କ୍ରାସ୍\" ଦେଖାନ୍ତୁ - ଗୁଗୁଲ୍ ନିଆଯିବା ଠାରୁ ୟୁଟ୍ୟୁବ୍ ସଦସ୍ୟତା ଆମଦାନୀ କରନ୍ତୁ: -\n -\n1. ଏହି URL କୁ ଯାଆନ୍ତୁ: %1$s । -\n2. ପଚରାଗଲେ ଲଗ୍ ଇନ୍ କରନ୍ତୁ । -\n3. \"ସମସ୍ତ ତଥ୍ୟ ଅନ୍ତର୍ଭୂକ୍ତ\" ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ, ତାପରେ \"ସମସ୍ତ ଚୟନ କରନ୍ତୁ\" ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ, ତାପରେ କେବଳ \"ସଦସ୍ୟତା\" ଚୟନ କରନ୍ତୁ ଏବଂ \"ଓକେ\" କ୍ଲିକ୍ କରନ୍ତୁ । -\n4. \"ପରବର୍ତ୍ତୀ ପଦକ୍ଷେପ\" ଏବଂ ତାପରେ \"ରପ୍ତାନି ସୃଷ୍ଟି\" ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ । -\n5. ଏହା ଦେଖାଯିବା ପରେ \"ଡାଉନଲୋଡ୍\" ବଟନ୍ ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ । -\n6. ନିମ୍ନରେ IMPORT FILE ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ ଏବଂ ଡାଉନଲୋଡ୍ ହୋଇଥିବା .zip ଫାଇଲ୍ ଚୟନ କରନ୍ତୁ । -\n7. [ଯଦି .zip ଆମଦାନି ବିଫଳ] + ଗୁଗୁଲ୍ ନିଆଯିବା ଠାରୁ ୟୁଟ୍ୟୁବ୍ ସଦସ୍ୟତା ଆମଦାନୀ କରନ୍ତୁ: \n \n1. ଏହି URL କୁ ଯାଆନ୍ତୁ: %1$s । \n2. ପଚରାଗଲେ ଲଗ୍ ଇନ୍ କରନ୍ତୁ । \n3. \"ସମସ୍ତ ତଥ୍ୟ ଅନ୍ତର୍ଭୂକ୍ତ\" ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ, ତାପରେ \"ସମସ୍ତ ଚୟନ କରନ୍ତୁ\" ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ, ତାପରେ କେବଳ \"ସଦସ୍ୟତା\" ଚୟନ କରନ୍ତୁ ଏବଂ \"ଓକେ\" କ୍ଲିକ୍ କରନ୍ତୁ । \n4. \"ପରବର୍ତ୍ତୀ ପଦକ୍ଷେପ\" ଏବଂ ତାପରେ \"ରପ୍ତାନି ସୃଷ୍ଟି\" ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ । \n5. ଏହା ଦେଖାଯିବା ପରେ \"ଡାଉନଲୋଡ୍\" ବଟନ୍ ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ । \n6. ନିମ୍ନରେ IMPORT FILE ଉପରେ କ୍ଲିକ୍ କରନ୍ତୁ ଏବଂ ଡାଉନଲୋଡ୍ ହୋଇଥିବା .zip ଫାଇଲ୍ ଚୟନ କରନ୍ତୁ । \n7. [ଯଦି .zip ଆମଦାନି ବିଫଳ] ମୋବାଇଲ୍ ଡାଟା ସୁଇଚ୍ କରିବା ସମୟରେ ଉପଯୋଗୀ, ଯଦିଓ କିଛି ଡାଉନଲୋଡ୍ ସ୍ଥଗିତ ହୋଇପାରିବ ନାହିଁ କେତେକ ସେବାରେ ଉପଲବ୍ଧ, ଏହା ସାଧାରଣତଃ ଅଧିକ ତୀବ୍ର ଅଟେ କିନ୍ତୁ ଏକ ସୀମିତ ପରିମାଣର ଆଇଟମ୍ ଏବଂ ପ୍ରାୟତଃ ଅସମ୍ପୂର୍ଣ୍ଣ ସୂଚନା ଫେରସ୍ତ କରିପାରେ (ଯଥା କୌଣସି ଅବଧି, ଆଇଟମ୍ ପ୍ରକାର, ଜୀବନ୍ତ ସ୍ଥିତି ନାହିଁ) - ଆପଣ ଭାବୁଛନ୍ତି କି ଫିଡ୍ ଲୋଡିଂ ବହୁତ ଧୀର ଅଟେ\? ଯଦି ଏହା ହୁଏ, ଦ୍ରୁତ ଲୋଡିଂ ସକ୍ଷମ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ (ଆପଣ ଏହାକୁ ସେଟିଂସମୂହରେ କିମ୍ବା ତଳେ ଥିବା ବଟନ୍ ଦବାଇ ଏହାକୁ ପରିବର୍ତ୍ତନ କରିପାରିବେ) । -\n -\nNewPipe ଦୁଇଟି ଫିଡ୍ ଲୋଡିଂ କ strateg ଶଳ ପ୍ରଦାନ କରେ: -\n• ସମଗ୍ର ସବସ୍କ୍ରିପସନ୍ ଚ୍ୟାନେଲ୍ ଆଣିବା, ଯାହା ଧୀର କିନ୍ତୁ ସଂପୂର୍ଣ୍ଣ । -\nଏକ ଉତ୍ସର୍ଗୀକୃତ ସେବା ଶେଷ ପଏଣ୍ଟ ବ୍ୟବହାର କରିବା, ଯାହା ଦ୍ରୁତ କିନ୍ତୁ ସାଧାରଣତଃ ସଂପୂର୍ଣ୍ଣ ନୁହେଁ । -\n -\nଉଭୟଙ୍କ ମଧ୍ୟରେ ପାର୍ଥକ୍ୟ ହେଉଛି ଦ୍ରୁତତମରେ ସାଧାରଣତ some କିଛି ସୂଚନା ଅଭାବ ଥାଏ, ଯେପରିକି ଆଇଟମ୍ ର ଅବଧି କିମ୍ବା ପ୍ରକାର (ଲାଇଭ୍ ଭିଡିଓ ଏବଂ ସାଧାରଣ ଭିଡିଓ ମଧ୍ୟରେ ପାର୍ଥକ୍ୟ କରିପାରିବ ନାହିଁ) ଏବଂ ଏହା କମ୍ ଆଇଟମ୍ ଫେରସ୍ତ କରିପାରେ । -\n -\nୟୁଟ୍ୟୁବ୍ ହେଉଛି ଏକ ସେବାର ଏକ ଉଦାହରଣ ଯାହା ଏହାର RSS ଫିଡ୍ ସହିତ ଏହି ଦ୍ରୁତ ପଦ୍ଧତି ପ୍ରଦାନ କରେ । -\n -\nତେଣୁ ଆପଣ ଯାହା ପସନ୍ଦ କରନ୍ତି ତାହା ପସନ୍ଦ ଫୁଟିବ: ଗତି କିମ୍ବା ସଠିକ୍ ସୂଚନା । - ଏହି କାର୍ଯ୍ୟ ପାଇଁ କୌଣସି ଉପଯୁକ୍ତ ଫାଇଲ ପରିଚାଳକ ମିଳିଲା ନାହିଁ । -\nଦୟାକରି ଏକ ଫାଇଲ୍ ମ୍ୟାନେଜର୍ ସଂସ୍ଥାପନ କରନ୍ତୁ କିମ୍ବା ଡାଉନଲୋଡ୍ ସେଟିଂସମୂହରେ \'%s\' ଅକ୍ଷମ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ + ଆପଣ ଭାବୁଛନ୍ତି କି ଫିଡ୍ ଲୋଡିଂ ବହୁତ ଧୀର ଅଟେ? ଯଦି ଏହା ହୁଏ, ଦ୍ରୁତ ଲୋଡିଂ ସକ୍ଷମ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ (ଆପଣ ଏହାକୁ ସେଟିଂସମୂହରେ କିମ୍ବା ତଳେ ଥିବା ବଟନ୍ ଦବାଇ ଏହାକୁ ପରିବର୍ତ୍ତନ କରିପାରିବେ) । \n \nNewPipe ଦୁଇଟି ଫିଡ୍ ଲୋଡିଂ କ strateg ଶଳ ପ୍ରଦାନ କରେ: \n• ସମଗ୍ର ସବସ୍କ୍ରିପସନ୍ ଚ୍ୟାନେଲ୍ ଆଣିବା, ଯାହା ଧୀର କିନ୍ତୁ ସଂପୂର୍ଣ୍ଣ । \nଏକ ଉତ୍ସର୍ଗୀକୃତ ସେବା ଶେଷ ପଏଣ୍ଟ ବ୍ୟବହାର କରିବା, ଯାହା ଦ୍ରୁତ କିନ୍ତୁ ସାଧାରଣତଃ ସଂପୂର୍ଣ୍ଣ ନୁହେଁ । \n \nଉଭୟଙ୍କ ମଧ୍ୟରେ ପାର୍ଥକ୍ୟ ହେଉଛି ଦ୍ରୁତତମରେ ସାଧାରଣତ some କିଛି ସୂଚନା ଅଭାବ ଥାଏ, ଯେପରିକି ଆଇଟମ୍ ର ଅବଧି କିମ୍ବା ପ୍ରକାର (ଲାଇଭ୍ ଭିଡିଓ ଏବଂ ସାଧାରଣ ଭିଡିଓ ମଧ୍ୟରେ ପାର୍ଥକ୍ୟ କରିପାରିବ ନାହିଁ) ଏବଂ ଏହା କମ୍ ଆଇଟମ୍ ଫେରସ୍ତ କରିପାରେ । \n \nୟୁଟ୍ୟୁବ୍ ହେଉଛି ଏକ ସେବାର ଏକ ଉଦାହରଣ ଯାହା ଏହାର RSS ଫିଡ୍ ସହିତ ଏହି ଦ୍ରୁତ ପଦ୍ଧତି ପ୍ରଦାନ କରେ । \n \nତେଣୁ ଆପଣ ଯାହା ପସନ୍ଦ କରନ୍ତି ତାହା ପସନ୍ଦ ଫୁଟିବ: ଗତି କିମ୍ବା ସଠିକ୍ ସୂଚନା । + ଏହି କାର୍ଯ୍ୟ ପାଇଁ କୌଣସି ଉପଯୁକ୍ତ ଫାଇଲ ପରିଚାଳକ ମିଳିଲା ନାହିଁ । \nଦୟାକରି ଏକ ଫାଇଲ୍ ମ୍ୟାନେଜର୍ ସଂସ୍ଥାପନ କରନ୍ତୁ କିମ୍ବା ଡାଉନଲୋଡ୍ ସେଟିଂସମୂହରେ \'%s\' ଅକ୍ଷମ କରିବାକୁ ଚେଷ୍ଟା କରନ୍ତୁ ଏହି ଭିଡିଓ କେବଳ ୟୁଟ୍ୟୁବ୍ ମ୍ୟୁଜିକ୍ ପ୍ରିମିୟମ୍ ସଦସ୍ୟଙ୍କ ପାଇଁ ଉପଲବ୍ଧ, ତେଣୁ ଏହାକୁ ନ୍ୟୁପାଇପ୍ ଦ୍ୱାରା ଷ୍ଟ୍ରିମ୍ କିମ୍ବା ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ । ଧାରଣ ଅନ୍ତରାଳର ଆକାରକୁ ପ୍ରଗତିଶୀଳ ବିଷୟବସ୍ତୁ (ବର୍ତ୍ତମାନ %s) ରେ ପରିବର୍ତ୍ତନ କରନ୍ତୁ । ଗୋଟିଏ ନିମ୍ନମାନ ସେମାନଙ୍କର ପ୍ରାରମ୍ଭିକ ଧାରଣକୁ ତ୍ୱରାନ୍ୱିତ କରିପାରେ - ଏହି କାର୍ଯ୍ୟ ପାଇଁ କୌଣସି ଉପଯୁକ୍ତ ଫାଇଲ ପରିଚାଳକ ମିଳିଲା ନାହିଁ । -\nଦୟାକରି ଏକ ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ ସୁସଙ୍ଗତ ଫାଇଲ୍ ମ୍ୟାନେଜର୍ ସଂସ୍ଥାପନ କରନ୍ତୁ + ଏହି କାର୍ଯ୍ୟ ପାଇଁ କୌଣସି ଉପଯୁକ୍ତ ଫାଇଲ ପରିଚାଳକ ମିଳିଲା ନାହିଁ । \nଦୟାକରି ଏକ ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ ସୁସଙ୍ଗତ ଫାଇଲ୍ ମ୍ୟାନେଜର୍ ସଂସ୍ଥାପନ କରନ୍ତୁ ଅନ୍ତତଃ ପକ୍ଷେ ଆପଣଙ୍କ ଦେଶରେ ଏହା ଏକ ସାଉଣ୍ଡକ୍ଲାଉଡ୍ ଗୋ + ଟ୍ରାକ୍, ତେଣୁ ଏହାକୁ ନ୍ୟୁପାଇପ୍ ଦ୍ୱାରା ଷ୍ଟ୍ରିମ୍ କିମ୍ବା ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ । ଆପଣ ବର୍ତ୍ତମାନ ବର୍ଣ୍ଣନା ଭିତରେ ଟେକ୍ସଟ୍ ଚୟନ କରିପାରିବେ । ଧ୍ୟାନ ଦିଅନ୍ତୁ ଯେ ପୃଷ୍ଠାଟି ଫ୍ଲିକର ହୋଇପାରେ ଏବଂ ଚୟନ ମୋଡରେ ଥିବାବେଳେ ଲିଙ୍କଗୁଡିକ କ୍ଲିକ୍ ହୋଇନପାରେ । ଏହି ବିଷୟବସ୍ତୁ କେବଳ ଉପଭୋକ୍ତାମାନଙ୍କ ପାଇଁ ଉପଲବ୍ଧ, ଯେଉଁମାନେ ଦେୟ ଦେଇଛନ୍ତି, ତେଣୁ ଏହାକୁ NewPipe ଦ୍ୱାରା ଷ୍ଟ୍ରିମିଟ୍ କିମ୍ବା ଡାଉନଲୋଡ୍ କରାଯାଇପାରିବ ନାହିଁ । - ୟୁରୋପୀୟ ଜେନେରାଲ୍ ଡାଟା ପ୍ରୋଟେକସନ୍ ରେଗୁଲେସନ୍ (GDPR) କୁ ପାଳନ କରିବାକୁ, ଆମେ ଏଠାରେ NewPipe ର ଗୋପନୀୟତା ନୀତି ପ୍ରତି ଆପଣଙ୍କ ଦୃଷ୍ଟି ଆକର୍ଷଣ କରୁ । ଦୟାକରି ଏହାକୁ ଭଲ ଭାବରେ ପଢ଼ନ୍ତୁ । -\nଆମକୁ ବଗ୍ ରିପୋର୍ଟ ପଠାଇବାକୁ ତୁମେ ଏହାକୁ ଗ୍ରହଣ କରିବା ଜରୁରୀ । + ୟୁରୋପୀୟ ଜେନେରାଲ୍ ଡାଟା ପ୍ରୋଟେକସନ୍ ରେଗୁଲେସନ୍ (GDPR) କୁ ପାଳନ କରିବାକୁ, ଆମେ ଏଠାରେ NewPipe ର ଗୋପନୀୟତା ନୀତି ପ୍ରତି ଆପଣଙ୍କ ଦୃଷ୍ଟି ଆକର୍ଷଣ କରୁ । ଦୟାକରି ଏହାକୁ ଭଲ ଭାବରେ ପଢ଼ନ୍ତୁ । \nଆମକୁ ବଗ୍ ରିପୋର୍ଟ ପଠାଇବାକୁ ତୁମେ ଏହାକୁ ଗ୍ରହଣ କରିବା ଜରୁରୀ । ସଦସ୍ୟତା ଗୁଡ଼ିକ କିଛି ରେଜୋଲୁସନରେ ଅଡିଓ ଅପସାରଣ କରେ ଉଚ୍ଚ ରେଜୋଲୁସନ ଦେଖାନ୍ତୁ @@ -204,7 +182,7 @@ ଏଥିରେ ଯୋଡ଼ିବା ଡିଫଲ୍ଟ ପପ୍ଅପ୍ ରେଜୋଲୁସନ କେବଳ କିଛି ଡିଭାଇସ୍ 2K / 4K ଭିଡିଓ ଚଲାଇ ପାରିବେ - ନିଖୋଜ କୋର ଆପ୍ ସଂସ୍ଥାପନ କରିବେ\? + ନିଖୋଜ କୋର ଆପ୍ ସଂସ୍ଥାପନ କରିବେ? ଥମ୍ୱନେଲ କୁ 1:1 ଅନୁପାତରେ କ୍ରୋପ୍ କରନ୍ତୁ ପ୍ରଥମ କୃତ୍ୟ ବଟନ୍ ତୃତୀୟ କୃତ୍ୟ ବଟନ୍ @@ -260,11 +238,11 @@ ମେନ୍ କୁ ସୁଇଚ୍ କର ଡାଟାବେସ୍ ରପ୍ତାନି କରନ୍ତୁ ରପ୍ତାନି ଇତିହାସ, ସଦସ୍ୟତା, ପ୍ଲେଲିଷ୍ଟ ଏବଂ ସେଟିଂସମୂହ - ସମ୍ପୂର୍ଣ୍ଣ ଘଣ୍ଟା ଇତିହାସ ବିଲୋପ କରିବେ କି\? + ସମ୍ପୂର୍ଣ୍ଣ ଘଣ୍ଟା ଇତିହାସ ବିଲୋପ କରିବେ କି? ପ୍ଲେବେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ କରନ୍ତୁ ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ଡିଲିଟ୍ କରେ ସନ୍ଧାନ ଇତିହାସ ସଫା କରନ୍ତୁ - ସମଗ୍ର ସନ୍ଧାନ ଇତିହାସ ବିଲୋପ କରିବେ କି\? + ସମଗ୍ର ସନ୍ଧାନ ଇତିହାସ ବିଲୋପ କରିବେ କି? ବହିଃ-ଷ୍ଟୋରେଜ୍ ଅନୁପଲବ୍ଧ ନେଟୱର୍କ ତ୍ରୁଟି ସମସ୍ତ ଥମ୍ୱନେଲ୍ ଲୋଡ୍ କରିପାରିଲା ନାହିଁ @@ -276,7 +254,7 @@ କୌଣସି ଅଡିଓ ଷ୍ଟ୍ରିମ୍ ମିଳିଲା ନାହିଁ ଏକ ତ୍ରୁଟି ଘଟିଲା:%1$s ଡାଉନଲୋଡ୍ କରିବାକୁ କୌଣସି ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ - ଆପଣ ଡିଫଲ୍ଟ ପୁନଃସ୍ଥାପନ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ଆପଣ ଡିଫଲ୍ଟ ପୁନଃସ୍ଥାପନ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? NewPipe ଏକ ତ୍ରୁଟିର ସମ୍ମୁଖୀନ ହେଲା, ରିପୋର୍ଟ କରିବାକୁ ଟ୍ୟାପ୍ କରନ୍ତୁ ଦୁଃଖିତ, ତାହା ହୋଇ ନଥାନ୍ତା । ଇ-ମେଲ ମାଧ୍ୟମରେ ରିପୋର୍ଟ କରନ୍ତୁ @@ -333,7 +311,7 @@ ପପ୍ଅପ୍ ପ୍ଲେୟାର୍ ନୂତନ ପ୍ଲେଲିଷ୍ଟ ଅନ୍ମୁଟ୍ କରନ୍ତୁ - ଏହି ପ୍ଲେଲିଷ୍ଟ ବିଲୋପ କରିବେ କି\? + ଏହି ପ୍ଲେଲିଷ୍ଟ ବିଲୋପ କରିବେ କି? କୌଣସି କ୍ୟାପସନ୍ ନାହିଁ ଫିଟ୍ ମେମୋରୀ ଲିକ୍ ମନିଟରିଂ ହିପ୍ ଡମ୍ପିଂ କରିବା ସମୟରେ ଆପ୍ ପ୍ରତିକ୍ରିୟାଶୀଳ ହୋଇପାରେ @@ -346,9 +324,7 @@ ରପ୍ତାନି… ଫାଇଲ୍ ଆମଦାନୀ କରନ୍ତୁ ପୂର୍ବ ରପ୍ତାନି - ମନେରଖନ୍ତୁ ଏହି ଅପରେସନ୍ ନେଟୱାର୍କ ମହଙ୍ଗା ହୋଇପାରେ । -\n -\nଆପଣ ଜାରି ରଖିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ମନେରଖନ୍ତୁ ଏହି ଅପରେସନ୍ ନେଟୱାର୍କ ମହଙ୍ଗା ହୋଇପାରେ । \n \nଆପଣ ଜାରି ରଖିବାକୁ ଚାହୁଁଛନ୍ତି କି? ବାରମ୍ବାର ଯାଞ୍ଚ କରୁଛି ନୂତନ ଷ୍ଟ୍ରିମ୍ ବିଜ୍ଞପ୍ତିଗୁଡିକ ଆବଶ୍ୟକ ନେଟୱର୍କ ସଂଯୋଗ @@ -376,7 +352,7 @@ ପରବର୍ତ୍ତୀ ପ୍ରକ୍ରିୟାକରଣ ବିଫଳ ହେଲା ଫାଇଲରେ କାମ କରିବାବେଳେ ନ୍ୟୁ ପାଇପ୍ ବନ୍ଦ ହୋଇଯାଇଥିଲା ଡିଭାଇସରେ କୌଣସି ସ୍ଥାନ ବାକି ନାହିଁ - ଡିସ୍କରୁ ସମସ୍ତ ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡ଼ିକୁ ଲିଭାନ୍ତୁ\? + ଡିସ୍କରୁ ସମସ୍ତ ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡ଼ିକୁ ଲିଭାନ୍ତୁ? ବନ୍ଦ କର ସର୍ବାଧିକ ପୁନଃଚେଷ୍ଟା ମିଟର ନେଟୱାର୍କରେ ବାଧା @@ -387,7 +363,7 @@ ଆଣ୍ଡ୍ରଏଡ୍ 10 ରୁ କେବଳ \'ଷ୍ଟୋରେଜ୍ ଆକ୍ସେସ୍ ଫ୍ରେମୱାର୍କ\' ସମର୍ଥିତ ଏକ ଉଦାହରଣ ବାଛନ୍ତୁ ExoPlayer ପ୍ରତିବନ୍ଧକ ହେତୁ ସନ୍ଧାନ ସମୟସୀମା %d ସେକେଣ୍ଡରେ ସେଟ୍ ହୋଇଥିଲା - ଆପଣ ଏହି ଗୋଷ୍ଠୀ ବିଲୋପ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ଆପଣ ଏହି ଗୋଷ୍ଠୀ ବିଲୋପ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? କେବଳ ଅଣସଂଗଠିତ ସଦସ୍ୟତା ଦେଖାନ୍ତୁ ଫିଡ୍ ଫିଡ୍ ଅପଡେଟ୍ ସୀମା @@ -490,12 +466,10 @@ ExoPlayer ଡିଫଲ୍ଟ ବୟସ ସୀମା ଅଜ୍ଞାତ ଗୁଣବତ୍ତା - ଏହି ଭିଡିଓ ବୟସ ସୀମିତ ଅଟେ । -\n -\nଯଦି ଆପଣ ଏହାକୁ ଦେଖିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସେଟିଂସମୂହରେ \"%1$s\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ । + ଏହି ଭିଡିଓ ବୟସ ସୀମିତ ଅଟେ । \n \nଯଦି ଆପଣ ଏହାକୁ ଦେଖିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସେଟିଂସମୂହରେ \"%1$s\" ଟର୍ନ୍ ଅନ୍ କରନ୍ତୁ । ତ୍ରୁଟି ରିପୋର୍ଟ ଆଲବମ୍ ଗୁଡ଼ିକ - ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭଵ ନୁହେଁ। ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରିବେ କି\? + ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବା ସମ୍ଭଵ ନୁହେଁ। ଡାଉନଲୋଡ୍ ଫୋଲ୍ଡର୍ ଅବସ୍ଥାନ ପୁନଃସେଟ୍ କରିବେ କି? ଫାଇଲ୍ ଡିଲିଟ୍ ହୋଇଛି କେବଳ ଥରେ ନୂତନ ପାଇପ୍ ବିଜ୍ଞପ୍ତି @@ -507,7 +481,7 @@ ଆପଣଙ୍କର ସାମ୍ପ୍ରତିକ ଇତିହାସ, ସଦସ୍ୟତା, ପ୍ଲେଲିଷ୍ଟ ଏବଂ (ଇଚ୍ଛାଧୀନ) ସେଟିଂସମୂହକୁ ନବଲିଖନ କରେ ଘଣ୍ଟା ଇତିହାସ ସଫା କରନ୍ତୁ ଖେଳାଯାଇଥିବା ଷ୍ଟ୍ରିମ୍ ଏବଂ ପ୍ଲେକ୍ ସ୍ଥିତିକୁ ବିଲୋପ କରେ - ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ବିଲୋପ କରିବେ କି\? + ସମସ୍ତ ପ୍ଲେକ୍ ପୋଜିସନ୍ ବିଲୋପ କରିବେ କି? ସନ୍ଧାନ କୀ ଶବ୍ଦର ଇତିହାସ ବିଲୋପ କରେ ତ୍ରୁଟି ପୁନରୁଦ୍ଧାର ନ ହୋଇପାରିଲା ପରି ପ୍ଲେୟାର ତ୍ରୁଟି ଘଟିଲା @@ -519,7 +493,7 @@ ଏକ ତ୍ରୁଟି ଘଟିଛି, ବିଜ୍ଞପ୍ତିକୁ ଦେଖନ୍ତୁ ଫର୍ମାଟ୍ ହୋଇଥିବା ରିପୋର୍ଟ କପି କରନ୍ତୁ ଅନ୍ୟ ଆପ୍ସ ଉପରେ ପ୍ରଦର୍ଶନ କରିବାକୁ ଅନୁମତି ଦିଅନ୍ତୁ - ଦୟାକରି ଯାଞ୍ଚ କରନ୍ତୁ ଯେ ଆପଣଙ୍କର କ୍ରାସ୍ ବିଷୟରେ ଆଲୋଚନା କରୁଥିବା ଏକ ସମସ୍ୟା ପୂର୍ବରୁ ଅଛି କି\? ନକଲ ଟିକେଟ୍ ତିଆରି କରିବାବେଳେ, ଆପଣ ଆମଠାରୁ ସମୟ ନିଅନ୍ତି ଯାହାକୁ ଆମେ ପ୍ରକୃତ ତ୍ରୁଟି ସୁଧାରିବା ସହିତ ଖର୍ଚ୍ଚ କରିପାରିବା । + ଦୟାକରି ଯାଞ୍ଚ କରନ୍ତୁ ଯେ ଆପଣଙ୍କର କ୍ରାସ୍ ବିଷୟରେ ଆଲୋଚନା କରୁଥିବା ଏକ ସମସ୍ୟା ପୂର୍ବରୁ ଅଛି କି? ନକଲ ଟିକେଟ୍ ତିଆରି କରିବାବେଳେ, ଆପଣ ଆମଠାରୁ ସମୟ ନିଅନ୍ତି ଯାହାକୁ ଆମେ ପ୍ରକୃତ ତ୍ରୁଟି ସୁଧାରିବା ସହିତ ଖର୍ଚ୍ଚ କରିପାରିବା । ଆପଣଙ୍କର ମନ୍ତବ୍ୟ (ଇଂରାଜୀରେ): ସମ୍ବନ୍ଧୀୟ ଆଇଟମ୍ ଗୁଡ଼ିକ ପୁନଃ ସଯାଇବାକୁ ଡ୍ରାଗ୍ କରନ୍ତୁ @@ -537,29 +511,22 @@ © %1$s ଦ୍ଵାରା %2$s ରେ %3$s ଆପଣଙ୍କର ଧାରଣା ଅଛି କି ନାହିଁ; ଅନୁବାଦ, ଡିଜାଇନ୍ ପରିବର୍ତ୍ତନ, କୋଡ୍ ସଫା କରିବା, କିମ୍ବା ପ୍ରକୃତ ଭାରୀ କୋଡ୍ ପରିବର୍ତ୍ତନ - ସାହାଯ୍ୟ ସର୍ବଦା ସ୍ୱାଗତଯୋଗ୍ୟ ।ଯେତେ ଭଲ ହୁଏ ସେତେ ଭଲ ହୁଏ! ଆଣ୍ଡ୍ରଏଡରେ ସ୍ଵାଧୀନ ହାଲୁକା ଷ୍ଟ୍ରିମିଂ । - ନ୍ୟୁ ପାଇପ୍ ପ୍ରୋଜେକ୍ଟ ଆପଣଙ୍କ ଗୋପନୀୟତାକୁ ଅତି ଗମ୍ଭୀରତାର ସହିତ ନେଇଥାଏ । ତେଣୁ, ଆପଣଙ୍କ ସମ୍ମତି ବିନା ଆପ୍ କୌଣସି ତଥ୍ୟ ସଂଗ୍ରହ କରେ ନାହିଁ । -\nNewPipe ର ଗୋପନୀୟତା ନୀତି ବିସ୍ତୃତ ଭାବରେ ବ୍ୟାଖ୍ୟା କରେ ଯେତେବେଳେ ଆପଣ କ୍ରାସ୍ ରିପୋର୍ଟ ପଠାନ୍ତି କେଉଁ ତଥ୍ୟ ପଠାଯାଏ ଏବଂ ଗଚ୍ଛିତ ହୁଏ । + ନ୍ୟୁ ପାଇପ୍ ପ୍ରୋଜେକ୍ଟ ଆପଣଙ୍କ ଗୋପନୀୟତାକୁ ଅତି ଗମ୍ଭୀରତାର ସହିତ ନେଇଥାଏ । ତେଣୁ, ଆପଣଙ୍କ ସମ୍ମତି ବିନା ଆପ୍ କୌଣସି ତଥ୍ୟ ସଂଗ୍ରହ କରେ ନାହିଁ । \nNewPipe ର ଗୋପନୀୟତା ନୀତି ବିସ୍ତୃତ ଭାବରେ ବ୍ୟାଖ୍ୟା କରେ ଯେତେବେଳେ ଆପଣ କ୍ରାସ୍ ରିପୋର୍ଟ ପଠାନ୍ତି କେଉଁ ତଥ୍ୟ ପଠାଯାଏ ଏବଂ ଗଚ୍ଛିତ ହୁଏ । ମୁଖ୍ୟ ପୃଷ୍ଠାର ବିଷୟବସ୍ତୁ ଏକ ପ୍ଲେଲିଷ୍ଟ ଚୟନ କରନ୍ତୁ ଆମଦାନୀ ହୋଇଛି ଏହା ତୁମର ସାମ୍ପ୍ରତିକ ସେଟଅପ୍ କୁ ନବଲିଖନ କରିବ । ଧାଡି ଚଲାନ୍ତୁ - ଏହି ଅନୁମତି ଆବଶ୍ୟକ -\nପପ୍ଅପ୍ ମୋଡ୍ ରେ ଖୋଲ + ଏହି ଅନୁମତି ଆବଶ୍ୟକ \nପପ୍ଅପ୍ ମୋଡ୍ ରେ ଖୋଲ ଏକ ତ୍ରୁଟି ବିଜ୍ଞପ୍ତି ସୃଷ୍ଟି କରନ୍ତୁ କୁ ରପ୍ତାନି କରନ୍ତୁ - URL କିମ୍ବା ଆପଣଙ୍କର ID ଟାଇପ୍ କରି ଏକ ସାଉଣ୍ଡ କ୍ଲାଉଡ୍ ପ୍ରୋଫାଇଲ୍ ଆମଦାନୀ କରନ୍ତୁ: -\n -\nଏକ ୱେବ୍ ବ୍ରାଉଜରରେ “ଡେସ୍କଟପ୍ ମୋଡ୍” ସକ୍ଷମ କର (ମୋବାଇଲ୍ ଡିଭାଇସ୍ ପାଇଁ ସାଇଟ୍ ଉପଲବ୍ଧ ନୁହେଁ) -\n2. ଏହି URL କୁ ଯାଆନ୍ତୁ:%1$s । -\n3. ପଚରାଗଲେ ଲଗ୍ ଇନ୍ କରନ୍ତୁ । -\n4. ଆପଣ ପୁନଃ ନିର୍ଦ୍ଦେଶିତ ହୋଇଥିବା ପ୍ରୋଫାଇଲ୍ URL କପି କରନ୍ତୁ । + URL କିମ୍ବା ଆପଣଙ୍କର ID ଟାଇପ୍ କରି ଏକ ସାଉଣ୍ଡ କ୍ଲାଉଡ୍ ପ୍ରୋଫାଇଲ୍ ଆମଦାନୀ କରନ୍ତୁ: \n \nଏକ ୱେବ୍ ବ୍ରାଉଜରରେ “ଡେସ୍କଟପ୍ ମୋଡ୍” ସକ୍ଷମ କର (ମୋବାଇଲ୍ ଡିଭାଇସ୍ ପାଇଁ ସାଇଟ୍ ଉପଲବ୍ଧ ନୁହେଁ) \n2. ଏହି URL କୁ ଯାଆନ୍ତୁ:%1$s । \n3. ପଚରାଗଲେ ଲଗ୍ ଇନ୍ କରନ୍ତୁ । \n4. ଆପଣ ପୁନଃ ନିର୍ଦ୍ଦେଶିତ ହୋଇଥିବା ପ୍ରୋଫାଇଲ୍ URL କପି କରନ୍ତୁ । ପିଚ୍ ମୋବାଇଲ୍ ଡାଟା ବ୍ୟବହାର କରିବା ସମୟରେ ରେଜୋଲୁସନ ସୀମିତ କରନ୍ତୁ ଅଦ୍ୟତନ ପାଇଁ ଯାଞ୍ଚ କରୁଛି… ସେକ୍ବାର୍ ଥମ୍ୱନେଲ୍ ପୂର୍ବାବଲୋକନ ଉଚ୍ଚ ଗୁଣବତ୍ତା (ବଡ଼) - ଆପଣ ଆପଣଙ୍କର ଡାଉନଲୋଡ୍ ଇତିହାସ ସଫା କରିବାକୁ କିମ୍ବା ସମସ୍ତ ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡିକ ବିଲୋପ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ଆପଣ ଆପଣଙ୍କର ଡାଉନଲୋଡ୍ ଇତିହାସ ସଫା କରିବାକୁ କିମ୍ବା ସମସ୍ତ ଡାଉନଲୋଡ୍ ହୋଇଥିବା ଫାଇଲଗୁଡିକ ବିଲୋପ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? ସର୍ଭର ଖୋଜି ପାଇଲା ନାହିଁ %1$s ଡାଉନଲୋଡ୍ ଡିଲିଟ୍ ହୋଇଛି @@ -571,17 +538,14 @@ \'%s\' ପାଇଁ ଫିଡ୍ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ । ନୂତନ ଫିଡ୍ ଆଇଟମ୍ - ଲେଖକଙ୍କ ଆକାଉଣ୍ଟକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି । -\nଭବିଷ୍ୟତରେ NewPipe ଏହି ଫିଡ୍ ଲୋଡ୍ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । -\nଆପଣ ଏହି ଚ୍ୟାନେଲରୁ ସଦସ୍ୟତା ରଦ୍ଦ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ଲେଖକଙ୍କ ଆକାଉଣ୍ଟକୁ ବନ୍ଦ କରିଦିଆଯାଇଛି । \nଭବିଷ୍ୟତରେ NewPipe ଏହି ଫିଡ୍ ଲୋଡ୍ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । \nଆପଣ ଏହି ଚ୍ୟାନେଲରୁ ସଦସ୍ୟତା ରଦ୍ଦ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? ଅନ୍ତଃସ୍ଥ ଆପଣ ବର୍ତ୍ତମାନ ଏହି ଚ୍ୟାନେଲକୁ ସବସ୍କ୍ରାଇବ କରିଛନ୍ତି ବହିଃ-ଚାଳକ ନିମନ୍ତେ କୌଣସି ଵିଡ଼ିଓ ଷ୍ଟ୍ରିମ୍ ଉପଲବ୍ଧ ନାହିଁ ସୃଷ୍ଟିକର୍ତ୍ତାଙ୍କ ଦ୍ୱାରା ହୃଦୟ ଷ୍ଟ୍ରିମ୍ ଯାହା ଏପର୍ଯ୍ୟନ୍ତ ଡାଉନଲୋଡର୍ ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ ଅଜ୍ଞାତ ଫର୍ମାଟ୍ - ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍‍କୁ କେଉଁଠାରେ ସଞ୍ଚୟ କରାଯିବ ତା\' ଆପଣଙ୍କୁ ପଚରାଯିବ। -\nଯଦି ଆପଣ ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ଚୟକ (SAF)କୁ ସକ୍ଷମ କରନ୍ତୁ + ପ୍ରତ୍ୟେକ ଡାଉନଲୋଡ୍‍କୁ କେଉଁଠାରେ ସଞ୍ଚୟ କରାଯିବ ତା\' ଆପଣଙ୍କୁ ପଚରାଯିବ। \nଯଦି ଆପଣ ଏକ ବହିଃ SD କାର୍ଡରେ ଡାଉନଲୋଡ୍ କରିବାକୁ ଚାହୁଁଛନ୍ତି ତେବେ ସିଷ୍ଟମ୍ ଫୋଲ୍ଡର୍ ଚୟକ (SAF)କୁ ସକ୍ଷମ କରନ୍ତୁ ମେମୋରୀ ଲିକ୍ ଦେଖାନ୍ତୁ ଆଇଟମଗୁଡିକରେ ମୂଳ ସମୟ ପୂର୍ବରୁ ଦେଖାନ୍ତୁ ବିସର୍ଜନ ପରେ ଖଣ୍ଡ କିମ୍ବା କାର୍ଯ୍ୟକଳାପ ଜୀବନଚକ୍ର ବାହାରେ ଅଣସଂରକ୍ଷିତ Rx ବ୍ୟତିକ୍ରମଗୁଡିକର ଫୋର୍ସ ରିପୋର୍ଟିଂ @@ -621,7 +585,7 @@ ପ୍ରାୟତଃ ପଚରାଯାଇଥିବା ପ୍ରଶ୍ନ ଯଦି ଆପଣ ଆପ୍ ବ୍ୟବହାର କରିବାରେ ଅସୁବିଧାର ସମ୍ମୁଖୀନ ହେଉଛନ୍ତି, ସାଧାରଣ ପ୍ରଶ୍ନର ଏହି ଉତ୍ତରଗୁଡିକ ଯାଞ୍ଚ କରିବାକୁ ନିଶ୍ଚିତ ହୁଅନ୍ତୁ! ୱେବସାଇଟ୍ ରେ ଦେଖନ୍ତୁ - ଆପଣ ସନ୍ଧାନ ଇତିହାସରୁ ଏହି ଆଇଟମ୍ ବିଲୋପ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ଆପଣ ସନ୍ଧାନ ଇତିହାସରୁ ଏହି ଆଇଟମ୍ ବିଲୋପ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? ଅଧିକାଂଶ ପ୍ଲେ ହୋଇଛି ମୁଖ୍ୟ ପୃଷ୍ଠାରେ କେଉଁ ଟ୍ୟାବଗୁଡ଼ିକ ଦେଖାଯାଏ ଏକ ଚ୍ୟାନେଲ୍ ଚୟନ କରନ୍ତୁ @@ -629,7 +593,7 @@ ଏପର୍ଯ୍ୟନ୍ତ କୌଣସି ଚ୍ୟାନେଲ ରେ ସଦସ୍ୟତା ନାହିଁ ଏକ କିଓସ୍କ ଚୟନ କରନ୍ତୁ ଚେତାବନୀ: ସମସ୍ତ ଫାଇଲ୍ ଆମଦାନି କରିପାରିଲା ନାହିଁ । - ଆପଣ ସେଟିଂସମୂହ ମଧ୍ୟ ଆମଦାନୀ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ଆପଣ ସେଟିଂସମୂହ ମଧ୍ୟ ଆମଦାନୀ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? ମନ୍ତବ୍ୟ ଲୋଡ୍ ହୋଇପାରିଲା ନାହିଁ ଅଧିକାଂଶ ପସନ୍ଦ କରନ୍ତି ଚ୍ୟାନେଲର ବିବରଣୀ ଦେଖାନ୍ତୁ @@ -678,9 +642,7 @@ ଏକ ସଦସ୍ୟତା ପୂର୍ବରୁ ଶେଷ ଅଦ୍ୟତନ ପରେ ସମୟ ପୁରୁଣା ବୋଲି ବିବେଚନା କରାଯାଏ -%s ଫିଡ୍ ଲୋଡ୍ କରିବାରେ ତ୍ରୁଟି ଫାଷ୍ଟ ଫିଡ୍ ମୋଡ୍ ଏହା ଉପରେ ଅଧିକ ସୂଚନା ପ୍ରଦାନ କରେ ନାହିଁ । - ଏହି ବିଷୟବସ୍ତୁ ଏପର୍ଯ୍ୟନ୍ତ NewPipe ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ । -\n -\nଭବିଷ୍ୟତ ସଂସ୍କରଣରେ ଏହା ସମର୍ଥିତ ହେବ ବୋଲି ଆଶା କରୁଛି । + ଏହି ବିଷୟବସ୍ତୁ ଏପର୍ଯ୍ୟନ୍ତ NewPipe ଦ୍ୱାରା ସମର୍ଥିତ ନୁହେଁ । \n \nଭବିଷ୍ୟତ ସଂସ୍କରଣରେ ଏହା ସମର୍ଥିତ ହେବ ବୋଲି ଆଶା କରୁଛି । ଆପଣ ନିମ୍ନରେ ଆପଣଙ୍କର ପ୍ରିୟ ରାତିର ଥିମ୍ ଚୟନ କରିପାରିବେ ଡାଉନଲୋଡ୍ ଆରମ୍ଭ ହୋଇଛି ଟ୍ୟାଗ୍ସ @@ -714,8 +676,8 @@ ହାର୍ଡୱେର୍ ମିଡିଆ ବଟନ୍ ଇଭେଣ୍ଟଗୁଡ଼ିକୁ ଉପେକ୍ଷା କରନ୍ତୁ ଉପଯୋଗୀ, ଉଦାହରଣ ସ୍ୱରୂପ, ଯଦି ଆପଣ ଭଙ୍ଗା ଶାରୀରିକ ବଟନ୍ ସହିତ ହେଡସେଟ୍ ବ୍ୟବହାର କରୁଛନ୍ତି ନକଲଗୁଡିକ ଅପସାରଣ କରନ୍ତୁ - ନକଲ ଗୁଡିକ ହଟାନ୍ତୁ\? - ଆପଣ ଏହି ପ୍ଲେଲିଷ୍ଟରେ ଥିବା ସମସ୍ତ ନକଲ ଷ୍ଟ୍ରିମ୍ ଅପସାରଣ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି\? + ନକଲ ଗୁଡିକ ହଟାନ୍ତୁ? + ଆପଣ ଏହି ପ୍ଲେଲିଷ୍ଟରେ ଥିବା ସମସ୍ତ ନକଲ ଷ୍ଟ୍ରିମ୍ ଅପସାରଣ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? ନିମ୍ନଲିଖିତ ଷ୍ଟ୍ରିମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ ଷ୍ଟ୍ରିମ୍ ଗୁଡିକ ଦେଖାନ୍ତୁ/ଲୁଚାନ୍ତୁ ପୁରା ଦେଖାଯାଇଛି @@ -749,9 +711,7 @@ ସର୍ବଦା ExoPlayer ର ଭିଡ଼ିଓ ଆଉଟପୁଟ୍ ପୃଷ୍ଠ ବିନ୍ୟାସ କାର୍ଯ୍ଯକ୍ଷେତ୍ରକୁ ବ୍ୟବହାର କରନ୍ତୁ ଆପଣଙ୍କର ଡିଭାଇସରେ ଡିଫଲ୍ଟ ଭାବରେ ମିଡିଆ ସୁଡଙ୍ଗକୁ ନିଷ୍କ୍ରିୟ କରାଯାଇଛି କାରଣ ଆପଣଙ୍କର ଡିଭାଇସ ମଡେଲ ଏହାକୁ ସମର୍ଥନ କରୁନାହିଁ ବୋଲି ଜଣାଅଛି । ExoPlayer ବିନ୍ୟାସଗୁଡ଼ିକ - ଏହି ୱାର୍କଆରାଉଣ୍ଡ ଭିଡିଓ କୋଡେକଗୁଡ଼ିକୁ ରିଲିଜ କରିଥାଏ ଏବଂ ପୁନଃସ୍ଥାପନ କରିଥାଏ ଯେତେବେଳେ ଗୋଟିଏ ପୃଷ୍ଠ ପରିବର୍ତ୍ତନ ହୋଇଥାଏ, ଭୂପୃଷ୍ଠକୁ ସିଧାସଳଖ କୋଡେକରେ ସେଟ କରିବା ପରିବର୍ତ୍ତେ । ଏହି ସମସ୍ୟା ସହିତ କିଛି ଉପକରଣରେ ExoPlayer ଦ୍ୱାରା ପୂର୍ବରୁ ବ୍ୟବହୃତ, ଏହି ସଂରଚନା କେବଳ ଆଣ୍ଡ୍ରଏଡ 6 ଏବଂ ଉଚ୍ଚତର ଉପରେ ପ୍ରଭାବ ପକାଇଥାଏ -\n -\nଏହି ବିକଳ୍ପକୁ ସକ୍ରିୟ କରିବା ସାମ୍ପ୍ରତିକ ଭିଡିଓ ପ୍ଲେୟାରକୁ ବଦଳାଇବା କିମ୍ବା ସମ୍ପୂର୍ଣ୍ଣ ପରଦାକୁ ପରିବର୍ତ୍ତନ କରିବା ସମୟରେ ପ୍ଲେବ୍ୟାକ ତ୍ରୁଟିକୁ ପ୍ରତିରୋଧ କରିପାରେ + ଏହି ୱାର୍କଆରାଉଣ୍ଡ ଭିଡିଓ କୋଡେକଗୁଡ଼ିକୁ ରିଲିଜ କରିଥାଏ ଏବଂ ପୁନଃସ୍ଥାପନ କରିଥାଏ ଯେତେବେଳେ ଗୋଟିଏ ପୃଷ୍ଠ ପରିବର୍ତ୍ତନ ହୋଇଥାଏ, ଭୂପୃଷ୍ଠକୁ ସିଧାସଳଖ କୋଡେକରେ ସେଟ କରିବା ପରିବର୍ତ୍ତେ । ଏହି ସମସ୍ୟା ସହିତ କିଛି ଉପକରଣରେ ExoPlayer ଦ୍ୱାରା ପୂର୍ବରୁ ବ୍ୟବହୃତ, ଏହି ସଂରଚନା କେବଳ ଆଣ୍ଡ୍ରଏଡ 6 ଏବଂ ଉଚ୍ଚତର ଉପରେ ପ୍ରଭାବ ପକାଇଥାଏ \n \nଏହି ବିକଳ୍ପକୁ ସକ୍ରିୟ କରିବା ସାମ୍ପ୍ରତିକ ଭିଡିଓ ପ୍ଲେୟାରକୁ ବଦଳାଇବା କିମ୍ବା ସମ୍ପୂର୍ଣ୍ଣ ପରଦାକୁ ପରିବର୍ତ୍ତନ କରିବା ସମୟରେ ପ୍ଲେବ୍ୟାକ ତ୍ରୁଟିକୁ ପ୍ରତିରୋଧ କରିପାରେ କୌଣସି ସ୍ରୋତ ନାହିଁ କୌଣସି ଲାଇଭ ଷ୍ଟ୍ରିମ୍ ନାହିଁ ପ୍ରତିଛବି ଗୁଣବତ୍ତା @@ -793,8 +753,7 @@ ଲାଇଭ୍ URL ତାଲିକା ସହଭାଗ କରନ୍ତୁ ଶୀର୍ଷକଗୁଡ଼ିକ ସହିତ ଅଂଶୀଦାର କରନ୍ତୁ - %1$s -\n%2$s + %1$s \n%2$s ଖେଳ ତାଲିକା ସହଭାଗ କରନ୍ତୁ - %1$s: %2$s ଅଧିକ ଦର୍ଶାନ୍ତୁ @@ -808,12 +767,9 @@ ବ୍ୟାକଅପ୍ ଏବଂ ପୁନରୁଦ୍ଧାର କରନ୍ତୁ ହଁ ନା - NewPipe ସ୍ୱୟଂଚାଳିତ ଭାବରେ ସମୟ ସମୟରେ ନୂତନ ସଂସ୍କରଣଗୁଡିକ ଯାଞ୍ଚ କରିପାରିବ ଏବଂ ଥରେ ଉପଲବ୍ଧ ହେବା ପରେ ଆପଣଙ୍କୁ ସୂଚିତ କରିପାରିବ । -\nଆପଣ ଏହାକୁ ସକ୍ଷମ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? + NewPipe ସ୍ୱୟଂଚାଳିତ ଭାବରେ ସମୟ ସମୟରେ ନୂତନ ସଂସ୍କରଣଗୁଡିକ ଯାଞ୍ଚ କରିପାରିବ ଏବଂ ଥରେ ଉପଲବ୍ଧ ହେବା ପରେ ଆପଣଙ୍କୁ ସୂଚିତ କରିପାରିବ । \nଆପଣ ଏହାକୁ ସକ୍ଷମ କରିବାକୁ ଚାହୁଁଛନ୍ତି କି? ସେଟିଂସମୂହ ପୁନଃସେଟ୍ କରନ୍ତୁ ସମସ୍ତ ସେଟିଂସମୂହକୁ ସେମାନଙ୍କର ଡିଫଲ୍ଟ ମୂଲ୍ୟରେ ପୁନଃସେଟ୍ କରନ୍ତୁ - ସମସ୍ତ ସେଟିଂସମୂହକୁ ପୁନଃ ସେଟ୍ କରିବା ଦ୍ବାରା ଆପଣଙ୍କର ସମସ୍ତ ପସନ୍ଦିତ ସେଟିଂସମୂହ ପରିତ୍ୟାଗ ହେବ ଏବଂ ଆପ୍ ପୁନଃ ସେଟ୍ଆରମ୍ଭ ହେବ । -\n -\nଆପଣ ଆଗକୁ ବଢିବାକୁ ଚାହୁଁଛନ୍ତି କି? + ସମସ୍ତ ସେଟିଂସମୂହକୁ ପୁନଃ ସେଟ୍ କରିବା ଦ୍ବାରା ଆପଣଙ୍କର ସମସ୍ତ ପସନ୍ଦିତ ସେଟିଂସମୂହ ପରିତ୍ୟାଗ ହେବ ଏବଂ ଆପ୍ ପୁନଃ ସେଟ୍ଆରମ୍ଭ ହେବ । \n \nଆପଣ ଆଗକୁ ବଢିବାକୁ ଚାହୁଁଛନ୍ତି କି? ଆମଦାନୀ ହେଉଥିବା ରପ୍ତାନିରେ ଥିବା ସେଟିଂସମୂହ ଏକ ଅସୁରକ୍ଷିତ ଫର୍ମାଟ୍ ବ୍ୟବହାର କରେ ଯାହା NewPipe 0.27.0 ପରଠାରୁ ପୁରୁଣା ହୋଇଯାଇଥିଲା । ନିଶ୍ଚିତ କରନ୍ତୁ ଯେ ଆମଦାନୀ ହେଉଥିବା ରପ୍ତାନି ଏକ ବିଶ୍ୱସ୍ତ ଉତ୍ସରୁ ଆସିଛି ଏବଂ ଭବିଷ୍ୟତରେ କେବଳ NewPipe 0.27.0 କିମ୍ବା ନୂତନରୁ ପ୍ରାପ୍ତ ରପ୍ତାନି ବ୍ୟବହାର କରିବାକୁ ପସନ୍ଦ କରନ୍ତୁ । ଏହି ଅସୁରକ୍ଷିତ ଫର୍ମାଟରେ ସେଟିଂସମୂହ ଆମଦାନି ପାଇଁ ସମର୍ଥନ ଶୀଘ୍ର ସମ୍ପୂର୍ଣ୍ଣ ରୂପେ ଅପସାରିତ ହେବ, ଏବଂ ତା’ପରେ ନୂତନ ପାଇପ୍ ର ପୁରୁଣା ସଂସ୍କରଣଗୁଡ଼ିକ ନୂତନ ସଂସ୍କରଣରୁ ରପ୍ତାନୀର ସେଟିଂସମୂହ ଆମଦାନୀ କରିବାକୁ ସମର୍ଥ ହେବ ନାହିଁ । diff --git a/app/src/main/res/values-pa-rPK/strings.xml b/app/src/main/res/values-pa-rPK/strings.xml index 84e877745..7a70aeb22 100644 --- a/app/src/main/res/values-pa-rPK/strings.xml +++ b/app/src/main/res/values-pa-rPK/strings.xml @@ -124,4 +124,4 @@ فائل موڑو ہمیشہ - \ No newline at end of file + diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index c23a4c223..d1ab67b10 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -13,7 +13,7 @@ ਸਟ੍ਰੀਮ ਫ਼ਾਈਲ ਡਾਊਨਲੋਡ ਕਰੋ ਖੋਜ ਕਰੋ ਸੈਟਿੰਗਾਂ - ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ \"%1$s\"\? + ਕੀ ਤੁਹਾਡਾ ਮਤਲਬ ਸੀ \"%1$s\"? ਦੇ ਨਾਲ ਸਾਂਝਾ ਕਰੋ ਬਾਹਰੀ ਵੀਡੀਓ ਪਲੇਅਰ ਦੀ ਵਰਤੋਂ ਕਰੋ ਕੁਝ ਰੈਜ਼ੋਲਿਊਸ਼ਨਾਂ \'ਤੇ ਆਵਾਜ਼ ਹਟ ਸਕਦੀ ਹੈ @@ -110,10 +110,10 @@ ਇਤਿਹਾਸ, ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ, ਪਲੇਲਿਸਟਾਂ ਅਤੇ ਸੈਟਿੰਗਾਂ ਐਕਸਪੋਰਟ ਕਰੋ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦੀ ਸੂਚੀ ਮਿਟਾਓ ਚਲਾਈਆਂ ਗਈਆਂ ਸਟ੍ਰੀਮਾਂ ਦੇ ਇਤਿਹਾਸ ਅਤੇ ਪਲੇ-ਸਥਿਤੀਆਂ ਨੂੰ ਮਿਟਾਉਂਦਾ ਹੈ - ਕੀ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇ\? + ਕੀ ਵੇਖੇ ਗਏ ਵੀਡੀਓਜ਼ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇ? ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾਓ ਖੋਜ ਸ਼ਬਦਾਂ ਦੀ ਸੂਚੀ ਮਿਟਾਉਂਦਾ ਹੈ - ਕੀ ਸਾਰੀ ਖੋਜ ਸੂਚੀ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇ \? + ਕੀ ਸਾਰੀ ਖੋਜ ਸੂਚੀ ਮਿਟਾ ਦਿੱਤੀ ਜਾਵੇ ? ਖੋਜ ਸੂਚੀ ਦਾ ਇਤਿਹਾਸ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਤਰੁੱਟੀ ਨੈੱਟਵਰਕ ਤਰੁੱਟੀ @@ -213,7 +213,7 @@ ਲਾਇਸੈਂਸ ਪੜ੍ਹੋ ਇਤਿਹਾਸ ਇਤਿਹਾਸ - ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਖੋਜ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਖੋਜ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਆਖਰੀ ਚਲਾਈ ਗਈ ਸਭ ਤੋਂ ਜਿਆਦਾ ਚਲਾਈ ਗਈ ਮੁੱਖ ਪੰਨੇ ਦੀ ਸਮੱਗਰੀ @@ -285,7 +285,7 @@ ਤਾਲ ਪਿੱਚ ਅਲਹਿਦਾ ਕਰੋ (ਵਿਗਾੜ ਪੈ ਸਕਦਾ ਹੈ) - ਕੀ ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੀ ਇੰਪੋਰਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਕੀ ਤੁਸੀਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਵੀ ਇੰਪੋਰਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? ਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਨਿਊਪਾਈਪ ਪ੍ਰੋਜੈਕਟ ਤੁਹਾਡੀ ਗੋਪਨੀਯਤਾ ਨੂੰ ਬਹੁਤ ਗੰਭੀਰਤਾ ਨਾਲ ਲੈਂਦਾ ਹੈ। ਇਸ ਲਈ ਐਪ ਤੁਹਾਡੀ ਸਹਿਮਤੀ ਤੋਂ ਬਿਨਾਂ ਕੋਈ ਵੀ ਡਾਟਾ ਇੱਕਠਾ ਨਹੀਂ ਕਰਦਾ।\nਨਿਊਪਾਈਪ ਦੀ ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਵਿਸਥਾਰ ਵਿੱਚ ਦੱਸਦੀ ਹੈ ਕਿ ਜਦੋਂ ਤੁਸੀਂ ਕਰੈਸ਼ ਰਿਪੋਰਟ ਭੇਜਦੇ ਹੋ ਤਾਂ ਕਿਹੜਾ ਡਾਟਾ ਭੇਜਿਆ ਜਾਂ ਸਟੋਰ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਗੋਪਨੀਯਤਾ ਨੀਤੀ ਪੜ੍ਹੋ @@ -314,10 +314,10 @@ ਐਪ ਅੱਪਡੇਟ ਨੋਟੀਫਿਕੇਸ਼ਨ ਨਵੇਂ ਨਿਊਪਾਈਪ ਸੰਸਕਰਣਾਂ ਲਈ ਪ੍ਰਾਪਤ ਸੂਚਨਾਵਾਂ ਬਾਹਰੀ ਸਟੋਰੇਜ ਉਪਲਬਧ ਨਹੀਂ ਹੈ - ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ। ਕੀ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਦੀ ਸਥਿਤੀ ਨੂੰ ਰੀਸੈਟ ਕੀਤਾ ਜਾਵੇ \? + ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਡਾਊਨਲੋਡ ਕਰਨਾ ਸੰਭਵ ਨਹੀਂ ਹੈ। ਕੀ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਦੀ ਸਥਿਤੀ ਨੂੰ ਰੀਸੈਟ ਕੀਤਾ ਜਾਵੇ ? ਸਾਂਭੀਆਂ ਟੈਬਾਂ ਨਹੀਂ ਪੜ੍ਹ ਹੋਈਆਂ, ਇਸ ਲਈ ਡਿਫਾਲਟ ਟੈਬਾਂ ਦੀ ਵਰਤੋਂ ਹੋ ਰਹੀ ਹੈ ਡੀਫ਼ਾਲਟ ਮੁੜ-ਸਥਾਪਿਤ ਕਰੋ - ਕੀ ਤੁਸੀਂ ਡਿਫਾਲਟ ਮੁੜ-ਸਥਾਪਿਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਕੀ ਤੁਸੀਂ ਡਿਫਾਲਟ ਮੁੜ-ਸਥਾਪਿਤ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? ਸਬਸਕ੍ਰਾਈਬਰਾਂ ਦੀ ਗਿਣਤੀ ਅਣ-ਉਪਲਬਧ ਮੁੱਖ ਪੰਨੇ ਤੇ ਕਿਹੜੇ ਟੈਬ ਵਿਖਾਏ ਜਾਣਗੇ ਅੱਪਡੇਟਾਂ @@ -377,14 +377,13 @@ ਡਿਵਾਈਸ ਤੇ ਕੋਈ ਜਗ੍ਹਾ ਨਹੀਂ ਬਚੀ ਹੈ ਪ੍ਰਗਤੀ ਖਤਮ ਹੋ ਗਈ, ਕਿਉਂਕਿ ਫਾਈਲ ਮਿਟਾਈ ਗਈ ਕੁਨੈਕਸ਼ਨ ਦਾ ਸਮਾਂ ਸਮਾਪਤ - ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ ਜਾਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਕੀ ਤੁਸੀਂ ਆਪਣਾ ਡਾਊਨਲੋਡ ਇਤਿਹਾਸ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ ਜਾਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਸਾਰੀਆਂ ਫ਼ਾਈਲਾਂ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਡਾਊਨਲੋਡ ਕਤਾਰ ਸੀਮਤ ਕਰੋ ਇੱਕ ਹੀ ਸਮੇਂ ਤੇ ਇੱਕੋ ਡਾਊਨਲੋਡ ਚੱਲੇਗਾ ਡਾਊਨਲੋਡ ਸ਼ੁਰੂ ਕਰੋ ਡਾਊਨਲੋਡਸ ਰੋਕੋ ਡਾਊਨਲੋਡ ਕਿੱਥੇ ਕਰਨਾ ਹੈ, ਦੇ ਲਈ ਪੁੱਛੋ - ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ। -\nਜੇ ਤੁਸੀਂ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿਸੇ ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਸਾਂਭਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੋਣਕਾਰ (SAF) ਚਾਲੂ ਕਰੋ + ਤੁਹਾਨੂੰ ਹਰ ਵਾਰ ਪੁੱਛਿਆ ਜਾਵੇਗਾ ਕਿ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿੱਥੇ ਸਾਂਭਣਾ ਹੈ। \nਜੇ ਤੁਸੀਂ ਡਾਊਨਲੋਡ ਨੂੰ ਕਿਸੇ ਬਾਹਰੀ SD ਕਾਰਡ ਤੇ ਸਾਂਭਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੋਣਕਾਰ (SAF) ਚਾਲੂ ਕਰੋ ਸਿਸਟਮ ਡਾਊਨਲੋਡ ਫ਼ੋਲਡਰ ਚੋਣਕਾਰ (SAF) ਦੀ ਵਰਤੋਂ ਕਰੋ \'ਸਟੋਰੇਜ ਐਕਸੈਸ ਫ਼ਰੇਮਵਰਕ\' ਬਾਹਰੀ SD ਕਾਰਡ ਵਿੱਚ ਡਾਊਨਲੋਡ ਕਰਨ ਦਿੰਦਾ ਹੈ ਥੰਮਨੇਲ ਨੂੰ 1:1 ਮਾਪ ਦਾ ਕਰੋ @@ -410,8 +409,7 @@ reCAPTCHA ਦੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਹੋ ਗਈਆਂ ਹਨ reCAPTCHA ਦੀਆਂ ਕੁਕੀਜ਼ ਸਾਫ਼ ਕਰੋ ਵੀਡਿਓ ਹੈਸ਼ਿੰਗ ਦੀ ਕਾਰਵਾਈ ਦੀ ਮੌਜੂਦਾ ਹਾਲਤ ਦੇ ਨੋਟੀਫਿਕੇਸ਼ਨ - ਇਹ ਵੀਡੀਓ ਉਮਰ-ਹੱਦ ਮੁਤਾਬਕ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। -\nਯੂਟਿਊਬ ਦੀਆਂ ਉਮਰ-ਹੱਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਵੀਡੀਓਜ਼ ਬਾਰੇ ਨੀਤੀਆਂ ਦੇ ਕਾਰਨ ਨਿਊ-ਪਾਈਪ ਇਸਦੀਆਂ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਸਕਦੀ ਅਤੇ ਇਸੇ ਕਰਕੇ ਇਸਨੂੰ ਚਲਾ ਵੀ ਨਹੀਂ ਸਕਦੀ। + ਇਹ ਵੀਡੀਓ ਉਮਰ-ਹੱਦ ਮੁਤਾਬਕ ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। \nਯੂਟਿਊਬ ਦੀਆਂ ਉਮਰ-ਹੱਦ ਪਾਬੰਦੀਸ਼ੁਦਾ ਵੀਡੀਓਜ਼ ਬਾਰੇ ਨੀਤੀਆਂ ਦੇ ਕਾਰਨ ਨਿਊ-ਪਾਈਪ ਇਸਦੀਆਂ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਤੱਕ ਨਹੀਂ ਪਹੁੰਚ ਸਕਦੀ ਅਤੇ ਇਸੇ ਕਰਕੇ ਇਸਨੂੰ ਚਲਾ ਵੀ ਨਹੀਂ ਸਕਦੀ। ਨੋਟੀਫਿਕੇਸ਼ਨ ਵਿੱਚ ਵਿਖਾਏ ਵੀਡਿਓ ਥੰਮਨੇਲ ਨੂੰ 16:9 ਦੀ ਬਜਾਏ 1:1 ਅਨੁਪਾਤ ਦਾ ਵਿਖਾਓ ਇਸ ਵਿੱਚ ਖੋਲ੍ਹੋ ਵੈਬਸਾਈਟ ਖੋਲ੍ਹੋ @@ -449,14 +447,10 @@ ਪਲੇਲਿਸਟ ਪੰਨਾ %s ਦੁਆਰਾ %s ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ - ਇਹ ਸਮੱਗਰੀ ਹਾਲੇ ਨਿਊ-ਪਾਈਪ \'ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਦੀ। -\n -\nਉਮੀਦ ਹੈ ਆਉਣ ਵਾਲ਼ੇ ਕਿਸੇ ਵਰਜਨ ਵਿੱਚ ਇਹ ਕੰਮ ਕਰੇਗੀ। + ਇਹ ਸਮੱਗਰੀ ਹਾਲੇ ਨਿਊ-ਪਾਈਪ \'ਤੇ ਕੰਮ ਨਹੀਂ ਕਰਦੀ। \n \nਉਮੀਦ ਹੈ ਆਉਣ ਵਾਲ਼ੇ ਕਿਸੇ ਵਰਜਨ ਵਿੱਚ ਇਹ ਕੰਮ ਕਰੇਗੀ। ਤੇਜ਼ ਮੋਡ ਬੰਦ ਕਰੋ ਤੇਜ਼ ਮੋਡ ਚਾਲੂ ਕਰੋ - ਲੇਖਕ ਦਾ ਖਾਤਾ ਬੰਦ ਹੋ ਚੁੱਕਿਆ ਹੈ। -\nਨਿਊ-ਪਾਈਪ ਭਵਿੱਖ ਵਿੱਚ ਇਸ ਫ਼ੀਡ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕਰ ਸਕੇਗੀ। -\nਕੀ ਤੁਸੀਂ ਇਸ ਚੈਨਲ ਨੂੰ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰਨਾ ਚਾਹੋਗੇ\? + ਲੇਖਕ ਦਾ ਖਾਤਾ ਬੰਦ ਹੋ ਚੁੱਕਿਆ ਹੈ। \nਨਿਊ-ਪਾਈਪ ਭਵਿੱਖ ਵਿੱਚ ਇਸ ਫ਼ੀਡ ਨੂੰ ਲੋਡ ਨਹੀਂ ਕਰ ਸਕੇਗੀ। \nਕੀ ਤੁਸੀਂ ਇਸ ਚੈਨਲ ਨੂੰ ਅਨ-ਸਬਸਕ੍ਰਾਈਬ ਕਰਨਾ ਚਾਹੋਗੇ? \'%s\' ਵਾਸਤੇ ਫ਼ੀਡ ਲੋਡ ਨਹੀਂ ਹੋ ਸਕੀ। ਫ਼ੀਡ ਲੋਡ ਕਰਨ ਵਿੱਚ ਤਰੁੱਟੀ ਰਹੀ ਹਮੇਸ਼ਾਂ ਅੱਪਡੇਟ ਕਰੋ @@ -464,7 +458,7 @@ ਫ਼ੀਡ ਸਿਰਫ਼ ਉਹ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਵਿਖਾਓ ਜੋ ਕਿਸੇ ਗਰੁੱਪ ਵਿੱਚ ਨਹੀਂ ਪਾਈਆਂ ਹੋਈਆਂ ਨਵਾਂ - ਕੀ ਤੁਸੀਂ ਇਸ ਗਰੁੱਪ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਕੀ ਤੁਸੀਂ ਇਸ ਗਰੁੱਪ ਨੂੰ ਮਿਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਗਰੁੱਪ ਦਾ ਨਾਮ ਨਹੀਂ %d ਚੁਣੀ @@ -539,7 +533,7 @@ ਟਿੱਪਣੀਆਂ ਗਿਟਹੱਬ \'ਤੇ ਜਾ ਕੇ ਇਤਲਾਹ ਦਿਓ ਦੂਜੀਆਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਵਿਖਾਉਣ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ - ਕੀ ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਣੀਆਂ ਹਨ\? + ਕੀ ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਣੀਆਂ ਹਨ? ਸਾਰੀਆਂ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਉਂਦਾ ਹੈ ਪਲੇ-ਸਥਿਤੀਆਂ ਮਿਟਾਓ ਵੀਡੀਓ ਹੈਸ਼ ਇਤਲਾਹ @@ -547,9 +541,7 @@ ਕਲਾਕਾਰ ਗੀਤ ਵੀਡੀਓ - ਇਹ ਵੀਡੀਓ ਉਮਰ-ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। -\n -\nਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਵੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ \"%1$s\" ਚਾਲੂ ਕਰੋ। + ਇਹ ਵੀਡੀਓ ਉਮਰ-ਪਾਬੰਦੀਸ਼ੁਦਾ ਹੈ। \n \nਜੇ ਤੁਸੀਂ ਇਸਨੂੰ ਵੇਖਣਾ ਚਾਹੁੰਦੇ ਹੋ ਤਾਂ ਸੈਟਿੰਗਾਂ ਵਿੱਚੋਂ \"%1$s\" ਚਾਲੂ ਕਰੋ। ਯੂਟਿਊਬ \"ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੋਡ\" ਉਪਲਬਧ ਕਰਾਉਂਦਾ ਹੈ ਜੋ ਬਾਲਗਾਂ ਵਾਲ਼ੀ ਸਮੱਗਰੀ ਲੁਕਾਉਂਦਾ ਹੈ ਯੂਟਿਊਬ ਦਾ ਪਾਬੰਦੀਸ਼ੁਦਾ ਮੋਡ ਚਾਲੂ ਕਰੋ ਉਹ ਸਮੱਗਰੀ ਵੀ ਵਿਖਾਓ ਜੋ ਉਮਰ-ਸੀਮਾ ਕਰਕੇ ਬੱਚਿਆਂ ਲਈ ਸ਼ਾਇਦ ਸਹੀ ਨਾ ਹੋਵੇ (ਜਿਵੇਂ 18+) @@ -561,7 +553,7 @@ ਤੁਹਾਡੇ ਪਸੰਦੀਦਾ ਇੰਸਟੈਂਸ %s \'ਤੇ ਲੱਭੋ ਆਪਣੇ ਪਸੰਦੀਦਾ ਪੀਅਰਟਿਊਬ ਇੰਸਟੈਂਸ ਚੁਣੋ ਪੀਅਰਟਿਊਬ ਇੰਸਟੈਂਸ - URL ਪਛਾਣ ਨਹੀਂ ਹੋਇਆ। ਕਿਸੇ ਹੋਰ ਐਪ ਨਾਲ਼ ਖੋਲ੍ਹਣਾ ਹੈ\? + URL ਪਛਾਣ ਨਹੀਂ ਹੋਇਆ। ਕਿਸੇ ਹੋਰ ਐਪ ਨਾਲ਼ ਖੋਲ੍ਹਣਾ ਹੈ? ਆਟੋ ਕਤਾਰਬੱਧ ਕਰੋ ਸਟ੍ਰੀਮ ਨਿਰਮਾਤਾ, ਸਟ੍ਰੀਮ ਸਮੱਗਰੀ ਜਾਂ ਖੋਜ ਬੇਨਤੀ ਦੇ ਬਾਰੇ ਵਿੱਚ ਅਤਿਰਿਕਤ ਜਾਣਕਾਰੀ ਦਿੰਦੇ ਮੈਟਾ ਜਾਣਕਾਰੀ ਬਕਸੇ ਨੂੰ ਲੁਕਾਉਣ ਲਈ ਬੰਦ ਕਰੋ ਮੈਟਾ ਜਾਣਕਾਰੀ ਵਿਖਾਓ @@ -645,7 +637,7 @@ ਕੋਈ ਵੀ ਨੈੱਟਵਰਕ ਅੱਪਡੇਟ ਲਈ ਜਾਂਚ ਕਰੋ ਘੱਟ ਗੁਣਵੱਤਾ (ਛੋਟਾ ਆਕਾਰ) - ਡਿਸਕ ਤੋਂ ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਹਟਾਓ\? + ਡਿਸਕ ਤੋਂ ਸਾਰੀਆਂ ਡਾਊਨਲੋਡ ਕੀਤੀਆਂ ਫਾਈਲਾਂ ਹਟਾਓ? %1$s ਡਾਊਨਲੋਡ ਹਟਾਇਆ %1$s ਡਾਊਨਲੋਡ ਹਟਾਏ @@ -666,22 +658,11 @@ ਨੈੱਟਵਰਕ ਦੀ ਕਿਸਮ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਲਈ ਹੱਥੀਂ ਜਾਂਚ ਕਰੋ ਵਧੀਆ ਗੁਣਵੱਤਾ (ਵੱਡਾ ਆਕਾਰ) - ਇਸ ਕਾਰਜ ਲਈ ਕੋਈ ਢੁਕਵਾਂ ਫਾਈਲ ਮੈਨੇਜਰ ਨਹੀਂ ਮਿਲਿਆ। -\nਕ੍ਰਿਪਾ ਕਰਕੇ ਫਾਈਲ ਮੈਨੇਜਰ ਇੰਨਸਟਾਲ ਕਰੋ ਜਾਂ ਡਾਊਨਲੋਡ ਸੈਟਿੰਗ ਵਿੱਚ \'%s\' ਅਸਮਰੱਥ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ + ਇਸ ਕਾਰਜ ਲਈ ਕੋਈ ਢੁਕਵਾਂ ਫਾਈਲ ਮੈਨੇਜਰ ਨਹੀਂ ਮਿਲਿਆ। \nਕ੍ਰਿਪਾ ਕਰਕੇ ਫਾਈਲ ਮੈਨੇਜਰ ਇੰਨਸਟਾਲ ਕਰੋ ਜਾਂ ਡਾਊਨਲੋਡ ਸੈਟਿੰਗ ਵਿੱਚ \'%s\' ਅਸਮਰੱਥ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰੋ ਤੁਸੀਂ ਇਸ ਚੈਨਲ ਨੂੰ ਸਬਸਕ੍ਰਾਈਬ ਕਰ ਲਿਆ ਹੈ ਕੋਈ ਵੀਡੀਓ ਸਟ੍ਰੀਮ ਬਾਹਰੀ ਪਲੇਅਰਾਂ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ ਐਕਸੋਪਲੇਅਰ ਡਿਫ਼ਾਲਟ - ਕੀ ਤੁਹਾਨੂੰ ਲੱਗਦਾ ਹੈ ਫੀਡ ਹੌਲੀ ਲੋਡ ਹੋ ਰਹੀ ਹੈ\? ਅਜਿਹਾ ਹੈ ਤਾਂ ਤੇਜ਼ ਫੀਡ ਕ੍ਰਿਆਸ਼ੀਲ ਕਰਕੇ ਵੇਖੋ (ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਜਾਂ ਹੇਠਲਾ ਬਟਨ ਦੱਬ ਕੇ ਕਰ ਸਕਦੇ ਹੋ ) -\n -\nਨਿਊਪਾਈਪ ਫੀਡ ਲੋਡ ਕਰਨ ਲਈ ਦੋ ਤਰਾਂ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦੀ ਹੈ: -\n• ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੈਨਲ ਤੋਂ ਪੂਰੀ ਜਾਣਕਾਰੀ ਲੈਂਦੀ ਹੈ ਜੋ ਹੌਲ੍ਹੀ ਮਿਲਦੀ ਹੈ। -\n• ਸਮਰਪਿਤ ਸੇਵਾ ਅੰਤਮ ਬਿੰਦੂ ਤੋਂ, ਜੋ ਕਿ ਤੇਜ਼ ਮਿਲਦੀ ਹੈ ਪਰ ਆਮਤੌਰ ਤੇ ਅਧੂਰੀ/ਅਣਸਟੀਕ ਹੁੰਦੀ ਹੈ। -\n -\nਇਨਾਂ ਦੋਹਾਂ ਵਿੱਚ ਫਰਕ ਇਹ ਹੁੰਦਾ ਹੈ ਕਿ ਤੇਜ਼ ਤਰੀਕਾ ਆਮ ਤੌਰ ਤੇ ਕੁਝ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦੇ ਪਾਉਂਦਾ ਜਿਵੇਂ ਕਿ ਨਗਾਂ ਦੀ ਅਵਧੀ ਜਾਂ ਕਿਸਮ(ਕਿ ਵੀਡੀਓ ਲਾਈਵ ਹਨ ਜਾਂ ਆਮ) ਤੇ ਘੱਟ ਨਗ ਦਿਖ ਸਕਦੇ ਹਨ। -\n -\nਯੂਟਿਊਬ ਇੱਕ ਅਜਿਹੀ ਸੇਵਾ ਹੈ ਜਿਹੜੀ RSS ਫੀਡ ਜ਼ਰੀਏ ਇਹ ਤੇਜ਼ ਤਰੀਕਾ ਪ੍ਰਦਾਨ ਕਰਦੀ ਹੈ। -\n -\nਤੁਹਾਡੀ ਚੋਣ ਇਸ ਗੱਲ ਤੇ ਮੁਨੱਸਰ ਕਰਦੀ ਹੈ ਕਿ ਤੁਸੀਂ ਗਤੀ ਤੇ ਸਟੀਕਤਾ ਵਿੱਚੋਂ ਕਿਸ ਨੂੰ ਪ੍ਰਾਥਮਿਕਤਾ ਦਿੰਦੇ ਹੋ। + ਕੀ ਤੁਹਾਨੂੰ ਲੱਗਦਾ ਹੈ ਫੀਡ ਹੌਲੀ ਲੋਡ ਹੋ ਰਹੀ ਹੈ? ਅਜਿਹਾ ਹੈ ਤਾਂ ਤੇਜ਼ ਫੀਡ ਕ੍ਰਿਆਸ਼ੀਲ ਕਰਕੇ ਵੇਖੋ (ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਜਾਂ ਹੇਠਲਾ ਬਟਨ ਦੱਬ ਕੇ ਕਰ ਸਕਦੇ ਹੋ ) \n \nਨਿਊਪਾਈਪ ਫੀਡ ਲੋਡ ਕਰਨ ਲਈ ਦੋ ਤਰਾਂ ਦੀਆਂ ਵਿਧੀਆਂ ਦੀ ਪੇਸ਼ਕਸ਼ ਕਰਦੀ ਹੈ: \n• ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਚੈਨਲ ਤੋਂ ਪੂਰੀ ਜਾਣਕਾਰੀ ਲੈਂਦੀ ਹੈ ਜੋ ਹੌਲ੍ਹੀ ਮਿਲਦੀ ਹੈ। \n• ਸਮਰਪਿਤ ਸੇਵਾ ਅੰਤਮ ਬਿੰਦੂ ਤੋਂ, ਜੋ ਕਿ ਤੇਜ਼ ਮਿਲਦੀ ਹੈ ਪਰ ਆਮਤੌਰ ਤੇ ਅਧੂਰੀ/ਅਣਸਟੀਕ ਹੁੰਦੀ ਹੈ। \n \nਇਨਾਂ ਦੋਹਾਂ ਵਿੱਚ ਫਰਕ ਇਹ ਹੁੰਦਾ ਹੈ ਕਿ ਤੇਜ਼ ਤਰੀਕਾ ਆਮ ਤੌਰ ਤੇ ਕੁਝ ਜਾਣਕਾਰੀ ਨਹੀਂ ਦੇ ਪਾਉਂਦਾ ਜਿਵੇਂ ਕਿ ਨਗਾਂ ਦੀ ਅਵਧੀ ਜਾਂ ਕਿਸਮ(ਕਿ ਵੀਡੀਓ ਲਾਈਵ ਹਨ ਜਾਂ ਆਮ) ਤੇ ਘੱਟ ਨਗ ਦਿਖ ਸਕਦੇ ਹਨ। \n \nਯੂਟਿਊਬ ਇੱਕ ਅਜਿਹੀ ਸੇਵਾ ਹੈ ਜਿਹੜੀ RSS ਫੀਡ ਜ਼ਰੀਏ ਇਹ ਤੇਜ਼ ਤਰੀਕਾ ਪ੍ਰਦਾਨ ਕਰਦੀ ਹੈ। \n \nਤੁਹਾਡੀ ਚੋਣ ਇਸ ਗੱਲ ਤੇ ਮੁਨੱਸਰ ਕਰਦੀ ਹੈ ਕਿ ਤੁਸੀਂ ਗਤੀ ਤੇ ਸਟੀਕਤਾ ਵਿੱਚੋਂ ਕਿਸ ਨੂੰ ਪ੍ਰਾਥਮਿਕਤਾ ਦਿੰਦੇ ਹੋ। ਤੇਜ ਮੋਡ 3-ਡੌਟ ਮੀਨੂ ਤੋਂ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਨੂੰ ਇੰਪੋਰਟ ਜਾਂ ਐਕਸਪੋਰਟ ਕਰੋ ਤੁਸੀਂ ਨਿਊਪਾਈਪ ਦਾ ਨਵੀਨਤਮ ਸੰਸਕਰਣ ਚਲਾ ਰਹੇ ਹੋ @@ -694,8 +675,8 @@ ਡੁਪਲੀਕੇਟ ਜੋੜ੍ਹਿਆ ਗਿਆ %d ਵਾਰ ਉਪਯੋਗੀ ਹੈ, ਉਦਾਹਰਨ ਲਈ, ਜੇਕਰ ਤੁਸੀਂ ਟੁੱਟੇ ਭੌਤਿਕ ਬਟਨਾਂ ਵਾਲਾ ਹੈੱਡਸੈੱਟ ਵਰਤ ਰਹੇ ਹੋ ਡੁਪਲੀਕੇਟ ਹਟਾਓ - ਡੁਪਲੀਕੇਟ ਹਟਾਉਣੇ ਹਨ\? - ਕੀ ਤੁਸੀਂ ਇਸ ਪਲੇਲਿਸਟ ਵਿੱਚ ਸਾਰੀਆਂ ਡੁਪਲੀਕੇਟ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ\? + ਡੁਪਲੀਕੇਟ ਹਟਾਉਣੇ ਹਨ? + ਕੀ ਤੁਸੀਂ ਇਸ ਪਲੇਲਿਸਟ ਵਿੱਚ ਸਾਰੀਆਂ ਡੁਪਲੀਕੇਟ ਸਟ੍ਰੀਮਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਨਿਮਨਲਿਖਤ ਸਟ੍ਰੀਮਾਂ ਵਿਖਾਓ ਪੂਰੀ ਵੇਖਿਆ ਅੰਸ਼ਕ ਤੌਰ \'ਤੇ ਵੇਖਿਆ ਗਿਆ @@ -710,9 +691,7 @@ ਪਲੇਅਰ ਸਕ੍ਰੀਨ ਦੇ ਸੱਜੇ ਅੱਧ ਲਈ ਸੰਕੇਤ ਚੁਣੋ ਆਵਾਜ਼ ਇਹ ਆਪਸ਼ਨ ਨੂੰ ਇਨੇਬਲ ਕਰੋ ਜੇ ਤੁਹਾਨੂੰ ਡੀਕੋਡਰ ਸ਼ੁਰੂ ਕਰਨ ਦੀਆਂ ਸਮੱਸਿਆਵਾਂ ਹਨ, ਜੋ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰਾਂ ਦੀ ਸ਼ੁਰੂਆਤ ਅਸਫਲ ਹੋਣ ਤੇ ਹੇਠਲੇ-ਪ੍ਰਾਥਮਿਕਤਾ ਡੀਕੋਡਰਾਂ \'ਤੇ ਵਾਪਸ ਲੈ ਜਾਂਦੀ ਹੈ। ਇਸ ਨਾਲ ਪ੍ਰਾਇਮਰੀ ਡੀਕੋਡਰਾਂ ਦੀ ਤੁਲਨਾ ਮਾੜੀ ਪਲੇਅਬੈਕ ਕਾਰਗੁਜ਼ਾਰੀ ਹੋ ਸਕਦੀ ਹੈ - ਇਹ ਵਰਕਅਰਾਊਂਡ ਸਤਹ ਨੂੰ ਸਿੱਧਾ ਕੋਡੇਕ ਤੇ ਸੈੱਟ ਕਰਨ ਦੀ ਬਜਾਏ, ਸਤਹ ਵਿੱਚ ਤਬਦੀਲੀ ਹੋਣ ਤੇ ਵੀਡੀਓ ਕੋਡੈਕਸ ਨੂੰ ਜਾਰੀ ਅਤੇ ਮੁੜ-ਬਹਾਲ ਕਰਦਾ ਹੈ। ਇਸ ਸਮੱਸਿਆ ਵਾਲੇ ਕੁਝ ਡਿਵਾਈਸਾਂ \'ਤੇ ਐਕਸੋਪਲੇਅਰ ਦੁਆਰਾ ਇਹ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਿਰਫ਼ ਐਂਡਰੌਇਡ 6 ਅਤੇ ਉਸ ਤੋਂ ਵੱਧ \'ਤੇ ਪ੍ਰਭਾਵ ਹੈ -\n -\nਇਸ ਵਿਕਲਪ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਨਾਲ ਮੌਜੂਦਾ ਵੀਡੀਓ ਪਲੇਅਰ ਨੂੰ ਸਵਿੱਚ ਕਰਨ ਜਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਸਵਿੱਚ ਕਰਨ ਵੇਲੇ ਪਲੇਅਬੈਕ ਤਰੁੱਟੀਆਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ + ਇਹ ਵਰਕਅਰਾਊਂਡ ਸਤਹ ਨੂੰ ਸਿੱਧਾ ਕੋਡੇਕ ਤੇ ਸੈੱਟ ਕਰਨ ਦੀ ਬਜਾਏ, ਸਤਹ ਵਿੱਚ ਤਬਦੀਲੀ ਹੋਣ ਤੇ ਵੀਡੀਓ ਕੋਡੈਕਸ ਨੂੰ ਜਾਰੀ ਅਤੇ ਮੁੜ-ਬਹਾਲ ਕਰਦਾ ਹੈ। ਇਸ ਸਮੱਸਿਆ ਵਾਲੇ ਕੁਝ ਡਿਵਾਈਸਾਂ \'ਤੇ ਐਕਸੋਪਲੇਅਰ ਦੁਆਰਾ ਇਹ ਪਹਿਲਾਂ ਹੀ ਵਰਤਿਆ ਜਾ ਰਿਹਾ ਹੈ, ਇਸ ਸੈਟਿੰਗ ਦਾ ਸਿਰਫ਼ ਐਂਡਰੌਇਡ 6 ਅਤੇ ਉਸ ਤੋਂ ਵੱਧ \'ਤੇ ਪ੍ਰਭਾਵ ਹੈ \n \nਇਸ ਵਿਕਲਪ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਨਾਲ ਮੌਜੂਦਾ ਵੀਡੀਓ ਪਲੇਅਰ ਨੂੰ ਸਵਿੱਚ ਕਰਨ ਜਾਂ ਪੂਰੀ ਸਕ੍ਰੀਨ \'ਤੇ ਸਵਿੱਚ ਕਰਨ ਵੇਲੇ ਪਲੇਅਬੈਕ ਤਰੁੱਟੀਆਂ ਨੂੰ ਹੱਲ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਮੂਲ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ ਭਾਸ਼ਾ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ ਮੂਲ ਆਡੀਓ ਟਰੈਕ ਚੁਣੋ ਵਰਣਨਾਤਮਕ ਆਡੀਓ ਨੂੰ ਤਰਜੀਹ ਦਿਓ @@ -774,8 +753,7 @@ ਥੰਮਨੇਲ URL ਸੂਚੀ ਸਾਂਝੀ ਕਰੋ ਸਿਰਲੇਖਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ - %1$s -\n%2$s + %1$s \n%2$s ਪਲੇਲਿਸਟ ਸਾਂਝੀ ਕਰੋ - %1$s: %2$s @@ -786,14 +764,11 @@ ਇਸ \'ਤੇ ਟੈਪ ਕਰਕੇ ਹੇਠਾਂ ਹਰੇਕ ਸੂਚਨਾ ਕਾਰਵਾਈ ਨੂੰ ਸੰਪਾਦਿਤ ਕਰੋ। ਪਹਿਲੀਆਂ ਤਿੰਨ ਕਾਰਵਾਈਆਂ (ਚਲਾਓ/ਰੋਕੋ, ਪਿਛਲਾ ਅਤੇ ਅਗਲਾ) ਸਿਸਟਮ ਦੁਆਰਾ ਸੈੱਟ ਕੀਤੀਆਂ ਗਈਆਂ ਹਨ ਅਤੇ ਉਹਨਾਂ ਨੂੰ ਅਨੁਕੂਲਿਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। ਘੱਟ ਵਿਖਾਓ ਹਾਂ - ਨਿਊਪਾਈਪ ਸਮੇਂ-ਸਮੇਂ \'ਤੇ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਦੀ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਜਾਂਚ ਕਰ ਸਕਦੀ ਹੈ ਅਤੇ ਇੱਕ ਵਾਰ ਉਪਲਬਧ ਹੋਣ \'ਤੇ ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕਰ ਸਕਦੀ ਹੈ। -\nਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਇਨੇਬਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? + ਨਿਊਪਾਈਪ ਸਮੇਂ-ਸਮੇਂ \'ਤੇ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਦੀ ਸਵੈਚਲਿਤ ਤੌਰ \'ਤੇ ਜਾਂਚ ਕਰ ਸਕਦੀ ਹੈ ਅਤੇ ਇੱਕ ਵਾਰ ਉਪਲਬਧ ਹੋਣ \'ਤੇ ਤੁਹਾਨੂੰ ਸੂਚਿਤ ਕਰ ਸਕਦੀ ਹੈ। \nਕੀ ਤੁਸੀਂ ਇਸਨੂੰ ਇਨੇਬਲ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? ਬੈਕਅੱਪ ਅਤੇ ਰੀਸਟੋਰ ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈਟ ਕਰੋ ਸਾਰੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਉਹਨਾਂ ਦੇ ਡਿਫ਼ਾਲਟ ਮੁੱਲਾਂ \'ਤੇ ਰੀਸੈਟ ਕਰੋ - ਸਾਰੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਨਾਲ ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਤਰਜੀਹੀ ਸੈਟਿੰਗਾਂ ਰੱਦ ਹੋ ਜਾਣਗੀਆਂ ਅਤੇ ਐਪ ਰੀਸਟਾਰਟ ਹੋ ਜਾਵੇਗਾ। -\n -\nਕੀ ਤੁਸੀਂ ਯਕੀਨੀ ਤੌਰ \'ਤੇ ਅੱਗੇ ਵਧਣਾ ਚਾਹੁੰਦੇ ਹੋ? + ਸਾਰੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਨਾਲ ਤੁਹਾਡੀਆਂ ਸਾਰੀਆਂ ਤਰਜੀਹੀ ਸੈਟਿੰਗਾਂ ਰੱਦ ਹੋ ਜਾਣਗੀਆਂ ਅਤੇ ਐਪ ਰੀਸਟਾਰਟ ਹੋ ਜਾਵੇਗਾ। \n \nਕੀ ਤੁਸੀਂ ਯਕੀਨੀ ਤੌਰ \'ਤੇ ਅੱਗੇ ਵਧਣਾ ਚਾਹੁੰਦੇ ਹੋ? ਡਿਵਾਈਸ \'ਤੇ ਲੋੜੀਂਦੀ ਖਾਲੀ ਥਾਂ ਨਹੀਂ ਹੈ ਨਹੀਂ ਇੰਪੋਰਟ ਕੀਤੇ ਜਾ ਰਹੇ ਐਕਸਪੋਰਟ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਇੱਕ ਕਮਜ਼ੋਰ ਫਾਰਮੈਟ ਦੀ ਵਰਤੋਂ ਕਰਦੀਆਂ ਹਨ ਜੋ ਨਿਊਪਾਈਪ 0.27.0 ਤੋਂ ਬਰਤਰਫ਼ ਕੀਤਾ ਗਿਆ ਸੀ। ਯਕੀਨੀ ਬਣਾਓ ਕਿ ਇੰਪੋਰਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਨਿਰਯਾਤ ਇੱਕ ਭਰੋਸੇਯੋਗ ਸਰੋਤ ਤੋਂ ਹੈ, ਅਤੇ ਸਿਰਫ਼ ਨਿਊਪਾਈਪ 0.27.0 ਜਾਂ ਇਸਤੋਂ ਨਵੇਂ ਤੋਂ ਪ੍ਰਾਪਤ ਕੀਤੇ ਐਕਸਪੋਰਟ ਦੀ ਵਰਤੋਂ ਕਰਨ ਨੂੰ ਤਰਜੀਹ ਦਿਓ। ਇਸ ਕਮਜ਼ੋਰ ਫਾਰਮੈਟ ਵਿੱਚ ਸੈਟਿੰਗਾਂ ਨੂੰ ਆਯਾਤ ਕਰਨ ਲਈ ਸਮਰਥਨ ਜਲਦੀ ਹੀ ਪੂਰੀ ਤਰ੍ਹਾਂ ਹਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ ਅਤੇ ਫਿਰ ਨਿਊਪਾਈਪ ਦੇ ਪੁਰਾਣੇ ਸੰਸਕਰਣ ਹੁਣ ਨਵੇਂ ਸੰਸਕਰਣਾਂ ਤੋਂ ਐਕਸਪੋਰਟ ਦੀਆਂ ਸੈਟਿੰਗਾਂ ਨੂੰ ਇੰਪੋਰਟ ਕਰਨ ਦੇ ਯੋਗ ਨਹੀਂ ਹੋਣਗੇ। diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 2e71adc50..0f3d4be14 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -8,21 +8,21 @@ Pobierz Szukaj Ustawienia - Czy chodziło Ci o „%1$s”\? + Czy chodziło Ci o „%1$s”? Udostępnij Używaj zewnętrznego odtwarzacza wideo Używaj zewnętrznego odtwarzacza audio Opublikowano %1$s - Nie znaleziono odtwarzacza strumieni. Zainstalować VLC\? - Folder zapisywania wideo + Nie znaleziono odtwarzacza strumieni. Zainstalować VLC? + Folder pobierania wideo Pobrane pliki wideo są przechowywane tutaj Wybierz folder zapisywania plików wideo - Folder zapisywania audio + Folder pobierania audio Pobrane pliki audio są przechowywane tutaj Wybierz folder zapisywania plików audio Domyślna rozdzielczość Odtwórz w Kodi - Czy zainstalować brakującą aplikację Kore\? + Czy zainstalować brakującą aplikację Kore? Pokazuj opcję „Odtwórz z Kodi” Wyświetlaj opcję odtwarzania wideo przez centrum multimedialne Kodi Dźwięk @@ -96,8 +96,7 @@ Wszystkie Wyłączone Wyczyść - To pozwolenie jest wymagane, aby -\notworzyć w trybie okienkowym + To pozwolenie jest wymagane, aby \notworzyć w trybie okienkowym Otwórz w trybie okienkowym Tryb okienkowy Najlepsza rozdzielczość @@ -213,7 +212,7 @@ Importuj dane Eksportuj dane Zastępuje bieżącą historię, subskrypcje, playlisty i (opcjonalnie) ustawienia - Eksportuje bieżącą historię, subskrypcje, playlisty i ustawienia + Eksportuje bieżącą historię, subskrypcje, playlisty i ustawienia Przeciągnij, aby zmienić kolejność Utwórz Odrzuć @@ -236,7 +235,7 @@ Ustaw jako miniaturę playlisty Dodaj do ulubionych Usuń z ulubionych - Czy usunąć tę playlistę\? + Czy usunąć tę playlistę? Playlista utworzona Dodano do playlisty Miniatura playlisty zmieniona @@ -271,29 +270,14 @@ Poprzedni eksport Nie udało się zaimportować subskrypcji Nie udało się wyeksportować subskrypcji - Zaimportuj subskrypcje YouTube z Google Takeout: -\n -\n1. Przejdź do tego adresu URL: %1$s. -\n2. Zaloguj się, gdy zostaniesz o to poproszony(-a). -\n3. Naciśnij „Wybrano wszystkie dane z YouTube”, następnie „Odznacz wszystkie”, potem zaznacz tylko „subskrypcje” i naciśnij „OK”. -\n4. Naciśnij „Następny krok”, a następnie „Utwórz eksport”. -\n5. Naciśnij przycisk „Pobierz”, gdy się pojawi. -\n6. Naciśnij IMPORTUJ PLIK poniżej i wybierz pobrany plik ZIP. -\n7. [Jeśli importowanie pliku ZIP nie powiedzie się] Wypakuj plik subskrypcje.csv (powinien znajdować się w katalogu „YouTube i YouTube Music/subskrypcje.csv”), naciśnij IMPORTUJ PLIK poniżej i wybierz wypakowany plik CSV. - Ta operacja może wygenerować duże użycie danych. -\n -\nCzy chcesz kontynuować? + Zaimportuj subskrypcje YouTube z Google Takeout: \n \n1. Przejdź do tego adresu URL: %1$s. \n2. Zaloguj się, gdy zostaniesz o to poproszony(-a). \n3. Naciśnij „Wybrano wszystkie dane z YouTube”, następnie „Odznacz wszystkie”, potem zaznacz tylko „subskrypcje” i naciśnij „OK”. \n4. Naciśnij „Następny krok”, a następnie „Utwórz eksport”. \n5. Naciśnij przycisk „Pobierz”, gdy się pojawi. \n6. Naciśnij IMPORTUJ PLIK poniżej i wybierz pobrany plik ZIP. \n7. [Jeśli importowanie pliku ZIP nie powiedzie się] Wypakuj plik subskrypcje.csv (powinien znajdować się w katalogu „YouTube i YouTube Music/subskrypcje.csv”), naciśnij IMPORTUJ PLIK poniżej i wybierz wypakowany plik CSV. + Ta operacja może wygenerować duże użycie danych. \n \nCzy chcesz kontynuować? Sterowanie prędkością odtwarzania Tempo Wysokość dźwięku twojeID, soundcloud.com/yourid Rozłącz (może powodować zniekształcenia) - Zaimportuj profil SoundCloud, wpisując adres URL lub swój identyfikator: -\n -\n1. Włącz opcję „Wersja na komputery” w przeglądarce internetowej (strona nie jest dostępna dla urządzeń mobilnych). -\n2. Przejdź do tego adresu URL: %1$s. -\n3. Zaloguj się, gdy zostaniesz o to poproszony(-a). -\n4. Skopiuj adres URL profilu, na który zostałeś(-aś) przekierowany(-a). + Zaimportuj profil SoundCloud, wpisując adres URL lub swój identyfikator: \n \n1. Włącz opcję „Wersja na komputery” w przeglądarce internetowej (strona nie jest dostępna dla urządzeń mobilnych). \n2. Przejdź do tego adresu URL: %1$s. \n3. Zaloguj się, gdy zostaniesz o to poproszony(-a). \n4. Skopiuj adres URL profilu, na który zostałeś(-aś) przekierowany(-a). Brak strumieni do pobrania Preferowana akcja „otwórz” Domyślna akcja podczas otwierania treści — %s @@ -301,11 +285,11 @@ Zmodyfikuj rozmiar tekstu napisów odtwarzacza i style tła. Wymaga ponownego uruchomienia aplikacji, aby zmiany zostały uwzględnione Wyczyść historię oglądania Usuwa historię odtworzonych strumieni i pozycje odtwarzania - Usunąć całą historię oglądania\? + Usunąć całą historię oglądania? Usunięto historię oglądania Wyczyść historię wyszukiwania Usuwa historię wyszukiwania słów kluczowych - Usunąć całą historię wyszukiwania\? + Usunąć całą historię wyszukiwania? Usunięto historię wyszukiwania Usunięto jedną pozycję NewPipe jest wolnym i bezpłatnym oprogramowaniem: Możesz używać, udostępniać i ulepszać je do woli. W szczególności możesz je redystrybuować i/lub modyfikować zgodnie z warunkami GNU General Public License, opublikowanej przez Free Software Fundation, w wersji 3 albo (według Twojego wyboru) jakiejkolwiek późniejszej wersji. @@ -313,8 +297,7 @@ Polityka prywatności NewPipe Projekt NewPipe bardzo poważnie traktuje Twoją prywatność, dlatego aplikacja nie gromadzi żadnych danych bez Twojej zgody. \nPolityka prywatności NewPipe szczegółowo wyjaśnia, jakie dane są zbierane i przesyłane, gdy wysyłasz raport o awarii aplikacji. Przeczytaj politykę prywatności - Ze względu na wprowadzenie Ogólnego rozporządzenia o ochronie danych (RODO) chcielibyśmy zwrócić Twoją uwagę na politykę prywatności NewPipe. Prosimy przeczytać ją uważnie. -\nMusisz ją zaakceptować, aby przesyłać nam raporty o błędach. + Ze względu na wprowadzenie Ogólnego rozporządzenia o ochronie danych (RODO) chcielibyśmy zwrócić Twoją uwagę na politykę prywatności NewPipe. Prosimy przeczytać ją uważnie. \nMusisz ją zaakceptować, aby przesyłać nam raporty o błędach. Akceptuj Odrzuć Bez limitu @@ -338,10 +321,10 @@ Powiadomienie o aktualizacji aplikacji Powiadomienia o nowych wersjach NewPipe Pamięć zewnętrzna niedostępna - Pobieranie na kartę pamięci nie jest możliwe. Zresetować lokalizację folderu zapisywania\? + Pobieranie na kartę pamięci nie jest możliwe. Zresetować lokalizację folderu zapisywania? Nie udało się odczytać zapisanych kart, więc będą używane domyślne Przywróć domyślne - Czy chcesz przywrócić ustawienia domyślne\? + Czy chcesz przywrócić ustawienia domyślne? Liczba subskrybentów niedostępna Karty wyświetlane na stronie głównej Aktualizacje @@ -399,20 +382,19 @@ NewPipe został zamknięty podczas pracy nad plikiem Brak miejsca na urządzeniu Utracono postęp, ponieważ plik został usunięty - Czy chcesz wyczyścić historię pobierania, czy usunąć wszystkie pobrane pliki\? + Czy chcesz wyczyścić historię pobierania, czy usunąć wszystkie pobrane pliki? Ogranicz kolejkę pobierania Tylko jedno pobieranie zostanie uruchomione w tym samym czasie Rozpocznij pobieranie Wstrzymaj pobieranie Pytaj, gdzie pobrać - Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik. -\nWłącz systemowy selektor folderów (SAF), jeśli chcesz pobierać pliki na kartę pamięci + Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik. \nWłącz systemowy selektor folderów (SAF), jeśli chcesz pobierać pliki na kartę pamięci Minął czas połączenia Używaj systemowego selektora folderów (SAF) Storage Access Framework umożliwia pobieranie na kartę pamięci Wyczyść pozycje odtwarzania Usuwa wszystkie pozycje odtwarzania - Usunąć wszystkie pozycje odtwarzania\? + Usunąć wszystkie pozycje odtwarzania? Przełącz usługę, aktualnie wybrana: Domyślna karta „Odkrywaj” Nikt nie ogląda @@ -427,6 +409,7 @@ %s słuchacz %s słuchaczy %s słuchaczy + %s słuchaczy Wielkość skoku przy przewijaniu Serwery PeerTube @@ -456,21 +439,12 @@ %d sekunda %d sekundy %d sekund + %d sekund Wielkość skoku przewijania została ustawiona na %d sekund ze względu na ograniczenia odtwarzacza ExoPlayer Wycisz Wyłącz wyciszenie - Czy uważasz, że ładowanie kanałów jest zbyt powolne\? Jeśli tak, spróbuj włączyć szybkie ładowanie (możesz je zmienić w ustawieniach lub naciskając przycisk poniżej). -\n -\nNewPipe oferuje dwie strategie ładowania kanału: -\n• Pobieranie całego kanału subskrypcji, co jest powolne, ale kompletne. -\n• Korzystanie z dedykowanego punktu końcowego usługi, co jest szybkie, ale zwykle nie jest kompletne. -\n -\nRóżnica między nimi polega na tym, że w szybkim zwykle brakuje pewnych informacji, takich jak czas trwania lub typ pozycji (nie można odróżnić wideo na żywo od zwykłych), i może zwrócić mniej pozycji. -\n -\nYouTube jest przykładem usługi, która oferuje tę szybką metodę z kanałem RSS. -\n -\nTak więc wybór sprowadza się do tego, co wolisz: szybkość czy precyzyjne informacje. + Czy uważasz, że ładowanie kanałów jest zbyt powolne? Jeśli tak, spróbuj włączyć szybkie ładowanie (możesz je zmienić w ustawieniach lub naciskając przycisk poniżej). \n \nNewPipe oferuje dwie strategie ładowania kanału: \n• Pobieranie całego kanału subskrypcji, co jest powolne, ale kompletne. \n• Korzystanie z dedykowanego punktu końcowego usługi, co jest szybkie, ale zwykle nie jest kompletne. \n \nRóżnica między nimi polega na tym, że w szybkim zwykle brakuje pewnych informacji, takich jak czas trwania lub typ pozycji (nie można odróżnić wideo na żywo od zwykłych), i może zwrócić mniej pozycji. \n \nYouTube jest przykładem usługi, która oferuje tę szybką metodę z kanałem RSS. \n \nTak więc wybór sprowadza się do tego, co wolisz: szybkość czy precyzyjne informacje. Wyłącz tryb szybki Włącz tryb szybki Dostępne w niektórych usługach. Jest zwykle znacznie szybsze, ale może zwrócić ograniczoną liczbę pozycji i często niekompletne informacje (np. brak czasu trwania, typu pozycji, statusu na żywo) @@ -480,7 +454,7 @@ Próg aktualizacji kanału Kanał Nowa - Czy chcesz usunąć tę grupę\? + Czy chcesz usunąć tę grupę? Pusta nazwa grupy %d wybrana @@ -499,28 +473,27 @@ %d dzień %d dni %d dni + %d dni %d godzina %d godziny %d godzin + %d godzin %d minuta %d minuty %d minut + %d minut - Ta treść nie jest jeszcze obsługiwana przez NewPipe. -\n -\nMiejmy nadzieję, że będzie obsługiwana w przyszłej wersji. + Ta treść nie jest jeszcze obsługiwana przez NewPipe. \n \nMiejmy nadzieję, że będzie obsługiwana w przyszłej wersji. ∞ wideo 100+ wideo Artyści Albumy Utwory - To wideo jest objęte ograniczeniem wiekowym. -\n -\nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć. + To wideo jest objęte ograniczeniem wiekowym. \n \nWłącz „%1$s” w ustawieniach, jeśli chcesz je zobaczyć. Usuń częściowo obejrzane strumienie Strumienie, które zostały obejrzane przed i po dodaniu do playlisty, zostaną usunięte. \nCzy na pewno? Czy usunąć obejrzane strumienie? @@ -543,7 +516,7 @@ Tylko przez Wi-Fi Rozpoczynaj odtwarzanie automatycznie — %s Kolejka odtwarzania - Nie udało się rozpoznać adresu URL. Otworzyć za pomocą innej aplikacji\? + Nie udało się rozpoznać adresu URL. Otworzyć za pomocą innej aplikacji? Automatyczna kolejka Kolejka aktywnego odtwarzacza zostanie zastąpiona Przejście z jednego odtwarzacza na inny może zastąpić kolejkę @@ -585,15 +558,14 @@ Wyłącz, aby ukryć opis wideo i dodatkowe informacje Pokazuj opis Otwórz za pomocą - Żadna aplikacja na Twoim urządzeniu nie może tego otworzyć + Na twoim urządzeniu nie ma aplikacji, która mogłaby to otworzyć Powiązane pozycje Zepsuj aplikację Ta treść dostępna jest tylko dla użytkowników, którzy za nią zapłacili. Nie może być strumieniowana ani pobierana przez NewPipe. To wideo dostępne jest tylko dla subskrybentów usługi YouTube Music Premium. Nie może być strumieniowane ani pobierane przez NewPipe. Ta treść jest prywatna, więc nie może być strumieniowana ani pobierana przez NewPipe. Ta treść nie jest dostępna w Twoim kraju. - To wideo jest objęte ograniczeniem wiekowym. -\nZe względu na nowe zasady YouTube dotyczące wideo z ograniczeniami wiekowymi NewPipe nie może uzyskać dostępu do żadnego z jego strumieni wideo i dlatego nie jest w stanie go odtworzyć. + To wideo jest objęte ograniczeniem wiekowym. \nZe względu na nowe zasady YouTube dotyczące wideo z ograniczeniami wiekowymi NewPipe nie może uzyskać dostępu do żadnego z jego strumieni wideo i dlatego nie jest w stanie go odtworzyć. To jest utwór SoundCloud Go+ (przynajmniej w Twoim kraju). Nie może być strumieniowany ani pobierany przez NewPipe. Radio Polecane @@ -623,9 +595,7 @@ Teraz możesz zaznaczyć tekst wewnątrz opisu. Pamiętaj, że w trybie zaznaczania strona może migotać i linki nie będą klikalne. Konto zamknięte. Tryb szybki dla ładowania kanału nie dostarcza więcej informacji na ten temat. - Konto autora zostało zawieszone. -\nNewPipe nie będzie w stanie załadować tego kanału w przyszłości. -\nCzy chcesz anulować subskrypcję tego kanału\? + Konto autora zostało zawieszone. \nNewPipe nie będzie w stanie załadować tego kanału w przyszłości. \nCzy chcesz anulować subskrypcję tego kanału? Nie udało się załadować kanału dla „%s”. Począwszy od Androida 10 obsługiwany jest tylko Storage Access Framework Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik @@ -675,10 +645,8 @@ Wystąpił błąd, zobacz powiadomienie Pokaż snackbar z błędem Utwórz powiadomienie o błędzie - Nie znaleziono odpowiedniego menedżera plików dla tej akcji. -\nZainstaluj menedżer plików lub spróbuj wyłączyć „%s” w ustawieniach pobierania. - Nie znaleziono odpowiedniego menedżera plików dla tej akcji. -\nZainstaluj menedżer plików zgodny z Storage Access Framework. + Nie znaleziono odpowiedniego menedżera plików dla tej akcji. \nZainstaluj menedżer plików lub spróbuj wyłączyć „%s” w ustawieniach pobierania. + Nie znaleziono odpowiedniego menedżera plików dla tej akcji. \nZainstaluj menedżer plików zgodny z Storage Access Framework. Przypięty komentarz LeakCanary jest niedostępne Rozmiar interwału ładowania odtwarzania @@ -702,7 +670,7 @@ Powiadamiaj o nowych strumieniach z subskrypcji Częstotliwość sprawdzania Wymagane połączenie sieciowe - Czy usunąć wszystkie pobrane pliki z dysku\? + Czy usunąć wszystkie pobrane pliki z dysku? Powiadomienia są wyłączone Otrzymuj powiadomienia , @@ -732,11 +700,11 @@ Dodano duplikat %d raz(y) Przydatne, na przykład, jeśli używasz zestawu słuchawkowego z zepsutymi fizycznymi przyciskami Ignoruj zdarzenia sprzętowego przycisku multimedialnego - Czy usunąć duplikaty\? + Czy usunąć duplikaty? Pokaż następujące strumienie Pokaż/Ukryj strumienie Usuń duplikaty - Czy chcesz usunąć wszystkie zduplikowane strumienie z tej playlisty\? + Czy chcesz usunąć wszystkie zduplikowane strumienie z tej playlisty? W pełni obejrzane Częściowo obejrzane Nadchodzące @@ -766,9 +734,7 @@ dubbing audiodeskrypcja Wybieraj ścieżkę dźwiękową z opisami dla osób niedowidzących, jeśli jest dostępna - To obejście zwalnia i ponownie tworzy instancje kodeków wideo, gdy nastąpi zmiana powierzchni, zamiast bezpośrednio ustawiać powierzchnię dla kodeka. Używane już przez ExoPlayera na niektórych urządzeniach z tym problemem, ustawienie to ma wpływ tylko na Androida 6 i nowsze. -\n -\nWłączenie tej opcji może zapobiec błędom odtwarzania podczas przełączania obecnego odtwarzacza wideo lub przechodzenia na pełny ekran + To obejście zwalnia i ponownie tworzy instancje kodeków wideo, gdy nastąpi zmiana powierzchni, zamiast bezpośrednio ustawiać powierzchnię dla kodeka. Używane już przez ExoPlayera na niektórych urządzeniach z tym problemem, ustawienie to ma wpływ tylko na Androida 6 i nowsze. \n \nWłączenie tej opcji może zapobiec błędom odtwarzania podczas przełączania obecnego odtwarzacza wideo lub przechodzenia na pełny ekran Przenieś selektor kart głównych na dół Pozycja kart głównych Tunelowanie multimediów zostało domyślnie wyłączone na Twoim urządzeniu, ponieważ wiadomo, że model Twojego urządzenia go nie obsługuje @@ -813,8 +779,7 @@ Miniatury Udostępnij listę URL-i Udostępnij z tytułami - %1$s -\n%2$s + %1$s \n%2$s Udostępnij playlistę – %1$s: %2$s @@ -830,13 +795,10 @@ Kopia zapasowa i przywracanie Resetuje wszystkie ustawienia do ich domyślnych wartości Resetuj ustawienia - Zresetowanie wszystkich ustawień odrzuci wszystkie Twoje preferowane ustawienia i ponownie uruchomi aplikację. -\n -\nCzy na pewno chcesz kontynuować? + Zresetowanie wszystkich ustawień odrzuci wszystkie Twoje preferowane ustawienia i ponownie uruchomi aplikację. \n \nCzy na pewno chcesz kontynuować? Tak Nie - NewPipe może od czasu do czasu automatycznie sprawdzać dostępność nowych wersji i powiadamiać Cię, gdy tylko będą dostępne. -\nCzy chcesz to włączyć? + NewPipe może od czasu do czasu automatycznie sprawdzać dostępność nowych wersji i powiadamiać Cię, gdy tylko będą dostępne. \nCzy chcesz to włączyć? Ustawienia w importowanym eksporcie korzystają z podatnego na ataki formatu, który został wycofany od wersji NewPipe 0.27.0. Upewnij się, że importowany eksport pochodzi z zaufanego źródła, i w przyszłości używaj wyłącznie eksportów uzyskanych z NewPipe 0.27.0 lub nowszego. Obsługa importowania ustawień w tym podatnym formacie zostanie wkrótce całkowicie usunięta, a wtedy starsze wersje NewPipe nie będą już mogły importować ustawień z eksportu z nowych wersji. dodatkowa Udostępnij jako tymczasową playlistę YouTube diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 6e9a13b6a..3b6849845 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -22,7 +22,7 @@ Detalhes: Relatar por e-mail Relatório de erro - Relatório + Reportar Desculpe, algo deu errado. OK Erro @@ -51,12 +51,12 @@ Desculpe, isto não devia ter acontecido. Iniciar Tema - Publicado em %1$s + Publicado em %1$s URL não suportado Ao vivo Downloads Downloads - Você quis dizer \"%1$s\"\? + Você quis dizer \"%1$s\"? O aplicativo travou Reproduzindo em segundo plano O menu de download não pôde ser configurado @@ -90,8 +90,7 @@ Reproduzindo em modo Popup Todos Desativado - Essa permissão é necessária -\npara abrir em modo Popup + Essa permissão é necessária \npara abrir em modo Popup Limpar Popup Segundo plano @@ -159,7 +158,7 @@ Player Nada aqui além de grilos - Deseja excluir este item do histórico de busca\? + Deseja excluir este item do histórico de busca? Conteúdo da tela inicial Página em branco Página do Kiosk @@ -239,9 +238,9 @@ Preencher Zoom Gerado automaticamente - O monitoramento de vazamento de memória pode tornar o aplicativo instável durante o despejo de pilha - Reportar erros de out-of-lifecycle - Forçar entrega de relatórios de erros Rx fora de um fragmento ou atividade de lifecycle após o descarte + O monitoramento de vazamento de memória pode fazer com que o aplicativo pare de responder durante o despejo de heap + Relatar erros fora do ciclo de vida + Forçar relatórios de exceções Rx não entregues fora do fragmento ou do ciclo de vida da atividade após o descarte Usar busca rápida não exata A busca não exata permite ao player buscar posições mais rapidamente com precisão reduzida. Buscar por 5, 15 ou 25 segundos não funciona com isso Enfileirar automaticamente o próximo stream @@ -261,25 +260,10 @@ Exportação anterior Não foi possível importar as inscrições Não foi possível exportar as inscrições - Importar inscrições do YouTube em Google Takeout: -\n -\n1. Acesse este URL: %1$s -\n2. Faça login quando solicitado -\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", selecione apenas \"Inscrições\" e clique em \"OK\" -\n4. Clique em \"Próxima etapa\" e, em seguida, em \"Criar exportação\" -\n5. Clique no botão \"Download\" quando ele aparecer -\n6. Clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo .zip baixado -\n7. [Se a importação do .zip falhar] Extraia o arquivo .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo csv extraído - Importar um perfil do SoundCloud digitando o URL ou seu ID: -\n -\n1. Ative o \"Modo desktop (computador)\" em um navegador da Web (o site não está disponível para dispositivos móveis) -\n2. Acesse este URL: %1$s -\n3. Faça login quando solicitado -\n4. Copie o URL do perfil para o qual você foi redirecionado. + Importar inscrições do YouTube em Google Takeout: \n \n1. Acesse este URL: %1$s \n2. Faça login quando solicitado \n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", selecione apenas \"Inscrições\" e clique em \"OK\" \n4. Clique em \"Próxima etapa\" e, em seguida, em \"Criar exportação\" \n5. Clique no botão \"Download\" quando ele aparecer \n6. Clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo .zip baixado \n7. [Se a importação do .zip falhar] Extraia o arquivo .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORTAR ARQUIVO abaixo e selecione o arquivo csv extraído + Importar um perfil do SoundCloud digitando o URL ou seu ID: \n \n1. Ative o \"Modo desktop (computador)\" em um navegador da Web (o site não está disponível para dispositivos móveis) \n2. Acesse este URL: %1$s \n3. Faça login quando solicitado \n4. Copie o URL do perfil para o qual você foi redirecionado. seuID, soundcloud.com/seuid - Tenha em mente que esta operação poderá consumir muitos dados. -\n -\nVocê deseja continuar\? + Tenha em mente que esta operação poderá consumir muitos dados. \n \nVocê deseja continuar? Cache de imagens removidos Remover metadados em cache Remover todos os dados da página web armazenados em cache @@ -309,8 +293,7 @@ Política de Privacidade do NewPipe O projeto NewPipe leva a sua privacidade muito a sério. Portanto, o aplicativo não coleta nenhum dado sem o seu consentimento.\nA política de privacidade do NewPipe explica detalhadamente quais dados são enviados e armazenados quando você envia um relatório de falha. Leia a política de privacidade - A fim de cumprir com o Regulamento Geral sobre a Proteção de Dados da UE (RGPD), chamamos sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. -\nVocê deve aceitá-la para nos enviar o relatório de erros. + A fim de cumprir com o Regulamento Geral sobre a Proteção de Dados da UE (RGPD), chamamos sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. \nVocê deve aceitá-la para nos enviar o relatório de erros. Aceitar Recusar Sem limite @@ -336,7 +319,7 @@ Notificação de atualização do aplicativo Notificações para novas versões do NewPipe Armazenamento externo indisponível - Não é possível baixar para o cartão SD externo. Redefinir o local da pasta de download\? + Não é possível baixar para o cartão SD externo. Redefinir o local da pasta de download? Não foi possível carregar as guias salvas, portanto, usamos as guias padrão Restaurar configurações Deseja restaurar os padrões? @@ -397,14 +380,13 @@ Sem espaço disponível O progresso foi perdido pois o arquivo foi excluído Tempo limite de conexão - Excluir todo o histórico de downloads ou excluir todos os arquivos baixados\? + Excluir todo o histórico de downloads ou excluir todos os arquivos baixados? Limitar fila de downloads Permitir apenas um download de cada vez Iniciar downloads Pausar downloads Perguntar onde salvar o arquivo - Você será questionado onde salvar cada download. -\nAtive o seletor de pasta do sistema (SAF) se você quiser baixar em um cartão SD externo + Você será questionado onde salvar cada download. \nAtive o seletor de pasta do sistema (SAF) se você quiser baixar em um cartão SD externo Usar o seletor de pastas do sistema (SAF) A \"Estrutura de acesso ao armazenamento\" permite baixar em um cartão SD externo Remover posições de reprodução @@ -484,7 +466,7 @@ %d selecionadas Nome do grupo está vazio - Excluir este grupo\? + Excluir este grupo? Novo Feed Limite de atualização do feed @@ -494,34 +476,20 @@ Disponível em alguns serviços, geralmente é muito mais rápido mas pode retornar um número limitado de itens e geralmente informações incompletas (por exemplo sem duração, tipo de item, sem status em tempo real) Ativar modo rápido Desativar modo rápido - Acha o carregamento do feed muito lento\? Se sim, tente ativar o modo de carregamento rápido (você pode mudar em configurações ou tocando no botão abaixo). -\n -\nO NewPipe oferece duas estratégias para carregar o feed: -\n• Buscar todo o conteúdo do canal inscrito, que é lento mas completo. -\n• Usar um endpoint de serviço dedicado, que é rápido mas geralmente incompleto. -\n -\nA diferença entre os dois é que no rápido geralmente falta alguma informação, como a duração ou tipo do item (não consegue distinguir entre as lives e os vídeos normais) e pode retornar menos itens. -\n -\nO YouTube é um exemplo de serviço que oferece o modo rápido com seu feed RSS. -\n -\nAssim, a escolha se resume ao que você prefere: rapidez ou informação precisa. - O NewPipe ainda não suporta esse conteúdo. -\n -\nEsperamos que terá suporte em uma versão futura. + Acha o carregamento do feed muito lento? Se sim, tente ativar o modo de carregamento rápido (você pode mudar em configurações ou tocando no botão abaixo). \n \nO NewPipe oferece duas estratégias para carregar o feed: \n• Buscar todo o conteúdo do canal inscrito, que é lento mas completo. \n• Usar um endpoint de serviço dedicado, que é rápido mas geralmente incompleto. \n \nA diferença entre os dois é que no rápido geralmente falta alguma informação, como a duração ou tipo do item (não consegue distinguir entre as lives e os vídeos normais) e pode retornar menos itens. \n \nO YouTube é um exemplo de serviço que oferece o modo rápido com seu feed RSS. \n \nAssim, a escolha se resume ao que você prefere: rapidez ou informação precisa. + O NewPipe ainda não suporta esse conteúdo. \n \nEsperamos que terá suporte em uma versão futura. ∞ vídeos +100 vídeos Artistas Álbuns Músicas - Este vídeo tem restrição de idade. -\n -\nAtive \"%1$s\" nas configurações se quiser vê-lo. + Este vídeo tem restrição de idade. \n \nAtive \"%1$s\" nas configurações se quiser vê-lo. Sim, e vídeos parcialmente assistidos Os vídeos que foram assistidos antes e depois de terem sidos adicionados à playlist serão removidos. \nTem certeza? Remover vídeos assistidos? Remover assistidos - Textos originais dos serviços serão visíveis nos itens de transmissão - Mostrar tempo original nos itens + Os textos originais dos serviços ficarão visíveis nos itens do stream + Mostrar o tempo atrás original nos itens Ativar o \"Modo Restrito\" do YouTube Por %s Criado por %s @@ -538,7 +506,7 @@ Somente no Wi-Fi Iniciar reprodução automaticamente — %s Fila de reprodução - Não foi possível reconhecer a URL. Abrir com outro aplicativo\? + Não foi possível reconhecer a URL. Abrir com outro aplicativo? Pôr na fila automaticamente A fila de reprodução atual será substituída Mudar de um player para outro pode substituir sua fila @@ -582,14 +550,13 @@ Mostrar descrição Reproduzir com Nenhum aplicativo em seu dispositivo pode abrir isso - O aplicativo parou + Travar o aplicativo Este conteúdo está disponível apenas para usuários que pagaram, portanto não pode ser transmitido ou baixado pelo NewPipe. Este vídeo está disponível apenas para assinantes do YouTube Music Premium, portanto não pode ser transmitido ou baixado pelo NewPipe. Este conteúdo é privado, portanto não pode ser transmitido ou baixado pelo NewPipe. Esta é uma faixa do SoundCloud Go+, pelo menos no seu país, portanto não pode ser transmitida ou baixada pelo NewPipe. Este conteúdo não está disponível em seu país. - Este vídeo tem restrição de idade. -\nDevido às novas políticas do YouTube sobre vídeos com restrição de idade, o NewPipe não pode acessar qualquer de suas transmissões de vídeo e assim ela não pode ser exibida. + Este vídeo tem restrição de idade. \nDevido às novas políticas do YouTube sobre vídeos com restrição de idade, o NewPipe não pode acessar qualquer de suas transmissões de vídeo e assim ela não pode ser exibida. Rádio Destaque Resolvido @@ -619,9 +586,7 @@ Abrir site Conta encerrada O modo feed rápido não fornece mais informações sobre isso. - A conta do autor foi encerrada. -\nNewPipe não poderá carregar este feed no futuro. -\nDeseja cancelar a inscrição neste canal\? + A conta do autor foi encerrada. \nNewPipe não poderá carregar este feed no futuro. \nDeseja cancelar a inscrição neste canal? Não foi possível carregar o feed para \'%s\'. Erro ao carregar o feed A \"Estrutura de acesso ao armazenamento\" é compatível apenas com versões a partir do Android 10 @@ -660,20 +625,18 @@ Buscando atualizações… Travar reprodução Mostrar \"Travar reprodução\" - Mostra uma opção para travar a reprodução + Mostra uma opção de travamento ao usar o player Novos itens do feed Notificação de relatório de erro Notificações para reportar erros O NewPipe encontrou um erro, toque para relatar - Crie uma notificação de erro - Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. -\nInstale um gerenciador de arquivos compatível com a \"Estrutura de acesso ao armazenamento\" + Criar uma notificação de erro + Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. \nInstale um gerenciador de arquivos compatível com a \"Estrutura de acesso ao armazenamento\" Ocorreu um erro, consulte a notificação - Mostrar um snackbar de erro - Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. -\nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download + Mostrar uma barra de erro + Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação. \nInstale um gerenciador de arquivos ou tente desativar \'%s\' nas configurações de download Comentário fixado - O LeakCanary não está disponível + LeakCanary não está disponível Padrão do ExoPlayer Notificação de reprodução Configurar notificação da reprodução do vídeo atual @@ -694,7 +657,7 @@ %s novos vídeos %s novos vídeos - Buscar novos vídeos + Executar verificação de novos streams Conexão de rede necessária As notificações estão desativadas Seja notificado @@ -725,7 +688,7 @@ Ignorar eventos de botão de mídia de hardware Útil, por exemplo, se você estiver usando um fone de ouvido com botões físicos quebrados Remover duplicados - Remover duplicados\? + Remover duplicados? Deseja remover todos os vídeos duplicados nesta playlist? Mostrar próximos vídeos Mostrar/ocultar vídeos @@ -783,8 +746,7 @@ Compartilhar URLs Compartilhar com títulos Compartilhar como playlist temporária do YouTube - %1$s -\n%2$s + %1$s \n%2$s Alternar orientação da tela Baixa qualidade Alternar tela cheia @@ -820,13 +782,10 @@ Sim Não Backup e restauração - O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis. -\nDeseja ativar essa opção? + O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis. \nDeseja ativar essa opção? Restaurar configurações Restaurar todas as configurações para seus valores padrão - A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará o aplicativo. -\n -\nTem certeza de que deseja continuar? + A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará o aplicativo. \n \nTem certeza de que deseja continuar? As configurações na exportação que está sendo importada usam um formato vulnerável que foi descontinuado desde o NewPipe 0.27.0. Certifique-se de que a exportação que está sendo importada seja de uma fonte confiável e prefira usar apenas exportações obtidas do NewPipe 0.27.0 ou mais recente no futuro. O suporte para importação de configurações neste formato vulnerável será completamente removido em breve e as versões antigas do NewPipe não poderão mais importar configurações de exportações de novas versões. secundário Playlists diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index f0c82f40e..2de7d31b1 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -2,9 +2,7 @@ Recusar Iniciar reprodução em segundo plano - Tenha em atenção de que esta operação pode sobrecarregar a sua rede. -\n -\nDeseja continuar\? + Tenha em atenção de que esta operação pode sobrecarregar a sua rede. \n \nDeseja continuar? Toque na lupa para começar. Continuar reprodução Processos @@ -55,34 +53,29 @@ Ajustar Atualizar sempre Reproduzir tudo - Eliminar esta lista de reprodução\? + Eliminar esta lista de reprodução? Informação: Licenças Interromper em redes limitadas Reproduzir vídeo, duração: Novo - Este conteúdo ainda não é suportado pelo NewPipe. -\n -\nEsperamos que seja suportado numa versão futura. + Este conteúdo ainda não é suportado pelo NewPipe. \n \nEsperamos que seja suportado numa versão futura. Nenhum Escolha a pasta para colocar os ficheiros de vídeo - Deseja apagar este grupo\? + Deseja apagar este grupo? Não foi possível encontrar o servidor Não foi possível importar as subscrições Transferências A processar… - Este vídeo está restringido a idades. -\n -\nPara o poder ver, tem que ativar \"%1$s\" nas definições. + Este vídeo está restringido a idades. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. Ler licença Apenas os URL HTTPS são suportados Falha ao validar a instância Limpar histórico de descargas - Remover todas as posições de reprodução\? + Remover todas as posições de reprodução? Limitar fila de descargas Mostrar conteúdo com restrição de idade - O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe nenhum dado sem o seu consentimento. -\nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro. + O projeto NewPipe leva a sua privacidade muito a sério. Portanto, a app não coleta nenhum dado sem o seu consentimento.\nA política de privacidade do NewPipe explica detalhadamente quais dados são enviados e armazenados ao enviar um relatório de erro. Ficheiro Adicionar a Remove todas as posições de reprodução @@ -105,7 +98,7 @@ Prima \"Feito\" ao resolver A carregar… Áudio - Mostrar antiguidade nos itens + Mostrar o tempo desde o original nos elementos \'Kiosk\' padrão Lista de reprodução criada Criado por %s @@ -137,7 +130,7 @@ Mostrar resoluções mais altas Sem subscritores Usar reprodutor de áudio externo - Será que queria dizer \"%1$s\"\? + Será que queria dizer \"%1$s\"? Mostrar uma notificação para pedir a atualização da aplicação se existir uma nova versão Enfileirar Ninguém está a ver @@ -154,7 +147,7 @@ Limpar Cancelar subscrição Conteúdo - Os textos originais dos serviços serão visíveis nos itens do vídeo + Os textos originais dos serviços ficarão visíveis nos elementos de transmissão Publicado em %1$s Avanço rápido durante silêncio Não foram encontrados áudios @@ -168,15 +161,7 @@ País padrão para conteúdo Streaming livre e gratuito no Android. Idioma padrão para conteúdo - Importar subscrições do YouTube do Google Takeout: -\n -\n1. Vá para este URL: %1$s -\n2. Faça o login quando solicitado -\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\". -\n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\". -\n5. Clique no botão \"Descarregar\" após aparecer -\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado -\n7. [Se a importação do .zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído + Importar subscrições do YouTube do Google Takeout: \n \n1. Vá para este URL: %1$s \n2. Faça o login quando solicitado \n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", depois selecione apenas \"subscrições\" e clique em \"OK\". \n4. Clique em \"Próximo passo\" e depois em \"Criar exportação\". \n5. Clique no botão \"Descarregar\" após aparecer \n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado \n7. [Se a importação do .zip falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído Minimizar para reprodutor em segundo plano Desafio reCAPTCHA solicitado Reprodução automática @@ -184,11 +169,10 @@ O NewPipe é desenvolvido por voluntários que passam o seu tempo livre a trazer-lhe a melhor experiência de utilizador. Retribua para ajudar os programadores a fazer o NewPipe ainda melhor enquanto tomam uma chávena de café. Continuar a encerrar a fila de reprodução (sem repetição) a anexar um fluxo relacionado Sempre - Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. -\nTem que aceitar esta política para nos poder enviar o seu relatório. + Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. \nTem que aceitar esta política para nos poder enviar o seu relatório. Grupos de canais Instalar - Também deseja importar as definições\? + Também deseja importar as definições? Guardar lista de reprodução como favorita Passo Top 50 @@ -234,7 +218,7 @@ %s ouvintes %s ouvintes - Remover todo o histórico de pesquisas\? + Remover todo o histórico de pesquisas? Reportar por e-mail Escolher separador Grade @@ -247,7 +231,7 @@ Áudio Cancelar Falha pós-processamento - Remover todo o histórico de visualizações\? + Remover todo o histórico de visualizações? A obter informação… Sugestões de pesquisa Definir como miniatura da lista de reprodução @@ -257,7 +241,7 @@ %s subscritores %s subscritores - Deseja repor as predefinições\? + Deseja repor as predefinições? Os reprodutores externos não suportam este tipo de hiperligações Mudar nome \'Storage Access Framework\' permite transferências para um cartão SD externo @@ -265,12 +249,7 @@ Ficheiro movido ou eliminado Última reprodução Visite o site do NewPipe para mais informações e novidades. - Importe o seu perfil SoundCloud digitando o URL ou a ID.: -\n -\n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis) -\n2. Aceda a este URL: %1$s -\n3. Inicie a sessão -\n4. Copie o URL do seu perfil. + Importe o seu perfil SoundCloud digitando o URL ou a ID.: \n \n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis) \n2. Aceda a este URL: %1$s \n3. Inicie a sessão \n4. Copie o URL do seu perfil. Limpar meta-dados em cache Não foi possível processar o site Sem comentários @@ -288,7 +267,7 @@ Terminada Histórico de vídeos apagado - Não tem um reprodutor de vídeo. Instalar o VLC\? + Não tem um reprodutor de vídeo. Instalar o VLC? Desative para ocultar comentários Limitar resolução ao usar dados móveis Separadores mostrados na página principal @@ -302,7 +281,7 @@ Ação \'abrir\' preferida Vídeo e áudio Letras e dígitos - A monitorização de memória pode tornar a aplicação instável + O monitoramento de vazamento de memória pode fazer com que a app pare de responder durante o despejo de heap Copiar relatório formatado Ampliar O nome do ficheiro não pode estar vazio @@ -326,7 +305,7 @@ Rejeitar Controlos para velocidade de reprodução Não foi possível exportar as subscrições - Forçar reporte de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após eliminação + Forçar relatórios de exceções Rx não entregues fora do fragmento ou do ciclo de vida da atividade após o descarte Recentes %s vídeo @@ -366,7 +345,7 @@ Novidades Local Aplicação terminou em erro - Deseja remover este item do histórico de pesquisas\? + Deseja remover este item do histórico de pesquisas? Retomar reprodução NewPipe é um software copyleft libre: pode usá-lo, estudá-lo, partilhá-lo e melhorá-lo à vontade. Especificamente, pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (ao seu critério) qualquer versão posterior. ∞ vídeos @@ -405,13 +384,12 @@ Lembrar das propriedades do pop-up Os ficheiros de vídeo descarregados serão guardados aqui Mudar para principal - Esta permissão é necessária -\npara o modo popup + Esta permissão é necessária \npara o modo popup Sem vídeos Miniatura do avatar do canal O servidor não envia dados - Reportar erros \'out-of-lifecycle\' - Instalar Kore\? + Relatar erros fora do ciclo de vida + Instalar Kore? Nome Copiado para a área de transferência Carateres permitidos no nome dos ficheiros @@ -455,7 +433,7 @@ Perguntar para onde transferir Mostrar informações Limpar histórico de visualizações - Não é possível guardar no cartão SD. Repor pasta de descargas\? + Não é possível guardar no cartão SD. Repor pasta de descargas? Soma de controlo Restaurar última posição de reprodução Minimizar para reprodutor pop-up @@ -476,8 +454,7 @@ Meta-dados em cache limpos Mostrar dica ao premir em segundo plano ou no botão \"Detalhes:\" da janela popup Não foi encontrado um reprodutor (pode instalar o VLC para reproduzir). - Ser-lhe-á perguntado onde guardar cada transferência. -\nAtive o seletor de pastas do sistema (SAF) se quiser transferir para um cartão SD externo + Ser-lhe-á perguntado onde guardar cada transferência. \nAtive o seletor de pastas do sistema (SAF) se quiser transferir para um cartão SD externo Mostrar opção \"Reproduzir no Kodi\" Sem resultados Desativado @@ -500,17 +477,7 @@ Mudar para popup Adicionar à playlist Reproduzir no modo poppup - Acha que a fonte demora muito tempo a carregar\? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). -\n -\nNewPipe oferece duas estratégias de carregamento: -\n- Obter todo o canal de subscrição - lento, mas completo. -\n- Usar um \'endpoint\' dedicado - mais rápido, mas não completo. -\n -\nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostrar menos itens. -\n -\nO YouTube é um exemplo de um serviço que oferece este método rápido com a sua fonte RSS. -\n -\nAssim, a escolha resume-se ao que prefere: velocidade ou informação precisa. + Acha que a fonte demora muito tempo a carregar? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). \n \nNewPipe oferece duas estratégias de carregamento: \n- Obter todo o canal de subscrição - lento, mas completo. \n- Usar um \'endpoint\' dedicado - mais rápido, mas não completo. \n \nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostrar menos itens. \n \nO YouTube é um exemplo de um serviço que oferece este método rápido com a sua fonte RSS. \n \nAssim, a escolha resume-se ao que prefere: velocidade ou informação precisa. Abrir no modo popup Pausa A carregar o conteúdo solicitado @@ -528,7 +495,7 @@ Reproduzir no Kodi Armazenamento externo indisponível Falha ao descarregar - Relatório + Reportar Toque para detalhes em pausa Mostrar comentários @@ -538,7 +505,7 @@ Somente no Wi-Fi Iniciar reprodução automaticamente — %s Reproduzir fila - URL não reconhecido. Abrir com outra aplicação\? + URL não reconhecido. Abrir com outra aplicação? Enfileiramento automático A fila do reprodutor ativo será substituída Mudar de um player para outro pode substituir a sua fila @@ -557,7 +524,7 @@ Primeiro botão de ação Ajustar miniatura de vídeo mostrada na notificação de 16:9 para 1:1 (pode introduzir distorções) Cortar miniatura na proporção 1:1 - Mostrar \'leaks\' de memória + Mostrar vazamentos de memória Colocado na fila Enfileirar Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA @@ -583,14 +550,13 @@ Desative para ocultar a descrição do vídeo e informações adicionais Mostrar descrição Abrir com - A app travou + Travar a app Este conteúdo só está disponível para utilizadores que pagaram, portanto não pode ser transmitido ou descarregado pelo NewPipe. Este vídeo está disponível apenas para os membros do YouTube Music Premium, portanto não pode ser transmitido ou descarregado pelo NewPipe. Este conteúdo é privado, portanto não pode ser transmitido ou descarregado pelo NewPipe. Esta é uma faixa de SoundCloud Go+, pelo menos no seu país, pelo que não pode ser transmitida ou descarregada por NewPipe. Este conteúdo não está disponível no seu país. - Este vídeo tem uma restrição de idade. -\nDevido às novas políticas do YouTube quanto a vídeos com restrição de idade, o NewPipe não pode aceder as estes vídeos, por isso não consegue reproduzi-lo. + Este vídeo tem uma restrição de idade. \nDevido às novas políticas do YouTube quanto a vídeos com restrição de idade, o NewPipe não pode aceder as estes vídeos, por isso não consegue reproduzi-lo. Rádio Destaques Resolver @@ -624,9 +590,7 @@ Agora pode selecionar o texto na descrição. Note que a página pode cintilar e as ligações podem não ser clicáveis enquanto estiver no modo de seleção. Conta encerrada O modo de feed rápido não fornece mais informações sobre isto. - A conta do autor foi encerrada. -\nNewPipe não será capaz de carregar este feed no futuro. -\nQuer cancelar a inscrição deste canal\? + A conta do autor foi encerrada. \nNewPipe não será capaz de carregar este feed no futuro. \nQuer cancelar a inscrição deste canal? Não foi possível carregar o feed para \'%s\'. Erro ao carregar o feed A partir do Android 10, apenas o \'Storage Access Framework\' é compatível @@ -667,18 +631,16 @@ Notificações para reportar erros NewPipe encontrou um erro, toque para relatar Ocorreu um erro, veja a notificação - Mostrar um snackbar de erro + Mostrar uma barra de erro Criar uma notificação de erro - Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. -\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar - Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. -\nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework + Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. \nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas configurações de descarregar + Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. \nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework Comentário fixado LeakCanary não está disponível Padrão do ExoPlayer Notificações A carregar detalhes do vídeo… - Verificar se há novos vídeos + Executar verificação de novas transmissões Notificações sobre novos vídeos Frequência da verificação Eliminar todos os ficheiros descarregados do disco? @@ -731,8 +693,8 @@ Completamente visto Parcialmente visto Proximamente - Remover duplicados\? - Quer remover todos os vídeos duplicados nesta lista de reprodução\? + Remover duplicados? + Quer remover todos os vídeos duplicados nesta lista de reprodução? Ação do gesto esquerdo Ação do gesto direito Brilho @@ -772,8 +734,7 @@ Os separadores a mostrar na página Canal Partilhar lista de URLs Partilhar com títulos - %1$s -\n%2$s + %1$s \n%2$s Separadores do canal Curtos A carregar metadados… @@ -816,12 +777,9 @@ %s respostas Mostrar menos - O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis. -\nDeseja ativar essa opção? + O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis. \nDeseja ativar essa opção? Repor valores originais de todas as definições - A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará a aplicação. -\n -\nTem certeza que deseja continuar? + A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará a aplicação. \n \nTem certeza que deseja continuar? Sim Não Backup e restauração diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index d6713d426..d41002438 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -1,7 +1,7 @@ Publicado em %1$s - Reprodutor de vídeo não encontrado. Instalar VLC\? + Reprodutor de vídeo não encontrado. Instalar VLC? Instalar Cancelar Abrir no navegador @@ -9,7 +9,7 @@ Descarregar Pesquisar Configurações - Será que queria dizer \"%1$s\"\? + Será que queria dizer \"%1$s\"? Partilhar com Usar player de vídeo externo Usar reprodutor de áudio externo @@ -18,7 +18,7 @@ Escolha a pasta para guardar os ficheiros de vídeo Resolução padrão Reproduzir no Kodi - Instalar Kore\? + Instalar Kore? Mostrar opção \"Reproduzir no Kodi\" Exibir uma opção para reproduzir um vídeo através do centro de média Kodi Áudio @@ -51,7 +51,7 @@ Bolas, isto não deveria ter acontecido. Reportar por e-mail Desculpe mas algo correu mal. - Relatório + Reportar Informação: O que ocorreu: Comentários (em inglês): @@ -82,8 +82,7 @@ Abrir no modo popup Preto Tudo - Esta permissão é necessária -\npara o modo popup + Esta permissão é necessária \npara o modo popup Desafio reCAPTCHA Desafio reCAPTCHA solicitado Reproduzir no modo poppup @@ -159,7 +158,7 @@ Mais caracteres especiais Histórico Histórico - Deseja remover este item do histórico de pesquisas\? + Deseja remover este item do histórico de pesquisas? Reproduzir tudo [Desconhecido] Ocorreu um erro compulsivo do reprodutor @@ -240,7 +239,7 @@ Adicionar à playlist Guardar lista de reprodução como favorita Remover marcador - Eliminar esta lista de reprodução\? + Eliminar esta lista de reprodução? Lista de reprodução criada Adicionado à lista de reprodução Miniatura da lista de reprodução alterada. @@ -257,21 +256,8 @@ Exportação anterior Não foi possível importar as subscrições Não foi possível exportar as subscrições - Importar subscrições do YouTube do Google Takeout: -\n -\n1. Aceda ao URL: %1$s -\n2. Inicie sessão -\n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", selecione \"Subscrições\" e clique em \"OK\". -\n4. Clique em \"Próximo passo\" e, depois, em \"Criar exportação\". -\n5. Clique no botão \"Descarregar\" após aparecer -\n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado -\n7. [Se a importação falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído - Importe o seu perfil SoundCloud digitando o URL ou a ID.: -\n -\n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis) -\n2. Aceda a este URL: %1$s -\n3. Inicie a sessão -\n4. Copie o URL do seu perfil. + Importar subscrições do YouTube do Google Takeout: \n \n1. Aceda ao URL: %1$s \n2. Inicie sessão \n3. Clique em \"Todos os dados incluídos\", depois em \"Desmarcar todos\", selecione \"Subscrições\" e clique em \"OK\". \n4. Clique em \"Próximo passo\" e, depois, em \"Criar exportação\". \n5. Clique no botão \"Descarregar\" após aparecer \n6. Clique em IMPORT FILE abaixo e selecione o ficheiro .zip descarregado \n7. [Se a importação falhar] Extraia o ficheiro .csv (geralmente em \"YouTube e YouTube Music/subscriptions/subscriptions.csv\"), clique em IMPORT FILE abaixo e selecione o ficheiro csv extraído + Importe o seu perfil SoundCloud digitando o URL ou a ID.: \n \n1. Ative o modo desktop do seu navegador web (o site não está disponível para dispositivos móveis) \n2. Aceda a este URL: %1$s \n3. Inicie a sessão \n4. Copie o URL do seu perfil. suaID, soundcloud.com/suaID Controlos para velocidade de reprodução Ritmo @@ -284,22 +270,21 @@ Faixas Utilizadores Remove o histórico dos vídeos reproduzidos e as posições de reprodução - Remover todo o histórico de visualizações\? + Remover todo o histórico de visualizações? Histórico de vídeos eliminado Remover histórico de pesquisas Remove o histórico de pesquisas - Remover todo o histórico de pesquisas\? + Remover todo o histórico de pesquisas? Histórico de pesquisa removido 1 item eliminado. O NewPipe é desenvolvido por voluntários que passam o seu tempo livre a trazer-lhe a melhor experiência de utilizador. Retribua para ajudar os programadores a fazer o NewPipe ainda melhor enquanto tomam uma chávena de café. Retribuir Política de Privacidade do NewPipe - O projeto NewPipe leva a sua privacidade muito a sério. Por isso, não recolhe dados sem o seu consentimento. -\nA polícia de privacidade do NewPipe explica, em detalhe, os tipos de dados enviados sempre que submete um relatório de erro. + O projeto NewPipe leva a sua privacidade muito a sério. Portanto, a app não coleta nenhum dado sem o seu consentimento.\nA política de privacidade do NewPipe explica detalhadamente quais dados são enviados e armazenados ao enviar um relatório de erro. Leia a política de privacidade Enfileirar automaticamente o próximo stream NewPipe é um software copyleft libre: pode usá-lo, estudá-lo, partilhá-lo e melhorá-lo à vontade. Especificamente, pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (ao seu critério) qualquer versão posterior. - Também deseja importar as definições\? + Também deseja importar as definições? Toque longo para colocar na fila Ação \'abrir\' preferida Ação padrão ao abrir o conteúdo — %s @@ -307,19 +292,16 @@ Ajustar Preencher Modifique a escala do texto da legenda do player e os estilos de fundo. Requer reinicialização da app para entrar em vigor - A monitorização de memória pode tornar a aplicação instável - Reportar erros \'out-of-lifecycle\' - Forçar reporte de exceções Rx não entregáveis ocorrendo fora do fragmento ou ciclo de vida da atividade após eliminação - Tenha em atenção de que esta operação pode sobrecarregar a sua rede. -\n -\nDeseja continuar\? + O monitoramento de vazamento de memória pode fazer com que a app pare de responder durante o despejo de heap + Relatar erros fora do ciclo de vida + Forçar relatórios de exceções Rx não entregues fora do fragmento ou do ciclo de vida da atividade após o descarte + Tenha em atenção de que esta operação pode sobrecarregar a sua rede. \n \nDeseja continuar? Velocidade Desvincular (pode causar distorção) Avanço rápido durante silêncio Passo Repor - Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. -\nTem que aceitar esta política para nos poder enviar o seu relatório. + Para cumprir com o Regulamento Geral da Proteção de Dados (RGPD), chamamos a sua atenção para a política de privacidade do NewPipe. Por favor, leia com atenção. \nTem que aceitar esta política para nos poder enviar o seu relatório. Aceitar Recusar Sem limite @@ -336,10 +318,10 @@ Notificação de nova versão Notificações para novas versões do NewPipe Armazenamento externo indisponível - Não é possível guardar no cartão SD. Repor pasta de descargas\? + Não é possível guardar no cartão SD. Repor pasta de descargas? Não foi possível ler os separadores guardados e vamos usar os separadores padrão Repor predefinições - Deseja repor as predefinições\? + Deseja repor as predefinições? Número de subscrições indisponível Separadores mostrados na página principal Atualizações @@ -404,13 +386,12 @@ Iniciar descargas Pausa nas descargas Perguntar onde guardar - Ser-lhe-á perguntado onde guardar cada descarga. -\nAtive o seletor de pastas do sistema (SAF) se quiser descarregar para um cartão SD externo + Ser-lhe-á perguntado onde guardar cada descarga. \nAtive o seletor de pastas do sistema (SAF) se quiser descarregar para um cartão SD externo Utilizar seletor de pastas do sistema (SAF) \'Storage Access Framework\' permite descargas para um cartão SD externo Remover posições de reprodução Remove todas as posições de reprodução - Remover todas as posições de reprodução\? + Remover todas as posições de reprodução? Alternar serviço atualmente selecionado: \'Kiosk\' padrão Ninguém está a ver @@ -448,17 +429,7 @@ Predefinição do sistema Prima \"Feito\" ao resolver Concluído - Acha que a fonte demora muito tempo a carregar? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). -\n -\nNewPipe oferece duas estratégias de carregamento: -\n- Obter todo o canal - lento, mas completo. -\n- Usar um \'endpoint\' dedicado - mais rápido, mas não completo. -\n -\nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostrar menos itens. -\n -\nO YouTube é um exemplo de um serviço que oferece este método rápido com a sua fonte RSS. -\n -\nAssim, a escolha resume-se ao que prefere: velocidade ou informação precisa. + Acha que a fonte demora muito tempo a carregar? Se sim, tente ativar o carregamento rápido (pode alterar a opção nas definições ou no botão abaixo). \n \nNewPipe oferece duas estratégias de carregamento: \n- Obter todo o canal - lento, mas completo. \n- Usar um \'endpoint\' dedicado - mais rápido, mas não completo. \n \nA diferença entre os dois é que o rápido geralmente carece de alguma informação, como a duração ou tipo do item (não consegue distinguir entre vídeos em direto e vídeos normais) e pode mostrar menos itens. \n \nO YouTube é um exemplo de um serviço que oferece este método rápido com a sua fonte RSS. \n \nAssim, a escolha resume-se ao que prefere: velocidade ou informação precisa. Desativar modo rápido Ativar modo rápido Disponível em alguns serviços, é geralmente muito mais rápido, mas pode devolver uma quantidade limitada de itens e muitas vezes informações incompletas (por exemplo, sem duração, tipo de item, sem estado ativo) @@ -506,23 +477,19 @@ Ativar som Sem som Vídeos - Este conteúdo ainda não é suportado pelo NewPipe. -\n -\nEsperamos que seja suportado numa versão futura. + Este conteúdo ainda não é suportado pelo NewPipe. \n \nEsperamos que seja suportado numa versão futura. ∞ vídeos +100 vídeos Artistas Álbuns Músicas - Este vídeo está restringido a adultos. -\n -\nPara o poder ver, tem que ativar \"%1$s\" nas definições. + Este vídeo está restringido a adultos. \n \nPara o poder ver, tem que ativar \"%1$s\" nas definições. Os vídeos que tenham sido vistos antes e após serem adicionados à lista de reprodução serão removidos. \nTem a certeza? Sim e também os vídeos parcialmente vistos Remover transmissões vistas? Remover visualizados - Os textos originais dos serviços serão visíveis nos itens do vídeo - Mostrar antiguidade nos itens + Os textos originais dos serviços ficarão visíveis nos elementos de transmissão + Mostrar o tempo desde o original nos elementos Ativar \"Modo restrito\" do YouTube Por %s Criado por %s @@ -557,7 +524,7 @@ Pode selecionar, no máximo, três ações para mostrar na notificação compacta! Repetir Quinto botão de ação - Mostrar \'leaks\' de memória + Mostrar vazamentos de memória Colocado na fila Enfileirar Limpar cookies que NewPipe armazena quando resolve um reCAPTCHA @@ -583,9 +550,8 @@ Desative para ocultar a descrição do vídeo e informações adicionais Mostrar descrição Abrir com - Terminar aplicação - Este vídeo tem uma restrição de idade. -\nDevido às novas políticas do YouTube quanto a restrição de alguns vídeos, o NewPipe não pode aceder a estes vídeos e, por isso, não os consegue reproduzir. + Travar a app + Este vídeo tem uma restrição de idade. \nDevido às novas políticas do YouTube quanto a restrição de alguns vídeos, o NewPipe não pode aceder a estes vídeos e, por isso, não os consegue reproduzir. Este conteúdo só está disponível para utilizadores pagantes e não pode ser reproduzido ou descarregado pelo NewPipe. Este vídeo só está disponível para os membros do YouTube Music Premium e não pode ser reproduzido ou descarregado pelo NewPipe. Este conteúdo é privado e não pode ser reproduzido ou descarregado pelo NewPipe. @@ -606,9 +572,7 @@ Ainda não definiu uma pasta para as descargas. Escolha agora a pasta a utilizar Conta encerrada O modo de fonte rápida não fornece mais informações sobre isto. - A conta do autor foi encerrada. -\nNewPipe não será capaz de carregar esta fonte. -\nDeseja cancelar a subscrição deste canal? + A conta do autor foi encerrada. \nNewPipe não será capaz de carregar esta fonte. \nDeseja cancelar a subscrição deste canal? Não foi possível carregar a fonte para \'%s\'. Erro ao carregar a fonte A partir do Android 10, apenas é compatível o \'Storage Access Framework\' @@ -662,24 +626,23 @@ Novos itens Terminou o reprodutor Mostrar \"Travar o reprodutor\" - Mostra uma opção para terminar o reprodutor + Mostra uma opção de travamento ao usar o reprodutor Notificação para relatórios de erro Notificações para reportar erros NewPipe encontrou um erro, toque para reportar Ocorreu um erro, veja a notificação - Mostrar uma barra de erros + Mostrar uma barra de erro Criar uma notificação de erro - Não foi encontrado um gestor de ficheiros apropriado para esta ação. -\nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas definições das descargas + Não foi encontrado um gestor de ficheiros apropriado para esta ação. \nPor favor, instale um gestor de ficheiros ou tente desativar \'%s\' nas definições das descargas Nenhum gestor de ficheiros apropriado foi encontrado para esta ação. \nPor favor, instale um gestor de ficheiros compatível com o Storage Access Framework Comentário afixado - LeakCanary não disponível + LeakCanary não está disponível Padrão do ExoPlayer Notificação do reprodutor Configurar notificação da reprodução do vídeo atual Notificações A carregar detalhes do vídeo… - Procurar novos vídeos + Executar verificação de novas transmissões Notificações sobre novos vídeos Notificar sobre novos vídeos nas subscrições Frequência da verificação @@ -725,7 +688,7 @@ Ignorar eventos de botão de média de hardware Útil, por exemplo, se usar auscultadores com botões físicos quebrados Remover duplicados - Remover duplicados\? + Remover duplicados? Mostrar/ocultar vídeos Brevemente Deseja remover todos os vídeos duplicados desta lista de reprodução? @@ -774,8 +737,7 @@ Os separadores a mostrar na página Canal Partilhar URL Partilhar com título - %1$s -\n%2$s + %1$s \n%2$s Separadores do canal Curtos Alternar orientação do ecrã @@ -821,11 +783,8 @@ Repor valores originais de todas as definições Backup e restauração Repor definições - A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará a aplicação. -\n -\nTem certeza que deseja continuar? - O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis. -\nDeseja ativar essa opção? + A restauração de todas as configurações descartará todas as suas configurações preferidas e reiniciará a aplicação. \n \nTem certeza que deseja continuar? + O NewPipe pode verificar automaticamente se há novas versões de tempos em tempos e notificá-lo quando elas estiverem disponíveis. \nDeseja ativar essa opção? As configurações na exportação a serem importadas usam um formato vulnerável depreciado desde NewPipe 0.27.0. Certifique-se de que a exportação que é importada é de uma fonte confiável e prefira usar apenas as exportações obtidas do NewPipe 0.27.0 ou mais recentes no futuro. O suporte para importar configurações neste formato vulnerável será removido em breve completamente e, em seguida, versões antigas do NewPipe não serão capazes de importar configurações de exportações de novas versões. secundário Partilhar como lista de reprodução temporária do YouTube diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 31e837458..846bfac25 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -1,7 +1,7 @@ Publicat pe %1$s - Niciun player pentru streaming găsit. Instalați VLC\? + Niciun player pentru streaming găsit. Instalați VLC? Instalare Anulează Deschide în browser @@ -78,8 +78,7 @@ Copiat în clipboard Vă rugăm să definiți un folder de descărcare mai târziu în setări Deschidere în modul popup - Această permisiune este necesară pentru a -\ndeschide în mod pop-up + Această permisiune este necesară pentru a \ndeschide în mod pop-up Provocare reCAPTCHA Provocare reCAPTCHA solicitată Rezoluția implicită a ferestrei pop-up @@ -254,7 +253,7 @@ Titluri Ștergeți istoricul vizionărilor Șterge istoricul fluxurilor redate și pozițiile de redare - Ștergeți întregul istoric al vizionărilor\? + Ștergeți întregul istoric al vizionărilor? 1 element șters. Playlist nou Adaugă la lista de redare @@ -279,15 +278,15 @@ Istoricul de vizionări a fost șters Ștergeți istoricul căutărilor Șterge istoricul cuvintelor cheie de căutare - Ștergeți întregul istoric de căutare\? + Ștergeți întregul istoric de căutare? Istoric de căutare șters Stocare externă indisponibilă - Descărcarea pe cardul SD extern nu este posibilă. Resetați locația folderului de descărcare\? + Descărcarea pe cardul SD extern nu este posibilă. Resetați locația folderului de descărcare? Se obțin informații… Se încarcă conținutul solicitat Redenumiți Setați ca miniatura listei de redare - Ștergeți această listă de redare\? + Ștergeți această listă de redare? Miniatura listei de redare a fost schimbată. Fără subtitrări Potrivire @@ -301,7 +300,7 @@ Citește Politica de confidențialitate Nu s-au putut citi filele salvate, deci se folosesc cele implicite Restaurați valorile implicite - Doriți să restaurați valorile implicite\? + Doriți să restaurați valorile implicite? Numărul de abonați nu este disponibil Ce file vor fi afișate pe pagina principală Conferințe @@ -321,7 +320,7 @@ Marcați lista de redare Limitați rezoluția atunci când utilizați datele mobile Acordați permisiunea de a afișa peste alte aplicații - Ștergeți toate pozițiile din playback\? + Ștergeți toate pozițiile din playback? Ștergeți toate pozițiile de redare Videoclipuri Instanța există deja @@ -348,7 +347,7 @@ YouTube oferă un „Mod restricționat” care ascunde conținutul potențial matur Activați „Modul restricționat” de pe YouTube Afișați conținut posibil nepotrivit pentru copii, deoarece are o limită de vârstă (cum ar fi 18+) - Adresa URL nu a putut fi recunoscută. Deschideți cu o altă aplicație\? + Adresa URL nu a putut fi recunoscută. Deschideți cu o altă aplicație? Afișează informațiile meta Faceți ca Android să personalizeze culoarea notificării în funcție de culoarea principală din miniatură (rețineți că aceasta nu este disponibilă pe toate dispozitivele) Colorează notificarea @@ -375,20 +374,8 @@ De %s Creat de %s Miniatura de avatar a canalului - Acest conținut nu este încă acceptat de NewPipe. -\n -\nSperăm că va fi acceptat într-o versiune viitoare. - Credeți că încărcarea fluxului este prea lentă\? Dacă da, încercați să activați încărcarea rapidă (puteți schimba acest lucru în setări sau apăsând butonul de mai jos). -\n -\nNewPipe oferă două strategii de încărcare a fluxului: -\n• Preluarea întregului canal de abonament, care este lent, dar complet. -\n• Utilizarea unui punct final de serviciu dedicat, care este rapid, dar de obicei nu este complet. -\n -\nDiferența dintre cele două este că în cazul celei rapide lipsesc de obicei unele informații, cum ar fi durata sau tipul articolului (nu poate face distincția între videoclipurile live și cele normale) și poate returna mai puține articole. -\n -\nYouTube este un exemplu de serviciu care oferă această metodă rapidă prin intermediul fluxului său RSS. -\n -\nAșadar, alegerea se reduce la ceea ce preferați: rapiditate sau informații precise. + Acest conținut nu este încă acceptat de NewPipe. \n \nSperăm că va fi acceptat într-o versiune viitoare. + Credeți că încărcarea fluxului este prea lentă? Dacă da, încercați să activați încărcarea rapidă (puteți schimba acest lucru în setări sau apăsând butonul de mai jos). \n \nNewPipe oferă două strategii de încărcare a fluxului: \n• Preluarea întregului canal de abonament, care este lent, dar complet. \n• Utilizarea unui punct final de serviciu dedicat, care este rapid, dar de obicei nu este complet. \n \nDiferența dintre cele două este că în cazul celei rapide lipsesc de obicei unele informații, cum ar fi durata sau tipul articolului (nu poate face distincția între videoclipurile live și cele normale) și poate returna mai puține articole. \n \nYouTube este un exemplu de serviciu care oferă această metodă rapidă prin intermediul fluxului său RSS. \n \nAșadar, alegerea se reduce la ceea ce preferați: rapiditate sau informații precise. Dezactivați modul rapid Activați modul rapid Disponibilă în unele servicii, este, de obicei, mult mai rapidă, dar poate returna un număr limitat de articole și adesea informații incomplete (de exemplu, fără durată, fără tipul de articol, fără stare în direct) @@ -399,7 +386,7 @@ Flux Se afișează numai abonamentele negrupate Nou - Doriți să ștergeți acest grup\? + Doriți să ștergeți acest grup? Numele grupului este gol %d selectat @@ -438,8 +425,7 @@ Alegeți o instanță „Storage Access Framework” permite descărcări pe un card SD extern Utilizați selectorul de dosare de sistem (SAF) - Veți fi întrebat unde să salvați fiecare descărcare. -\nActivați selectorul de foldere de sistem (SAF) dacă doriți să descărcați pe un card SD extern + Veți fi întrebat unde să salvați fiecare descărcare. \nActivați selectorul de foldere de sistem (SAF) dacă doriți să descărcați pe un card SD extern Întrebați unde să descărcați Întrerupeți descărcările Numărul maxim de încercări @@ -463,7 +449,7 @@ Numărul maxim de încercări înainte de a anula descărcarea Opriți Ștergeți fișierele descărcate - Doriți să ștergeți istoricul descărcărilor sau să ștergeți toate fișierele descărcate\? + Doriți să ștergeți istoricul descărcărilor sau să ștergeți toate fișierele descărcate? Șterge istoricul descărcărilor Nu se poate recupera această descărcare Conexiunea a expirat @@ -512,16 +498,13 @@ Afișați o notificare pentru a solicita actualizarea aplicației atunci când este disponibilă o nouă versiune Actualizări Fără limită - Pentru a respecta Regulamentul general european privind protecția datelor (GDPR), vă atragem atenția asupra politicii de confidențialitate a NewPipe. Vă rugăm să o citiți cu atenție. -\nTrebuie să o acceptați pentru a ne trimite raportul de eroare. + Pentru a respecta Regulamentul general european privind protecția datelor (GDPR), vă atragem atenția asupra politicii de confidențialitate a NewPipe. Vă rugăm să o citiți cu atenție. \nTrebuie să o acceptați pentru a ne trimite raportul de eroare. Resetare Etapă Înaintare rapidă în timpul tăcerii Decuplați (poate provoca distorsiuni) Înălțime - Rețineți că această operațiune poate fi costisitoare în rețea. -\n -\nContinuați\? + Rețineți că această operațiune poate fi costisitoare în rețea. \n \nContinuați? ID-ul dvs., soundcloud.com/yourid Importați un profil SoundCloud introducând fie URL-ul, fie ID-ul dvs: \n \n1. Activați „modul desktop” într-un browser web (site-ul nu este disponibil pentru dispozitive mobile) \n2. Mergeți la acest URL: %1$s \n3. Conectați-vă atunci când vi se cere \n4. Copiați URL-ul profilului la care ați fost redirecționat. Importați abonamentele YouTube din Google takeout: \n \n1. Mergeți la această adresă URL: %1$s \n2. Autentificați-vă atunci când vi se cere \n3. Faceți clic pe „Toate datele incluse”, apoi pe „Deselectați totul”, apoi selectați doar „Abonamente” și faceți clic pe „OK” \n4. Faceți clic pe „Pasul următor” și apoi pe „Creați exportul” \n5. Faceți clic pe butonul „Descărcare” după ce acesta apare \n6. Faceți clic pe IMPORT FIȘIER de mai jos și selectați fișierul .zip descărcat \n7. [În cazul în care importul .zip eșuează] Extrageți fișierul .csv (de obicei sub „YouTube and YouTube Music/subscriptions/subscriptions.csv”), faceți clic pe IMPORT FIȘIER de mai jos și selectați fișierul csv extras @@ -571,8 +554,7 @@ Rezolvați Evidențiate Mai jos poți selecta tema de noapte preferată - Acest videoclip este restricționat în funcție de vârstă. -\nDin cauza noilor politici YouTube privind videoclipurile cu restricții de vârstă, NewPipe nu poate accesa niciunul dintre fluxurile sale video și, prin urmare, nu îl poate reda. + Acest videoclip este restricționat în funcție de vârstă. \nDin cauza noilor politici YouTube privind videoclipurile cu restricții de vârstă, NewPipe nu poate accesa niciunul dintre fluxurile sale video și, prin urmare, nu îl poate reda. Descărcarea a început Selectați tema de noapte preferată — %s Automată (tema dispozitivului) @@ -609,9 +591,7 @@ Acum puteți selecta text în interiorul descrierii. Rețineți că este posibil ca pagina să pâlpâie, iar linkurile să nu poată fi accesate în modul de selecție. Contul a fost închis Modul rapid nu furnizează mai multe informații în acest sens. - Contul autorului a fost închis. -\nNewPipe nu va mai putea încărca acest flux în viitor. -\nDoriți să vă dezabonați de la acest canal\? + Contul autorului a fost închis. \nNewPipe nu va mai putea încărca acest flux în viitor. \nDoriți să vă dezabonați de la acest canal? Nu s-a putut încărca fluxul pentru „%s”. Eroare la încărcarea fluxului Începând cu Android 10, este acceptat doar „Storage Access Framework” @@ -667,7 +647,7 @@ Frecvența verificării Conexiune de rețea necesară Orice rețea - Ștergeți toate fișierele descărcate de pe disc\? + Ștergeți toate fișierele descărcate de pe disc? Notificările sunt dezactivate Procent Semiton @@ -677,10 +657,8 @@ Notificări Notificări despre noi fluxuri pentru abonamente Executați verificarea pentru fluxuri noi - Nu a fost găsit niciun manager de fișiere adecvat pentru această acțiune. -\nVă rugăm să instalați un manager de fișiere sau să încercați să dezactivați \'%s\' în setările de descărcare - Nu a fost găsit niciun manager de fișiere adecvat pentru această acțiune. -\nVă rugăm să instalați un manager de fișiere compatibil cu Storage Access Framework + Nu a fost găsit niciun manager de fișiere adecvat pentru această acțiune. \nVă rugăm să instalați un manager de fișiere sau să încercați să dezactivați \'%s\' în setările de descărcare + Nu a fost găsit niciun manager de fișiere adecvat pentru această acțiune. \nVă rugăm să instalați un manager de fișiere compatibil cu Storage Access Framework Primiți notificări V-ați abonat la acest canal Comutați toate @@ -709,9 +687,9 @@ Duplicat adăugat de %d ori Ignorați evenimentele generate de butoanele hardware de redare media Folositor, de exemplu, dacă folosești o cască cu butoane fizice defecte - Doriți să eliminați toate fluxurile dublate din această listă de redare\? + Doriți să eliminați toate fluxurile dublate din această listă de redare? Eliminare dubluri - Eliminați dublurile\? + Eliminați dublurile? Afișează următoarele fluxuri Afișare/Ascundere fluxuri Vizionat complet @@ -727,8 +705,7 @@ descriptiv Distribuiți lista URL Distribuiți cu titluri - %1$s -\n%2$s + %1$s \n%2$s Filele canalului Volum Utilizați funcția de rezervă a decodorului din ExoPlayer diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 64e7bcb95..fd5df953a 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -16,7 +16,7 @@ Введите путь к папке для скачивания видео Разрешение по умолчанию Воспроизвести в Kodi - Приложение Kore не найдено, установить\? + Приложение Kore не найдено, установить? Показать опцию «Воспроизвести в Kodi» Показать опцию воспроизведения через медиацентр Kodi Аудио @@ -88,8 +88,7 @@ Очистить Всё Что:\nЗапрос:\nЯзык контента:\nСтрана контента:\nЯзык приложения:\nСервис:\nВремя по Гринвичу:\nПакет:\nВерсия пакета:\nВерсия ОС: - Это разрешение нужно для -\nвоспроизведения в окне + Это разрешение нужно для \nвоспроизведения в окне Открыть во всплывающем окне Выберите отображаемые предложения поиска Отключено @@ -149,24 +148,27 @@ %s подписчик %s подписчика %s подписчиков + %s подписчиков Нет просмотров %s просмотр %s просмотра %s просмотров + %s просмотров Нет видео %s видео %s видео - %s видео - %s видео + %s видео + %s видео %s новое видео %s новых видео %s новых видео + %s новых видео Удалить этот элемент из истории поиска? Главная страница @@ -254,7 +256,7 @@ На миниатюру плейлиста Сохранить плейлист Удалить плейлист - Удалить плейлист\? + Удалить плейлист? Плейлист создан Добавлено в плейлист Миниатюра плейлиста изменена. @@ -275,25 +277,10 @@ Предыдущий экспорт Не удалось импортировать подписки Не удалось экспортировать подписки - Импортируйте подписки YouTube с помощью Google Takeout: -\n -\n1. Перейдите по ссылке: %1$s -\n2. Авторизуйтесь, если потребуется -\n3. Отметьте пункт «YouTube и YouTube Music», затем выберите тип «подписки» -\n4. Нажмите «Далее» и «Создать экспорт» -\n5. Нажмите кнопку «Скачать», когда она появится -\n6. Нажмите ИМПОРТ ФАЙЛА внизу и выберите скачанный ZIP-архив -\n7. [Если импортировать ZIP-файл не удалось] Из скачанного ZIP-архива распакуйте CSV-файл (обычно это «YouTube и YouTube Music/подписки/подписки.csv»), нажмите ИМПОРТ ФАЙЛА и выберите этот CSV-файл - Импортируйте профиль SoundCloud, введя его URL или ID: -\n -\n1. Включите «Версия для ПК» в браузере (сайт не поддерживается мобильными устройствами) -\n2. Перейдите по ссылке %1$s -\n3. Авторизуйтесь, если потребуется -\n4. Скопируйте URL профиля из адресной строки. + Импортируйте подписки YouTube с помощью Google Takeout: \n \n1. Перейдите по ссылке: %1$s \n2. Авторизуйтесь, если потребуется \n3. Отметьте пункт «YouTube и YouTube Music», затем выберите тип «подписки» \n4. Нажмите «Далее» и «Создать экспорт» \n5. Нажмите кнопку «Скачать», когда она появится \n6. Нажмите ИМПОРТ ФАЙЛА внизу и выберите скачанный ZIP-архив \n7. [Если импортировать ZIP-файл не удалось] Из скачанного ZIP-архива распакуйте CSV-файл (обычно это «YouTube и YouTube Music/подписки/подписки.csv»), нажмите ИМПОРТ ФАЙЛА и выберите этот CSV-файл + Импортируйте профиль SoundCloud, введя его URL или ID: \n \n1. Включите «Версия для ПК» в браузере (сайт не поддерживается мобильными устройствами) \n2. Перейдите по ссылке %1$s \n3. Авторизуйтесь, если потребуется \n4. Скопируйте URL профиля из адресной строки. вашID, soundcloud.com/вашID - Это действие может вызвать большой расход трафика. -\n -\nПродолжить? + Это действие может вызвать большой расход трафика. \n \nПродолжить? Кэш изображений очищен Очистить кэш метаданных Кэш метаданных очищен @@ -307,23 +294,21 @@ Субтитры Изменить размер текста и стиль субтитров. Нужен перезапуск Очистить историю - Удалить всю историю просмотров\? + Удалить всю историю просмотров? История просмотров удалена Очистить запросы поиска Удалить все запросы поиска Удалить историю воспроизведённых потоков и позиции воспроизведения - Удалить всю историю поиска\? + Удалить всю историю поиска? История поиска удалена 1 элемент удалён. NewPipe - свободное программное обеспечение, распространяемое на условиях копилефта. Вы можете свободно использовать, изучать, распространять и улучшать его. В частности, NewPipe можно распространять и/или изменять на условиях Стандартной общественной лицензии GNU, опубликованной Фондом свободного программного обеспечения, версии 3 либо, по вашему выбору, любой более поздней версии. При открытии ссылки Хотите импортировать настройки? Политика конфиденциальности NewPipe - Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никакие данные без вашего согласия. -\nПолитика конфиденциальности подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях. + Проект NewPipe очень серьёзно относится к вашей конфиденциальности. Приложение не собирает никакие данные без вашего согласия. \nПолитика конфиденциальности подробно объясняет, какие данные обрабатываются и хранятся при отправке отчёта о сбоях. Ознакомиться с политикой конфиденциальности - В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. -\nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке. + В соответствии с Общим регламентом по защите данных ЕС (GDPR), обращаем ваше внимание на политику конфиденциальности NewPipe. Пожалуйста, внимательно ознакомьтесь с ней. \nВам необходимо принять её условия, чтобы отправить нам отчёт об ошибке. Принять Отклонить Без ограничений @@ -344,11 +329,11 @@ Список Сетка Автоматически - Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки\? + Загрузка на SD-карту невозможна. Сбросить расположение папки загрузки? Внешнее хранилище недоступно Вкладки, видимые на главной странице Значения по умолчанию - Восстановить значения по умолчанию\? + Восстановить значения по умолчанию? Ошибка чтения сохранённых вкладок. Используются вкладки по умолчанию Количество подписчиков недоступно Выберите вкладку @@ -404,19 +389,18 @@ NewPipe была закрыта во время работы над файлом Закончилось свободное место на устройстве Прогресс потерян, так как файл был удалён - Действительно удалить историю загрузок и загруженные файлы\? + Действительно удалить историю загрузок и загруженные файлы? Ограничить очередь загрузки Только одна одновременная загрузка Начать загрузку Приостановить загрузку Запрашивать папку загрузки - Для каждой загрузки запрашивать папку для сохранения. -\nВключите системный выбор папки (SAF), если хотите загружать на внешнюю SD-карту + Для каждой загрузки запрашивать папку для сохранения. \nВключите системный выбор папки (SAF), если хотите загружать на внешнюю SD-карту Системный выбор папки (SAF) «Storage Access Framework» позволяет сохранять файлы на внешнюю SD-карту Очистить позиции воспроизведения Удалить все позиции воспроизведения - Удалить все позиции воспроизведения\? + Удалить все позиции воспроизведения? Переключение сервисов, сейчас выбрано: Киоск по умолчанию Никто не смотрел @@ -424,12 +408,14 @@ %s зритель %s зрителя %s зрителей + %s зрителей Нет слушателей %s слушатель %s слушателя %s слушателей + %s слушателей Шаг перемотки Серверы PeerTube @@ -459,6 +445,7 @@ %d секунда %d секунды %d секунд + %d секунд Из-за ограничений ExoPlayer точность перемотки составляет %d секунд Отключить звук @@ -476,18 +463,21 @@ %d день %d дня %d дней + %d дней %d час %d часа %d часов + %d часов %d минута %d минуты %d минут + %d минут - Удалить эту группу\? + Удалить эту группу? Не загружено: %d Создать Обычный режим @@ -499,26 +489,12 @@ Обновлять всегда Подписки не выбраны Группы каналов - Если подписки обновляются слишком медленно, попробуйте быстрый режим (включите в настройках или кнопкой внизу). -\n -\nNewPipe может обновлять подписки двумя способами: -\n• получение канала целиком, медленное, с полными сведениями; -\n• обновление по RSS, быстрое, с потерей сведений. -\n -\nПри быстром обновлении теряются длительность элемента и его тип (трансляция или обычное видео), могут быть получены не все элементы канала. -\n -\nКак пример, YouTube поддерживает быстрое обновление. -\n -\nВыбор за вами: скорость или точность. + Если подписки обновляются слишком медленно, попробуйте быстрый режим (включите в настройках или кнопкой внизу). \n \nNewPipe может обновлять подписки двумя способами: \n• получение канала целиком, медленное, с полными сведениями; \n• обновление по RSS, быстрое, с потерей сведений. \n \nПри быстром обновлении теряются длительность элемента и его тип (трансляция или обычное видео), могут быть получены не все элементы канала. \n \nКак пример, YouTube поддерживает быстрое обновление. \n \nВыбор за вами: скорость или точность. Получать из выделенной ленты, когда доступно Доступно для некоторых сервисов, быстрое, может возвращать не всё содержимое канала и не содержать часть сведений (длительность, статус трансляции) Период актуальности подписок после обновления — %s - Это видео имеет возрастное ограничение. -\n -\nВключите «%1$s» в настройках, если хотите его видеть. - NewPipe не поддерживает этот контент. -\n -\nВозможно, поддержка появится в следующих версиях. + Это видео имеет возрастное ограничение. \n \nВключите «%1$s» в настройках, если хотите его видеть. + NewPipe не поддерживает этот контент. \n \nВозможно, поддержка появится в следующих версиях. ∞ видео 100+ видео Треки @@ -546,7 +522,7 @@ Только по Wi-Fi Автовоспроизведение — %s Очередь воспроизведения - Не удалось распознать URL. Открыть в другом приложении\? + Не удалось распознать URL. Открыть в другом приложении? Авто-очередь Очередь активного плеера будет заменена Подтверждать очистку очереди @@ -602,8 +578,7 @@ Выберите предпочтительную ночную тему — %s Автоматически (тема устройства) Радио - Это видео имеет возрастные ограничения. -\nСогласно новой политике YouTube в отношении видео с возрастными ограничениями NewPipe не может иметь доступ ни к одному потоку этого видео и, таким образом, не может воспроизвести его. + Это видео имеет возрастные ограничения. \nСогласно новой политике YouTube в отношении видео с возрастными ограничениями NewPipe не может иметь доступ ни к одному потоку этого видео и, таким образом, не может воспроизвести его. Ночная тема Популярное Решить @@ -626,9 +601,7 @@ Сервер Доступность В быстром режиме обновления подробности об этом не предоставляются. - Аккаунт автора отключён. -\nNewPipe не сможет загружать эту подписку в будущем. -\nОтписаться от этого канала\? + Аккаунт автора отключён. \nNewPipe не сможет загружать эту подписку в будущем. \nОтписаться от этого канала? Не удалось загрузить подписку \'%s\'. Ошибка загрузки подписки Открыть веб-сайт @@ -691,16 +664,14 @@ Произошла ошибка, подробнее в уведомлении Показать снэк-бар с ошибкой Показать уведомление об ошибке - Не найден подходящий для этого действия файловый менеджер. -\nУстановите файловый менеджер, или попробуйте отключить \'%s\' в настройках загрузок - Не найден подходящий для этого действия файловый менеджер. -\nУстановите файловый менеджер, совместимый с Storage Access Framework + Не найден подходящий для этого действия файловый менеджер. \nУстановите файловый менеджер, или попробуйте отключить \'%s\' в настройках загрузок + Не найден подходящий для этого действия файловый менеджер. \nУстановите файловый менеджер, совместимый с Storage Access Framework Закреплённый комментарий LeakCanary недоступна Стандартное значение ExoPlayer Загрузка сведений о трансляции… Проверить наличие новых трансляций - Удалить все загруженные файлы\? + Удалить все загруженные файлы? Уведомление плеера , Полутон @@ -734,9 +705,9 @@ Полностью просмотрено Предстоящие Удалить дубликаты - Удалить дубликаты\? + Удалить дубликаты? Частично просмотрено - Удалить все дубликаты потоков в этом плейлисте\? + Удалить все дубликаты потоков в этом плейлисте? Жест для левой стороны экрана плеера Действие жеста слева Жест для правой стороны экрана плеера @@ -763,9 +734,7 @@ Звуковая дорожка уже должна присутствовать в этом потоке Выберите звуковую дорожку для внешних проигрывателей Включите этот параметр, если у вас есть проблемы с инициализацией декодера, который возвращается к декодерам с более низким приоритетом в случае сбоя инициализации основных декодеров. Это может привести к ухудшению качества воспроизведения по сравнению с использованием первичных декодеров - Этот обходной путь освобождает и повторно создаёт видеокодеки при изменении поверхности вместо того, чтобы напрямую устанавливать поверхность для кодека. Уже используется ExoPlayer на некоторых устройствах с этой проблемой, этот параметр влияет только на устройства с Android 6 и выше -\n -\nВключение этого параметра может предотвратить ошибки воспроизведения при переключении текущего видеоплеера или переключении в полноэкранный режим + Этот обходной путь освобождает и повторно создаёт видеокодеки при изменении поверхности вместо того, чтобы напрямую устанавливать поверхность для кодека. Уже используется ExoPlayer на некоторых устройствах с этой проблемой, этот параметр влияет только на устройства с Android 6 и выше \n \nВключение этого параметра может предотвратить ошибки воспроизведения при переключении текущего видеоплеера или переключении в полноэкранный режим Переместить основные вкладки в нижнюю часть экрана Положение основных вкладок Нет стримов @@ -778,8 +747,7 @@ Какие вкладки отображаются на страницах каналов Поделиться списком URL-адресов Поделиться названиями - %1$s -\n%2$s + %1$s \n%2$s Вкладки канала Shorts Загрузка метаданных… @@ -829,11 +797,8 @@ Нет Резервное копирование и восстановление Сбросить настройки - NewPipe может автоматически проверять наличие обновлений и уведомить вас, когда они будут доступны. -\nЖелаете включить эту функцию? - Сброс всех настроек приведёт к сбросу всех ваших настроек и перезапуску приложения. -\n -\nВы уверены, что хотите продолжить? + NewPipe может автоматически проверять наличие обновлений и уведомить вас, когда они будут доступны. \nЖелаете включить эту функцию? + Сброс всех настроек приведёт к сбросу всех ваших настроек и перезапуску приложения. \n \nВы уверены, что хотите продолжить? Настройки в импортируемом экспорте используют уязвимый формат, который устарел с версии NewPipe 0.27.0. Убедитесь, что импортируемый экспорт получен из надёжного источника, и в будущем предпочтительнее использовать только экспорт, полученный из NewPipe 0.27.0 или новее. Поддержка импорта настроек в этом уязвимом формате скоро будет полностью удалена, и тогда старые версии NewPipe больше не смогут импортировать настройки из экспорта из новых версий. вторичный Поделиться как временным плейлистом YouTube diff --git a/app/src/main/res/values-ryu/strings.xml b/app/src/main/res/values-ryu/strings.xml index f5b40be83..1de18aec1 100644 --- a/app/src/main/res/values-ryu/strings.xml +++ b/app/src/main/res/values-ryu/strings.xml @@ -9,7 +9,7 @@ ダウンロード きんさく しってい - むしかしてぃ: 「%1$s」\? + むしかしてぃ: 「%1$s」? ちゅーゆーいん ちゃーしがふずんするフォルダー ダウンロードさどぅうがくまんかいふずんさびーん @@ -84,8 +84,7 @@ ブラック まじり ポップアップモードっしふぃらちゅん - ポップアップモードっしふぃらちゅんがー -\nきんぎんぬきょかがふぃちようでぃす + ポップアップモードっしふぃらちゅんがー \nきんぎんぬきょかがふぃちようでぃす ポップアップモードっしさいせいちゅう んーか デフォルトぬちゃーがけいしき @@ -264,8 +263,7 @@ てぃーちぬアイテムぬさちゅるじょさりやびたん。 しーいんすん - NewPipeプロジェクトーうんじゅがプライバシーふぃじょうにてーしちなちょーいびーん。うんじゅがちゃーいがねーんかぎり、アプレーいかなるデータんしゅうしゅうさびらん。 -\nNewPipeぬプライバシー・ポリシーっしぇー、クラッシュリポートそうしんじんかいちゃぬぐとーるしゅるいぬデータぬあんしん・きるくされいがしーょうさいにしちめいそーいびーん。 + NewPipeプロジェクトーうんじゅがプライバシーふぃじょうにてーしちなちょーいびーん。うんじゅがちゃーいがねーんかぎり、アプレーいかなるデータんしゅうしゅうさびらん。 \nNewPipeぬプライバシー・ポリシーっしぇー、クラッシュリポートそうしんじんかいちゃぬぐとーるしゅるいぬデータぬあんしん・きるくされいがしーょうさいにしちめいそーいびーん。 NewPipeーコピーレフトなソフトウェアやいびーん。うんじょーじゆうにうりさし、きんきゅうしー、きょうゆうし、あんしがいじんするくとぅがなやびーん。うんじょー、GNUフリーソフトウェアじぇーやんんがかんかいすん GNU General Publicライセンスバージョン3いかぬむとぅんかい、じゆうにさえーいーん・しゅうせいうくないるくとぅがなやびーん。 さいしゅうさいせいにちじ むっとぅむさいせいさったんちゃーしが @@ -284,15 +282,7 @@ じどうせいせい プレーヤーぬキャプションテキストぬしーゅくしゃくとぅはいけいスタイルへいるかんさびーん。ゆうこうなすんがー、アプリぬさいきちゃーがふぃちようやいびーん ぬーんあいびらん - Google takeoutからYouTubeぬとぅうるいちゅるリストインポート: -\n -\n1. くぬURLふぃらちゃびーん: %1$s -\n2. ログインしうぅらんだれーログインさびーん -\n3. \"まじりしんたく\" クリックしー、あんし \"しんたくまじりかいじょ\" クリック、あんし \"んでぃうるいちゅるチャンネル\" ぬみしんたくし、\"OK\" クリック -\n4. \"ちぎぬステップ\" クリックしー、あんし \"エクスポートさくせい\" クリック -\n5. ひょうじされいねー \"ダウンロード\" ボタンクリック -\n6. ファイルからインポートクリックしダウンロードさるzipファイルしんたく -\n7.(インポートぬしーやんじねー)csvファイル(たいてい、\"YouTubeとぅYouTube Music/とぅうるいちゅるチャンネル/とぅうるいちゅるチャンネル.csv\" んかいあん)ちゅうさゅちし、ファイルからインポートクリックしてぃちゅうしゅちしたcsvファイルしんたく + Google takeoutからYouTubeぬとぅうるいちゅるリストインポート: \n \n1. くぬURLふぃらちゃびーん: %1$s \n2. ログインしうぅらんだれーログインさびーん \n3. \"まじりしんたく\" クリックしー、あんし \"しんたくまじりかいじょ\" クリック、あんし \"んでぃうるいちゅるチャンネル\" ぬみしんたくし、\"OK\" クリック \n4. \"ちぎぬステップ\" クリックしー、あんし \"エクスポートさくせい\" クリック \n5. ひょうじされいねー \"ダウンロード\" ボタンクリック \n6. ファイルからインポートクリックしダウンロードさるzipファイルしんたく \n7.(インポートぬしーやんじねー)csvファイル(たいてい、\"YouTubeとぅYouTube Music/とぅうるいちゅるチャンネル/とぅうるいちゅるチャンネル.csv\" んかいあん)ちゅうさゅちし、ファイルからインポートクリックしてぃちゅうしゅちしたcsvファイルしんたく リセット ちゃーいすん きょふぃする @@ -306,16 +296,9 @@ メモリリークぬかんしぇー、ヒープダンピングじんかいアプリぬむはんのうになるぎんいんとぅなやびーん ライフサイクルエラーぬほうくーく はきさったるフラグメントあらんでぃアクティビティぬ、ライフサイクルはんいぬいでぃのーいしんふぬうなRxれいがいちーょうせいてぃきにほうくくさびーん - URLあらんでぃIDんかいゅうりょくしてぃSoundCloudプロファイルインポートさびーん:: -\n -\n1. Webブラウザーっし \"デスクトップモード\" ゆうこうなさびーん(サイトーけいたいデバイスでぃりようなやびらん) -\n2. くぬURLんかいうぅいちゃーさびーん: %1$s -\n3. ふぃちぐとぅうぅーじてぃログインさびーん -\n4. リダイレクトさったるプロファイルURLコピーさびーん。 + URLあらんでぃIDんかいゅうりょくしてぃSoundCloudプロファイルインポートさびーん:: \n \n1. Webブラウザーっし \"デスクトップモード\" ゆうこうなさびーん(サイトーけいたいデバイスでぃりようなやびらん) \n2. くぬURLんかいうぅいちゃーさびーん: %1$s \n3. ふぃちぐとぅうぅーじてぃログインさびーん \n4. リダイレクトさったるプロファイルURLコピーさびーん。 うんじゅがID, soundcloud.com/うんじゅがid - くぬあしっさにゆりちうしんりょうきんがかじゅーいるくとぅがあいびーん。ぐちゅういください。 -\n -\nずっこうさびーが? + くぬあしっさにゆりちうしんりょうきんがかじゅーいるくとぅがあいびーん。ぐちゅういください。 \n \nずっこうさびーが? とうるくさゃすう すくどぅとぅうんていりんちゃーさじんかいへいるかん(ゆがむんかむしりやびらん) むうんぬあいだにはやうくり @@ -330,8 +313,7 @@ きていぬしっていふちゅるぎんさびーが? とうるくさゃすうはりようでぃきましん がいぎ - ヨーロッパぬいちぱんデータふぐきせい(GDPR)にじゅんきょしーんたみに、NewPipeぬくじんじょうほうふぐほうしんにぐちゅういください。ゆーゆでぃくぃみそーれー。 -\nわったーんかいふぐあいほうくーくうくいんでー、くりうけいりらんだれーなやびらん。 + ヨーロッパぬいちぱんデータふぐきせい(GDPR)にじゅんきょしーんたみに、NewPipeぬくじんじょうほうふぐほうしんにぐちゅういください。ゆーゆでぃくぃみそーれー。 \nわったーんかいふぐあいほうくーくうくいんでー、くりうけいりらんだれーなやびらん。 アプリぬこうしん リストビューモード リスト @@ -397,8 +379,7 @@ ダウンロードぬかいし ダウンロードぬいちじていし ダウンロードさきたんにいん - ダウンロードぬたびにふずんすーしょたんにやびーん。 -\nSDカードんかいダウンロードさるいばあえーシステムフォルダピッカー(SAF)ゆーいるこうかさびーん + ダウンロードぬたびにふずんすーしょたんにやびーん。 \nSDカードんかいダウンロードさるいばあえーシステムフォルダピッカー(SAF)ゆーいるこうかさびーん システムフォルダピッカー(SAF)しようすん ストレージアクセスフレームワークー、がいぶSDカードんかいぬダウンロードぬかのうやいびーん さいせいいちのさくじょ @@ -485,28 +466,14 @@ いくちがぬサービスっしりようかのう。ちうじーょうゆりむこうすくでぃすがせいぎんさりたじょうほうがしゅとぅくさり、たいていぬばあいふかんじんやいびーん(れい: さいせいじがん、しーゅるい、ライブステータスんでーがねーん) こうすくモードゆーいんかんが こうすくモードんーかなやー - フィードぬゆみくみがにーしじーんでぃうむやびーが?うぬばあい、こうすくゆみくみゆーいるこうかしんーちくぃみそーれー(しってい、あらんでぃしちゃぬボタンうしてぃへんかんするくとぅがなやびーん)。 -\n -\nNewPipeーたーちぬゆみくみほうほうていきょうさびーん: -\n・とうるいちゅるチャンネルじんたいしゅとぅくさびーん。くれーていすくやいびーしがかんじんやいびーん。 -\n・しんようぬサービスエンドポイントしーようさびーん。くれーこうすくやいびーしが、たいていぬばあいふかんじんやいびーん。 -\n -\nたーちぬちがいとぅしてぃ、こうすくなむのーちうじょう、さいせいじがんてぃがろーしーゅるい(ライブんでぃちうじーょうぬどうがをくびちでぃきない)んでーぬじょうほうがふすくしてぃ、ただしいーょうぬじょうほうゆりすくなくしゅとぅくするくとぅがあいびーん。 -\n -\nYouTubeー、くぬこうすくやーゆみくみほうほうRSSフィードっしていきょうするサービスぬてぃーちやいびーん。 -\n -\nちまり、ゆみくみほうほうぬしんたくはすくどぅあらんでぃゆいかくさぬどぅちらゆーいるしんすが、うんじゅがしちがゆやびーん。 + フィードぬゆみくみがにーしじーんでぃうむやびーが?うぬばあい、こうすくゆみくみゆーいるこうかしんーちくぃみそーれー(しってい、あらんでぃしちゃぬボタンうしてぃへんかんするくとぅがなやびーん)。 \n \nNewPipeーたーちぬゆみくみほうほうていきょうさびーん: \n・とうるいちゅるチャンネルじんたいしゅとぅくさびーん。くれーていすくやいびーしがかんじんやいびーん。 \n・しんようぬサービスエンドポイントしーようさびーん。くれーこうすくやいびーしが、たいていぬばあいふかんじんやいびーん。 \n \nたーちぬちがいとぅしてぃ、こうすくなむのーちうじょう、さいせいじがんてぃがろーしーゅるい(ライブんでぃちうじーょうぬどうがをくびちでぃきない)んでーぬじょうほうがふすくしてぃ、ただしいーょうぬじょうほうゆりすくなくしゅとぅくするくとぅがあいびーん。 \n \nYouTubeー、くぬこうすくやーゆみくみほうほうRSSフィードっしていきょうするサービスぬてぃーちやいびーん。 \n \nちまり、ゆみくみほうほうぬしんたくはすくどぅあらんでぃゆいかくさぬどぅちらゆーいるしんすが、うんじゅがしちがゆやびーん。 ∞ぬちゃーしが 100いじょうぬちゃーしが - くぬコンテンツーなーらNewPipeっしサポートさりやびらん。 -\n -\nくんぐぬバージョンっしサポートさりーんかむしりやびらん。 + くぬコンテンツーなーらNewPipeっしサポートさりやびらん。 \n \nくんぐぬバージョンっしサポートさりーんかむしりやびらん。 きょく アーティスト アルバム - くぬちゃーがんかいはにーるれいうぅいゆいぎんぬあいびーん。 -\n -\nいちらんさるいばあい、しっていから \"%1$s\" ゆーいるこうかしみそーれー。 + くぬちゃーがんかいはにーるれいうぅいゆいぎんぬあいびーん。 \n \nいちらんさるいばあい、しっていから \"%1$s\" ゆーいるこうかしみそーれー。 プレイリストんかいちいからさりーるめーんちいからさったるあとぅんしちょうさんちゃーしがはプレイリストからさくじょさりやびーん。 \nゆたさいびーが?くぬあしっさーむとぅんかいむどぅしやびらん! はい、ぶぶんてぃちーがしちょうさんちゃーしがんさちゅるじょさびーん しちょうじみぬちゃーしがさちゅるじょさびーが? @@ -579,8 +546,7 @@ くれーSoundCloud Go+トラックやくとぅ、すくなくとぅむうんじゅがくにっしぇー、NewPipeっしぇーストリーミングてぃがろーダウンロードぬなやびらん。 くぬコンテンツー、うすんまいぬくにっしぇーぐりよういただきやびらん。 アプリぬクラッシュ - くぬちゃーがはにーるれいうぅいゆいぎんぬあいびーん。 -\nされいせいぎんちきちゃーがくくむんみーさるYouTubeポリシーにゆり、NewPipeーちゃーがストリームんかいアクセスならんたみさいせいうぅいなやびらん。 + くぬちゃーがはにーるれいうぅいゆいぎんぬあいびーん。 \nされいせいぎんちきちゃーがくくむんみーさるYouTubeポリシーにゆり、NewPipeーちゃーがストリームんかいアクセスならんたみさいせいうぅいなやびらん。 いかからうくぬみぬやっくゎんテーマさんたくなやびーん じちゃー(デバイスぬテーマ) うくぬみぬやっくゎんテーマしんたく — %s @@ -615,9 +581,7 @@ しちめいぶんぬテキストぬしんたくゆうこうなすん なましちめいぶんぬテキストさんたくなやびーん。しんたくモードちゅおーページぬちらちちゃいリンクぬクリックならんなたいしーんくとぅんかいちゅういしみそーれー。 ていしさったるアカウント - くぬとうこうしゃぬアカウントーていしさりとーいびーん。 -\nNewPipeーしーょうらいてぃきにくぬフィードゆみくみらんなやびーん。 -\nくぬチャンネルぬとぅうるいちゅんこーいじょさびーが? + くぬとうこうしゃぬアカウントーていしさりとーいびーん。 \nNewPipeーしーょうらいてぃきにくぬフィードゆみくみらんなやびーん。 \nくぬチャンネルぬとぅうるいちゅんこーいじょさびーが? オフ オン タブレットモード @@ -655,10 +619,8 @@ エラーぬはっせいさびたん(タップしーねーほうくーくなやびーん) スナックバーんかいエラーひょうじ くていさったるコメント - くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん。 -\nStorage Access Frameworkとぅぐかんゆいぬあんファイルマネージャインストールしみそーれー - くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん -\nファイルマネージャインストールすが、ダウンロードしっていっし \'%s\' んーかなするくとぅうたみしくぃみそーれー + くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん。 \nStorage Access Frameworkとぅぐかんゆいぬあんファイルマネージャインストールしみそーれー + くぬちゃーさうぅてぃくしーちやーファイルマネージャぬみちかやびらんたん \nファイルマネージャインストールすが、ダウンロードしっていっし \'%s\' んーかなするくとぅうたみしくぃみそーれー プレイヤーしようじんかいクラッシュオプションひょうじ エラーちうちさくせい エラーほうくーくすんちうち @@ -742,9 +704,7 @@ オーディオトラックーしでぃにくぬししらぎんかいすんじぇーそーるふぃちようがあいびーん うちかいぬデバイスぬモデルっしぇーメディアトンネリングぬサポートさりてぃうぅらんたみ、くぬデバイスっしぇーメディアトンネリングぬデフォルトっしんーかなとーいびーん。 デコーダぬしーむんだいぬあーあえー、くぬオプションゆーいるこうかしプライマリデコーダしーょきかしっぺーじにふぃくいゆうしんどぅぬデコーダんかいフォールバックさびーん。プライマリデコーダしようじやかパフォーマンスぬあっかすがのうゆいがあいびーん - くぬかいきちさこーちょくしちコーデックサーフェスんかいしっていしーんかわりんかい、サーフェスぬへいるかんさったるさいんかいえいぞうコーデックかいほうしさいインスタンスがさびーん。しでぃにいくちがぬデバイスっしくぬかいきちさくぬささりとーいびーしが、Android 6いくてぃぬみちぬーさびーん -\n -\nくぬオプションゆーいるこうかしーんくとぅっしプレイヤーきりけーたい、フルスクリーンんかいきりけーたいしーんさいぬさいせいエラーふしじゃびーん + くぬかいきちさこーちょくしちコーデックサーフェスんかいしっていしーんかわりんかい、サーフェスぬへいるかんさったるさいんかいえいぞうコーデックかいほうしさいインスタンスがさびーん。しでぃにいくちがぬデバイスっしくぬかいきちさくぬささりとーいびーしが、Android 6いくてぃぬみちぬーさびーん \n \nくぬオプションゆーいるこうかしーんくとぅっしプレイヤーきりけーたい、フルスクリーンんかいきりけーたいしーんさいぬさいせいエラーふしじゃびーん ふきけー ExoPlayerぬしっていかんりさびーん。くりらぬへんかんはんえいすんがープレイヤーぬさいきちゃーがふぃちようやいびーん ちゃーExoPlayerぬえいぞうしーゅちりょくサーフェスしっていぬかいきちさくしようすん @@ -793,8 +753,7 @@ サムネイル URLリストっしちゅーゆーいん タイトルちきっしちゅーゆーいん - %1$s -\n%2$s + %1$s \n%2$s プレイリストちゅーゆーいん - %1$s: %2$s @@ -805,15 +764,12 @@ ひょうじいきらくすん いかぬちうちアクションタップしへんしゅうさびーん。さいしょぬみーちぬアクション (さいせい/いちじていし、めーんかい、ちぎんかい)ーシステムにゆってぃしっていさりてぃうぅい、カスタマイズすしぇーなやびらん。 はい - NewPipeーてぃんじちーがみーさるバージョンじちゃーてぃきんかいチェックしー、こうしんがのうないるとぅちうちさびーん。 -\nゆうこうなさびーが? + NewPipeーてぃんじちーがみーさるバージョンじちゃーてぃきんかいチェックしー、こうしんがのうないるとぅちうちさびーん。 \nゆうこうなさびーが? デバイスぬあきゆういょうがふすくそーいびーん うぅーうぅー バックアップとぅふくぎん しっていリセット まじりぬしっていデフォルトじょうたいんかいリセットさびーん - まじりぬしっていリセットしーねー、ゆーいるしんしっていぬまじりはちされい、アプリぬさいきちゃーさびーん。 -\n -\nずっこうさびーが? + まじりぬしっていリセットしーねー、ゆーいるしんしっていぬまじりはちされい、アプリぬさいきちゃーさびーん。 \n \nずっこうさびーが? インポートさりとーるエクスポートぬしってえー、NewPipe 0.27.0いこおーふぃするいしょうでぃあったけいしきしーようさびーん。 インポートさりとーるエクスポートーしんらいないるじょうほうぎんからでぃあり、しょうらいていちがーNewPipe 0.27.0がくりやかみーさるバージョンからいらりーるエクスポートぬみゆーいるしんししようさびーん。 くぬぜいじゃくやるけいしきっししっていインポートするたみぬたいおおーちゃーきかんじんにさくじょされい、みーさるバージョンからエクスポートぬしっていインポートすしぇーなやびらん。 diff --git a/app/src/main/res/values-sat/strings.xml b/app/src/main/res/values-sat/strings.xml index 4f376cdfb..4be285e70 100644 --- a/app/src/main/res/values-sat/strings.xml +++ b/app/src/main/res/values-sat/strings.xml @@ -11,11 +11,11 @@ ᱮᱦᱚᱵ ᱞᱟᱹᱜᱤᱫ ᱢᱮᱜᱽᱱᱤᱯᱷᱟᱭᱤᱝ ᱜᱽᱞᱟᱥ ᱨᱮ ᱚᱛᱟᱭ ᱢᱮ ᱾ ᱵᱟᱦᱨᱮ ᱣᱤᱰᱤᱭᱚ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱮᱵᱷᱟᱨ ᱢᱮ ᱛᱮᱞᱟ ᱫᱮᱠᱷᱟᱣᱜᱽ ᱠᱟᱱᱟᱺ%s - ᱟᱢᱟᱜ ᱚᱨᱛᱷᱚ \"%1$s\" ᱥᱮ\? + ᱟᱢᱟᱜ ᱚᱨᱛᱷᱚ \"%1$s\" ᱥᱮ? ᱥᱴᱨᱤᱢ ᱨᱮᱫ ᱰᱟᱩᱱᱞᱳᱰ ᱢᱮ ᱯᱚᱯᱚᱯ ᱢᱳᱰ ᱨᱮ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ ᱚᱠᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ (ᱟᱢ VLC ᱯᱞᱮᱭᱟᱹᱨ ᱵᱚᱦᱟᱞ ᱠᱟᱛᱮ ᱚᱱᱟ ᱨᱮ ᱯᱞᱮ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱢ)᱾ - ᱚᱠᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ ᱾ VLC ᱵᱚᱦᱟᱞ ᱟᱢ ᱥᱮ\? + ᱚᱠᱟ ᱥᱴᱨᱤᱢ ᱯᱞᱮᱭᱟᱹᱨ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ ᱾ VLC ᱵᱚᱦᱟᱞ ᱟᱢ ᱥᱮ? %1$s ᱨᱮ ᱩᱪᱷᱟᱹᱱ ᱮᱱᱟ ᱥᱟᱹᱵᱥᱠᱨᱟᱭᱤᱵᱽ ᱟᱹᱱᱥᱟᱹᱵᱥᱠᱨᱟᱭᱤᱵᱽ @@ -44,7 +44,7 @@ Kodi ᱥᱟᱞᱟᱜ ᱪᱟᱹᱞᱩᱭ ᱢᱮ ᱠᱷᱟᱹᱞᱤ ᱛᱤᱱᱟᱹᱝ ᱜᱟᱱ ᱥᱟᱫᱷᱚᱱ ᱢᱮᱱᱟᱜᱼᱟ ᱚᱠᱟ ᱫᱚ 2K/4K ᱣᱤᱰᱤᱭᱚ ᱠᱚ ᱪᱟᱹᱞᱩ ᱫᱟᱲᱮᱭᱟᱜᱼᱟᱭ ᱥᱟᱞᱟᱜ ᱠᱷᱩᱞᱟᱹᱭ ᱢᱮ - Kore ᱮᱯ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ, ᱵᱚᱦᱟᱞ ᱟ ᱥᱮ\? + Kore ᱮᱯ ᱵᱟᱭ ᱧᱟᱢ ᱞᱮᱱᱟ, ᱵᱚᱦᱟᱞ ᱟ ᱥᱮ? Kodi ᱢᱮᱰᱤᱭᱟ ᱯᱞᱮᱭᱟᱹᱨ ᱛᱮ ᱣᱤᱰᱤᱭᱚ ᱯᱞᱮ ᱨᱮᱭᱟᱜ ᱚᱯᱥᱚᱱ ᱫᱮᱠᱷᱟᱣᱢᱮ \"Kodi ᱛᱮ ᱪᱟᱹᱞᱩ\" ᱚᱯᱥᱚᱱ ᱫᱮᱠᱷᱟᱣᱢᱮ ᱱᱚᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱠᱚᱞᱚᱨ ᱠᱟᱜ ᱢᱮ @@ -99,8 +99,7 @@ ᱵᱟᱦᱨᱮ ᱮᱱᱮᱡᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱟᱠᱟᱱ ᱯᱷᱚᱨᱢᱮᱴ ᱵᱟᱹᱱᱩᱜᱼᱟ ᱫᱟᱜ - ᱱᱚᱶᱟ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_ -\nᱯᱚᱯ-ᱟᱯ ᱢᱚᱰ ᱨᱮ ᱮᱛᱦᱚᱵ ᱢᱮ + ᱱᱚᱶᱟ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_ \nᱯᱚᱯ-ᱟᱯ ᱢᱚᱰ ᱨᱮ ᱮᱛᱦᱚᱵ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱥᱟᱦᱟᱣ ᱟᱠᱟᱱᱟ \"Done\" ᱚᱞ ᱢᱮ ᱨᱩᱣᱟ. ᱠᱤᱭᱳᱥᱠ ᱵᱟᱪᱷᱟᱣ ᱢᱮ @@ -120,12 +119,7 @@ ᱟᱢᱟᱜ ᱚᱱᱚᱞ ᱨᱮ ᱢᱤᱰᱤᱭᱟ ᱴᱩᱱᱮᱞᱤᱝ ᱫᱚ ᱰᱤᱯᱚᱞᱴ ᱞᱮᱠᱟᱛᱮ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱱᱟ ᱪᱮᱫᱟᱜ ᱥᱮ ᱟᱢᱟᱜ ᱚᱱᱚᱞ ᱢᱚᱰᱮᱞ ᱱᱚᱶᱟ ᱵᱟᱭ ᱥᱚᱦᱚᱫᱟ ᱾ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱵᱚᱫᱚᱞ ᱢᱮ ᱢᱤᱫ error ᱥᱱᱮᱠᱵᱟᱨ ᱧᱮᱞ ᱢᱮ - URL ᱥᱮ ᱟᱢᱟᱜ ID ᱚᱞ ᱠᱟᱛᱮᱜ ᱢᱤᱫ SoundCloud ᱯᱨᱚᱯᱷᱟᱭᱤᱞ ᱮᱢ ᱢᱮ:_x000D_ -\n_x000D_ -\n1. ᱢᱤᱫ ᱣᱮᱵᱽ-ᱵᱽᱨᱟᱣᱡᱚᱨ ᱨᱮ \"ᱰᱮᱥᱠᱴᱚᱯ ᱢᱳᱰ\" ᱮᱱᱮᱡ ᱢᱮ (ᱡᱚᱵᱮᱛᱟᱨᱮ ᱢᱚᱵᱟᱭᱤᱞ ᱰᱤᱵᱟᱤᱥ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱧᱟᱢᱚᱜᱼᱟ)_x000D_ -\n2. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s_x000D_ -\n3. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_ -\n4. ᱟᱢ ᱚᱠᱟ ᱨᱮ ᱥᱮᱞᱮᱫ ᱞᱮᱱᱟᱢ ᱚᱱᱟ ᱯᱨᱚᱯᱷᱟᱭᱤᱞ URL ᱠᱚᱯᱤ ᱢᱮ. + URL ᱥᱮ ᱟᱢᱟᱜ ID ᱚᱞ ᱠᱟᱛᱮᱜ ᱢᱤᱫ SoundCloud ᱯᱨᱚᱯᱷᱟᱭᱤᱞ ᱮᱢ ᱢᱮ:_x000D_ \n_x000D_ \n1. ᱢᱤᱫ ᱣᱮᱵᱽ-ᱵᱽᱨᱟᱣᱡᱚᱨ ᱨᱮ \"ᱰᱮᱥᱠᱴᱚᱯ ᱢᱳᱰ\" ᱮᱱᱮᱡ ᱢᱮ (ᱡᱚᱵᱮᱛᱟᱨᱮ ᱢᱚᱵᱟᱭᱤᱞ ᱰᱤᱵᱟᱤᱥ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱧᱟᱢᱚᱜᱼᱟ)_x000D_ \n2. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s_x000D_ \n3. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ_x000D_ \n4. ᱟᱢ ᱚᱠᱟ ᱨᱮ ᱥᱮᱞᱮᱫ ᱞᱮᱱᱟᱢ ᱚᱱᱟ ᱯᱨᱚᱯᱷᱟᱭᱤᱞ URL ᱠᱚᱯᱤ ᱢᱮ. ᱯᱞᱮᱵᱮᱠ ᱥᱯᱤᱰ ᱠᱚᱱᱴᱨᱚᱞ ᱴᱮᱢᱯᱳ ᱵᱚᱫᱚᱞ ᱢᱮ (ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ) @@ -134,7 +128,7 @@ ᱮᱠᱥᱮᱯᱴ ᱱᱟᱣᱟ ᱥᱴᱨᱚᱢ ᱨᱮᱭᱟᱜ ᱠᱷᱚᱵᱚᱨ ᱪᱟᱪᱞᱟᱣ ᱚᱵᱚᱥᱛᱟ - ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱧᱮᱞ ᱢᱮ + ᱱᱟᱣᱟ ᱥᱟᱦᱴᱟ ᱧᱮᱞ ᱢᱮ ᱛᱷᱟᱯᱚᱱ ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱟᱱᱟᱜ ᱢᱤᱫ ᱯᱷᱤᱞ ᱢᱮᱱᱟᱜᱼᱟ ᱱᱚᱶᱟ ᱧᱩᱛᱩᱢ ᱟᱱ ᱢᱤᱫ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ ᱯᱷᱤᱞ ᱢᱮᱱᱟᱜᱼᱟ @@ -173,9 +167,7 @@ ᱰᱤᱵᱩᱜ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱵᱟᱰᱟᱭ ᱛᱷᱚᱠ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ - ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱮᱨ ᱦᱟᱹᱴᱤᱧ ᱠᱟᱱᱟ._x000D_ -\n_x000D_ -\nᱡᱩᱫᱤ ᱟᱢ ᱱᱚᱶᱟ ᱧᱮᱞᱢᱮ ᱠᱷᱟᱱ ᱟᱢᱟᱜ ᱥᱤᱴᱤᱝ ᱨᱮ %1$s\" ᱚᱞ ᱢᱮ ᱾\" + ᱱᱚᱶᱟ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱮᱨ ᱦᱟᱹᱴᱤᱧ ᱠᱟᱱᱟ._x000D_ \n_x000D_ \nᱡᱩᱫᱤ ᱟᱢ ᱱᱚᱶᱟ ᱧᱮᱞᱢᱮ ᱠᱷᱟᱱ ᱟᱢᱟᱜ ᱥᱤᱴᱤᱝ ᱨᱮ %1$s\" ᱚᱞ ᱢᱮ ᱾\" ᱰᱟᱩᱱᱞᱚᱰ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱞᱵᱚᱢ @@ -277,9 +269,7 @@ ᱤᱢᱯᱳᱨᱴ ᱯᱷᱤᱞ ᱢᱟᱲᱟᱝ ᱮᱠᱥᱯᱚᱨᱴ ᱥᱚᱵᱥᱠᱨᱤᱯᱥᱚᱱ ᱮᱢ ᱫᱟᱲᱮᱭᱟᱜ ᱵᱟᱝ ᱠᱟᱱᱟ - \"ᱱᱚᱶᱟ ᱚᱯᱨᱮᱥᱚᱱ ᱨᱮ ᱱᱮᱴᱣᱟᱨᱠ ᱰᱷᱮᱨ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱢᱮᱱᱛᱮ ᱢᱟᱱᱟᱣ ᱢᱮ ᱾\" -\n -\nᱟᱢ ᱫᱚ ᱪᱮᱫ ᱮᱢ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ?\" + \"ᱱᱚᱶᱟ ᱚᱯᱨᱮᱥᱚᱱ ᱨᱮ ᱱᱮᱴᱣᱟᱨᱠ ᱰᱷᱮᱨ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱢᱮᱱᱛᱮ ᱢᱟᱱᱟᱣ ᱢᱮ ᱾\" \n \nᱟᱢ ᱫᱚ ᱪᱮᱫ ᱮᱢ ᱪᱟᱞᱟᱜ ᱠᱟᱱᱟ?\" ᱨᱤᱥᱮᱴ ᱥᱮᱢᱤᱴᱚᱱ ᱰᱷᱮᱨᱚᱜ @@ -364,8 +354,7 @@ \? ᱥᱮᱨᱮᱧ ᱛᱟᱹᱞᱠᱟᱹ ᱮᱢ ᱧᱩᱛᱩᱢ ᱥᱟᱶ ᱮᱱᱮᱢ ᱢᱮ - %1$s -\n%2$s + %1$s \n%2$s ᱟᱨᱦᱚᱸ ᱧᱮᱞ ᱢᱮ ᱠᱚᱢ ᱧᱮᱞ ᱢᱮ ᱛᱟᱹᱞᱠᱟᱹ ᱪᱟᱪᱞᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱮᱢ ᱢᱮ @@ -420,8 +409,7 @@ ᱚᱛᱱᱚᱜ ᱪᱤᱛᱟᱹᱨ ᱠᱷᱚᱸᱫᱽᱨᱚᱸᱫᱽ ᱥᱟᱯᱲᱟᱣ ᱜᱤᱫᱨᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱠᱟᱛᱷᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ ᱪᱮᱫᱟᱜ ᱥᱮ ᱱᱚᱣᱟ ᱨᱮ ᱢᱤᱫ ᱩᱢᱮᱨ ᱞᱤᱢᱤᱴ ᱢᱮᱱᱟᱜᱼᱟ (ᱡᱮᱞᱮᱠᱟ ᱑᱘+) ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱫ \"Restricted Mode\" ᱮᱢᱚᱜᱼᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱯᱚᱴᱮᱱᱥᱤᱭᱟᱞ ᱢᱚᱰᱩᱞ ᱠᱚᱱᱴᱮᱱᱴ (mature content) ᱫᱚᱦᱚᱭᱟ - ᱱᱤᱭᱟᱹ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱚᱨ ᱞᱟᱹᱜᱤᱫ ᱜᱮ᱾_x000D_ -\nᱭᱩᱴᱭᱩᱵᱽ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮᱱᱟᱜ ᱩᱢᱮᱨ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱱᱟᱣᱟ ᱯᱳᱞᱤᱥᱤ ᱠᱷᱟᱹᱛᱤᱨ, ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯᱷ ᱫᱚ ᱟᱡᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱡᱟᱦᱟᱸᱭ ᱦᱚᱸ ᱥᱮᱴᱮᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱵᱟᱝ ᱟᱨ ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱯᱞᱮᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ + ᱱᱤᱭᱟᱹ ᱵᱷᱤᱰᱤᱭᱳ ᱫᱚ ᱩᱢᱚᱨ ᱞᱟᱹᱜᱤᱫ ᱜᱮ᱾_x000D_ \nᱭᱩᱴᱭᱩᱵᱽ ᱨᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮᱱᱟᱜ ᱩᱢᱮᱨ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱱᱟᱣᱟ ᱯᱳᱞᱤᱥᱤ ᱠᱷᱟᱹᱛᱤᱨ, ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯᱷ ᱫᱚ ᱟᱡᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱴᱨᱤᱢ ᱨᱮᱱᱟᱜ ᱡᱟᱦᱟᱸᱭ ᱦᱚᱸ ᱥᱮᱴᱮᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱵᱟᱝ ᱟᱨ ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱯᱞᱮᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ ᱡᱤᱣᱤ ᱠᱷᱮᱞᱚᱸᱰᱤᱭᱟᱹ ᱠᱚ ᱵᱷᱤᱰᱤᱭᱳ @@ -537,18 +525,9 @@ ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱞᱟᱹᱜᱤᱫ ᱪᱟᱪᱞᱟᱣ ᱢᱮ ᱢᱤᱫ error notification ᱛᱮᱭᱟᱨ ᱢᱮ ᱥᱮᱞᱮᱫ ᱮᱠᱥᱯᱳᱨᱴ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ - \"ᱜᱩᱜᱩᱞ ᱴᱮᱠᱟᱣᱩᱴ ᱠᱷᱚᱱ ᱭᱩᱴᱭᱩᱵᱽ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽᱥ ᱤᱱᱯᱳᱨᱴ ᱢᱮ: -\n -\n1. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s -\n2. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ -\n3. \"\'All data included\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \"\'Deselect all\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \"\'subscriptions\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ \"\'OK\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ -\n4. \"Next step\" ᱨᱮ ᱟᱨ ᱚᱱᱟ ᱛᱟᱭᱚᱢ \"Create export\" ᱨᱮ ᱞᱤᱱ ᱢᱮ -\n5. ᱱᱚᱶᱟ ᱧᱮᱞ ᱛᱟᱭᱚᱢ \"\"Download\"\" ᱵᱩᱴᱚᱱ ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ -\n6. ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ . zip ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ -\n7. ᱡᱩᱫᱤ .zip ᱤᱱᱯᱷᱚᱨᱴ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱵᱟᱝ ᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ .csv ᱯᱷᱤᱞ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱢᱮ (\"ᱭᱩᱴᱭᱩᱵᱽ ᱟᱨ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ.ᱥᱤᱵᱷ\" ᱨᱮ), ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ ᱟᱨ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱟᱠᱟᱱ csv ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ + \"ᱜᱩᱜᱩᱞ ᱴᱮᱠᱟᱣᱩᱴ ᱠᱷᱚᱱ ᱭᱩᱴᱭᱩᱵᱽ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽᱥ ᱤᱱᱯᱳᱨᱴ ᱢᱮ: \n \n1. ᱱᱚᱶᱟ URL ᱨᱮ ᱪᱟᱞᱟᱜ ᱢᱮ: %1$s \n2. ᱞᱚᱜᱤᱱ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ \n3. \"\'All data included\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \"\'Deselect all\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ, ᱛᱟᱭᱚᱢ \"\'subscriptions\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ \"\'OK\"\' ᱨᱮ ᱞᱤᱱ ᱢᱮ \n4. \"Next step\" ᱨᱮ ᱟᱨ ᱚᱱᱟ ᱛᱟᱭᱚᱢ \"Create export\" ᱨᱮ ᱞᱤᱱ ᱢᱮ \n5. ᱱᱚᱶᱟ ᱧᱮᱞ ᱛᱟᱭᱚᱢ \"\"Download\"\" ᱵᱩᱴᱚᱱ ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ \n6. ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱞᱤᱱ ᱢᱮ ᱟᱨ ᱰᱟᱩᱱᱞᱚᱰ ᱟᱠᱟᱱ . zip ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ \n7. ᱡᱩᱫᱤ .zip ᱤᱱᱯᱷᱚᱨᱴ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱵᱟᱝ ᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ .csv ᱯᱷᱤᱞ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱢᱮ (\"ᱭᱩᱴᱭᱩᱵᱽ ᱟᱨ ᱭᱩᱴᱭᱩᱵᱽ ᱢᱤᱣᱡᱤᱠ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ/ᱥᱵᱽᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ.ᱥᱤᱵᱷ\" ᱨᱮ), ᱞᱟᱛᱟᱨ ᱨᱮ IMPORT FILE ᱨᱮ ᱠᱞᱤᱠ ᱢᱮ ᱟᱨ ᱮᱠᱥᱴᱨᱟᱠᱴ ᱟᱠᱟᱱ csv ᱯᱷᱤᱞ ᱵᱟᱪᱷᱟᱣ ᱢᱮ yourID, soundcloud.com/yourid - \"ᱤᱭᱩᱨᱚᱯᱤᱭᱚ ᱡᱚᱡᱚᱱᱟ ᱯᱨᱚᱫᱚᱭᱚᱜᱤᱠᱤ (ᱡᱤ.ᱰᱤ.ᱯᱤ.ᱟᱨ.) ᱥᱟᱞᱟᱜ ᱥᱚᱢᱵᱚᱸᱫᱷ ᱞᱟᱹᱜᱤᱫ ᱛᱮ, ᱱᱚᱣᱟ ᱦᱚᱛᱮᱛᱮ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱨᱮᱭᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱟᱵᱚᱣᱟᱜ ᱟᱫᱷᱤᱱᱤᱭᱚᱢ ᱠᱚ ᱩᱫᱩᱜ ᱦᱚᱪᱚᱭᱟ। ᱱᱚᱶᱟ ᱫᱚ ᱞᱟᱹᱭᱛᱮ ᱯᱟᱲᱦᱟᱣ ᱢᱮ ᱾ -\nᱟᱢ ᱫᱚ ᱱᱚᱶᱟ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱢᱮ ᱡᱮ ᱟᱢ ᱵᱷᱤᱜᱽ ᱨᱮᱯᱳᱨᱴ ᱮᱢ ᱢᱮ ᱾\" + \"ᱤᱭᱩᱨᱚᱯᱤᱭᱚ ᱡᱚᱡᱚᱱᱟ ᱯᱨᱚᱫᱚᱭᱚᱜᱤᱠᱤ (ᱡᱤ.ᱰᱤ.ᱯᱤ.ᱟᱨ.) ᱥᱟᱞᱟᱜ ᱥᱚᱢᱵᱚᱸᱫᱷ ᱞᱟᱹᱜᱤᱫ ᱛᱮ, ᱱᱚᱣᱟ ᱦᱚᱛᱮᱛᱮ ᱱᱤᱭᱩ ᱯᱟᱭᱤᱯ ᱨᱮᱭᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱟᱵᱚᱣᱟᱜ ᱟᱫᱷᱤᱱᱤᱭᱚᱢ ᱠᱚ ᱩᱫᱩᱜ ᱦᱚᱪᱚᱭᱟ। ᱱᱚᱶᱟ ᱫᱚ ᱞᱟᱹᱭᱛᱮ ᱯᱟᱲᱦᱟᱣ ᱢᱮ ᱾ \nᱟᱢ ᱫᱚ ᱱᱚᱶᱟ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱢᱮ ᱡᱮ ᱟᱢ ᱵᱷᱤᱜᱽ ᱨᱮᱯᱳᱨᱴ ᱮᱢ ᱢᱮ ᱾\" ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱮᱥᱚᱱ ᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱟᱰᱟᱭ ᱢᱮ ᱚᱯᱰᱮᱴᱥ ᱡᱚᱠᱷᱚᱱ ᱱᱟᱣᱟ ᱵᱟᱨᱥᱚᱱ ᱢᱮᱱᱟᱜ-ᱟ ᱮᱯ ᱟᱯᱰᱮᱴ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱹᱛᱭᱟᱹᱣ ᱵᱚᱫᱚᱞ ᱢᱮ @@ -578,8 +557,7 @@ ᱢᱚᱵᱟᱤᱞ ᱰᱟᱴᱟ ᱨᱮ ᱵᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ ᱵᱮᱵᱚᱦᱟᱨᱚᱜ ᱟ, ᱢᱮᱱᱠᱷᱟᱱ ᱛᱤᱱᱟᱹᱜ ᱜᱟᱱ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ ᱟ ᱢᱤᱫᱴᱟᱹᱝ ᱰᱟᱩᱱᱞᱚᱰ ᱢᱤᱫ ᱚᱠᱛᱚ ᱨᱮ ᱪᱟᱞᱟᱜᱼᱟ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱵᱚᱫᱚᱞ ᱢᱮ - ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱡᱟᱦᱟᱸ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ ᱚᱱᱟ ᱟᱢᱮᱢ ᱩᱫᱩᱜᱟ._x000D_ -\nᱡᱩᱫᱤ ᱟᱢ ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱠᱴᱤᱵᱷ ᱢᱮ + ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱠᱚ ᱡᱟᱦᱟᱸ ᱨᱮ ᱫᱚᱦᱚᱭ ᱢᱮ ᱚᱱᱟ ᱟᱢᱮᱢ ᱩᱫᱩᱜᱟ._x000D_ \nᱡᱩᱫᱤ ᱟᱢ ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱠᱴᱤᱵᱷ ᱢᱮ ᱟᱢ ᱡᱟᱦᱟᱸ ᱨᱮ ᱡᱚᱛᱚ ᱰᱟᱩᱱᱞᱚᱰ ᱥᱟᱦᱴᱟ ᱠᱚ ᱵᱚᱫᱚᱞ ᱦᱚᱪᱚᱭ ᱢᱮ \'ᱥᱴᱚᱨᱮᱡᱽ ᱮᱠᱥᱮᱥ ᱯᱷᱨᱮᱢᱠᱣᱟᱨᱠ\' ᱢᱤᱫ ᱵᱟᱦᱨᱮ SD ᱠᱟᱨᱰ ᱨᱮ ᱰᱟᱩᱱᱞᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱢᱚᱜ ᱟ ᱚᱸᱰᱨᱚᱭᱮᱰ ᱑᱐ ᱠᱷᱚᱱ ᱮᱛᱚᱦᱚᱵ ᱠᱟᱛᱮ \'ᱥᱴᱳᱨᱮᱡ ᱮᱠᱥᱮᱥ ᱯᱷᱨᱮᱢᱚᱠ\' ᱜᱮ ᱥᱚᱯᱷᱚᱨᱴ ᱟᱠᱟᱱᱟ @@ -598,29 +576,15 @@ ᱢᱤᱫ ᱥᱚᱵᱥᱠᱨᱟᱭᱵᱽᱥᱚᱱ ᱵᱟᱥᱠᱮᱴᱮᱰ ᱦᱩᱭᱩᱜ ᱢᱟᱬᱟᱝ ᱨᱮ ᱯᱟᱹᱪᱷᱤᱢ ᱩᱫᱩᱜ ᱠᱷᱚᱱ ᱛᱟᱭᱚᱢ ᱚᱠᱛᱚ ⁇ %s Error loading feed ᱥᱟᱯᱲᱟᱣ \'%s\' ᱞᱟᱹᱜᱤᱫ ᱯᱷᱤᱰ ᱞᱚᱰ ᱵᱟᱝ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ. - ᱮᱠᱴᱚᱨᱟᱜ ᱮᱠᱟᱶᱴ ᱫᱚ ᱛᱷᱟᱯᱚᱱ ᱟᱠᱟᱱᱟ ᱾ -\nNewPipe ᱫᱚ ᱱᱚᱣᱟ ᱯᱷᱤᱰ ᱫᱚ ᱟᱵᱚ ᱦᱟᱵᱤᱡ ᱵᱟᱝ ᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ -\nᱟᱢ ᱱᱚᱣᱟ ᱪᱟᱱᱮᱨ ᱠᱷᱚᱱ ᱟᱹᱪᱩᱨ ᱚᱪᱚᱜ ᱠᱟᱹᱢᱤᱭᱟᱢ ᱥᱮ? + ᱮᱠᱴᱚᱨᱟᱜ ᱮᱠᱟᱶᱴ ᱫᱚ ᱛᱷᱟᱯᱚᱱ ᱟᱠᱟᱱᱟ ᱾ \nNewPipe ᱫᱚ ᱱᱚᱣᱟ ᱯᱷᱤᱰ ᱫᱚ ᱟᱵᱚ ᱦᱟᱵᱤᱡ ᱵᱟᱝ ᱞᱚᱰ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ \nᱟᱢ ᱱᱚᱣᱟ ᱪᱟᱱᱮᱨ ᱠᱷᱚᱱ ᱟᱹᱪᱩᱨ ᱚᱪᱚᱜ ᱠᱟᱹᱢᱤᱭᱟᱢ ᱥᱮ? ᱯᱷᱚᱥᱴ ᱯᱷᱤᱰ ᱢᱚᱰ ᱱᱚᱶᱟ ᱨᱮ ᱵᱟᱹᱲᱛᱤ ᱵᱟᱰᱟᱭ ᱮᱢ ᱮᱫᱟ ᱾ ᱡᱩᱫᱤ ᱢᱮᱱᱟᱜᱼᱟ ᱮᱢ ᱟᱠᱟᱱ ᱡᱚᱢᱟᱜ ᱠᱷᱚᱱ ᱦᱟᱛᱟᱣ ᱟᱭᱢᱟ ᱥᱮᱵᱟ ᱨᱮ ᱧᱟᱢᱚᱜᱼᱟ, ᱱᱚᱶᱟ ᱫᱚ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱟᱹᱰᱤ ᱦᱩᱰᱤᱧ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱢᱤᱫ ᱞᱮᱠᱟᱱ ᱤᱱᱴᱮᱢᱥ ᱟᱨ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱵᱟᱝ ᱯᱩᱨᱟᱹᱣ ᱟᱠᱟᱱ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ (ᱡᱮᱞᱮᱠᱟ ᱺ ᱚᱠᱛᱚ ᱵᱟᱝ, ᱤᱱᱴᱮᱢᱥ ᱨᱮᱱᱟᱜ ᱞᱮᱠᱷᱟ, ᱚᱞᱤᱵᱽ ᱥᱴᱮᱴᱥ ᱵᱟᱝ) ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱯᱷᱮᱥᱵᱩᱠ ᱢᱚᱰ ᱵᱚᱫᱚᱞ ᱢᱮ - ᱟᱢᱟᱜ ᱢᱚᱱᱮ ᱨᱮ ᱡᱚᱢᱟᱜ ᱨᱮᱱᱟᱜ ᱞᱚᱰ ᱟᱹᱰᱤ ᱟᱞᱜᱟ ᱜᱮᱭᱟ? ᱡᱩᱫᱤ ᱱᱚᱶᱟ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ, ᱮᱱᱠᱷᱟᱱ ᱥᱯᱤᱰ ᱞᱚᱰ ᱮᱱᱟᱝ ᱮᱱᱮᱡ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱢ ᱥᱤᱴᱤᱝ ᱨᱮ ᱥᱮ ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱵᱩᱛᱟᱹᱢ ᱚᱞ ᱠᱟᱛᱮᱢ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ) -\n -\nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱫᱚ ᱵᱟᱨᱭᱟ ᱯᱷᱤᱰ ᱞᱚᱰ ᱥᱴᱨᱮᱴᱡᱤ ᱮᱢᱚᱜ ᱠᱟᱱᱟ: -\n• ᱡᱚᱛᱚ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽ ᱪᱮᱱᱮᱞ ᱦᱟᱛᱟᱣ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱞᱜᱟ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱯᱩᱨᱟᱹᱣᱜᱼᱟ ᱾ -\n• ᱰᱮᱰᱤᱠᱮᱴᱮᱰ ᱥᱮᱵᱟ ᱮᱱᱰ ᱯᱚᱭᱮᱱᱴ ᱵᱮᱵᱷᱟᱨ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱦᱩᱲᱟᱹᱜ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱯᱩᱨᱟᱹᱣ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱩᱜᱼᱟ ᱾ -\n -\nᱵᱟᱨᱭᱟ ᱛᱟᱞᱟᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱫᱚ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱡᱮ ᱦᱩᱲᱟᱹᱜ ᱢᱤᱫᱴᱟᱹᱝ ᱜᱮ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ ᱵᱟᱹᱱᱩᱜᱼᱟ, ᱡᱮᱞᱮᱠᱟ ᱤᱢᱮᱠᱥ ᱨᱮᱱᱟᱜ ᱚᱠᱛᱚ ᱥᱮ ᱛᱷᱚᱠ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱞᱟᱭᱤᱵᱷᱤᱰᱤᱭᱳ ᱟᱨ ᱱᱚᱨᱢᱟᱞ ᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱵᱟᱭ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ) ᱟᱨ ᱱᱚᱶᱟ ᱠᱚᱢ ᱤᱢᱮᱠᱥ ᱠᱚ ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ -\n -\nᱭᱩᱴᱭᱩᱵᱽ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱥᱮᱵᱟ ᱨᱮᱱᱟᱜ ᱢᱤᱫ ᱞᱟᱹᱱᱟᱹᱤ ᱠᱟᱱᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱱᱚᱶᱟ ᱦᱚᱨᱟ ᱟᱡᱟᱜ RSS ᱯᱷᱤᱰ ᱥᱟᱶᱛᱮ ᱮᱢᱚᱜ ᱠᱟᱱᱟ ᱾ -\n -\nᱚᱱᱟᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱫᱚ ᱟᱢ ᱪᱮᱫ ᱜᱮᱢ ᱵᱷᱟᱹᱵᱤᱛᱟ: ᱦᱩᱲᱟᱹᱜ ᱟᱨᱵᱟᱝ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱠᱟᱛᱷᱟ ᱾ + ᱟᱢᱟᱜ ᱢᱚᱱᱮ ᱨᱮ ᱡᱚᱢᱟᱜ ᱨᱮᱱᱟᱜ ᱞᱚᱰ ᱟᱹᱰᱤ ᱟᱞᱜᱟ ᱜᱮᱭᱟ? ᱡᱩᱫᱤ ᱱᱚᱶᱟ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ, ᱮᱱᱠᱷᱟᱱ ᱥᱯᱤᱰ ᱞᱚᱰ ᱮᱱᱟᱝ ᱮᱱᱮᱡ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱢ ᱥᱤᱴᱤᱝ ᱨᱮ ᱥᱮ ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱵᱩᱛᱟᱹᱢ ᱚᱞ ᱠᱟᱛᱮᱢ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ) \n \nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱫᱚ ᱵᱟᱨᱭᱟ ᱯᱷᱤᱰ ᱞᱚᱰ ᱥᱴᱨᱮᱴᱡᱤ ᱮᱢᱚᱜ ᱠᱟᱱᱟ: \n• ᱡᱚᱛᱚ ᱥᱚᱵᱽᱥᱠᱨᱟᱭᱵᱽ ᱪᱮᱱᱮᱞ ᱦᱟᱛᱟᱣ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱞᱜᱟ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱯᱩᱨᱟᱹᱣᱜᱼᱟ ᱾ \n• ᱰᱮᱰᱤᱠᱮᱴᱮᱰ ᱥᱮᱵᱟ ᱮᱱᱰ ᱯᱚᱭᱮᱱᱴ ᱵᱮᱵᱷᱟᱨ, ᱡᱟᱦᱟᱸ ᱫᱚ ᱦᱩᱲᱟᱹᱜ ᱜᱮᱭᱟ ᱢᱮᱱᱠᱷᱟᱱ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱯᱩᱨᱟᱹᱣ ᱫᱚ ᱵᱟᱝ ᱦᱩᱭᱩᱜᱼᱟ ᱾ \n \nᱵᱟᱨᱭᱟ ᱛᱟᱞᱟᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱫᱚ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱡᱮ ᱦᱩᱲᱟᱹᱜ ᱢᱤᱫᱴᱟᱹᱝ ᱜᱮ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ ᱵᱟᱹᱱᱩᱜᱼᱟ, ᱡᱮᱞᱮᱠᱟ ᱤᱢᱮᱠᱥ ᱨᱮᱱᱟᱜ ᱚᱠᱛᱚ ᱥᱮ ᱛᱷᱚᱠ (ᱡᱟᱦᱟᱸ ᱫᱚ ᱞᱟᱭᱤᱵᱷᱤᱰᱤᱭᱳ ᱟᱨ ᱱᱚᱨᱢᱟᱞ ᱨᱮᱱᱟᱜ ᱵᱷᱮᱜᱟᱨ ᱵᱟᱭ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ) ᱟᱨ ᱱᱚᱶᱟ ᱠᱚᱢ ᱤᱢᱮᱠᱥ ᱠᱚ ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ \n \nᱭᱩᱴᱭᱩᱵᱽ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱥᱮᱵᱟ ᱨᱮᱱᱟᱜ ᱢᱤᱫ ᱞᱟᱹᱱᱟᱹᱤ ᱠᱟᱱᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱱᱚᱶᱟ ᱦᱚᱨᱟ ᱟᱡᱟᱜ RSS ᱯᱷᱤᱰ ᱥᱟᱶᱛᱮ ᱮᱢᱚᱜ ᱠᱟᱱᱟ ᱾ \n \nᱚᱱᱟᱛᱮ ᱵᱟᱪᱷᱟᱣ ᱫᱚ ᱟᱢ ᱪᱮᱫ ᱜᱮᱢ ᱵᱷᱟᱹᱵᱤᱛᱟ: ᱦᱩᱲᱟᱹᱜ ᱟᱨᱵᱟᱝ ᱥᱟᱹᱠᱷᱭᱟᱹᱛ ᱠᱟᱛᱷᱟ ᱾ ᱥᱴᱨᱤᱢ ᱠᱚ ᱵᱚᱫᱚᱞ/ᱥᱚᱫᱚᱨ ᱢᱮ ᱡᱚᱠᱷᱚᱱ ᱯᱷᱤᱰ ᱚᱯᱰᱮᱴ ᱦᱩᱭᱩᱜᱼᱟ, ᱚᱱᱟ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱴᱮᱵᱽ ᱠᱚ ᱦᱟᱛᱟᱣ ᱢᱮ ᱾ ᱡᱩᱫᱤ ᱢᱤᱫ ᱪᱮᱱᱮᱞ ᱫᱚ fast mode ᱵᱮᱵᱷᱟᱨ ᱠᱟᱛᱮ update ᱟᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ option ᱫᱚ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱾ - ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾_x000D_ -\n_x000D_ -\nᱱᱚᱶᱟ ᱫᱚ ᱢᱚᱵᱟᱤᱞ ᱣᱟᱨᱥᱚᱱ ᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱨ ᱦᱩᱭᱩᱜᱼᱟ ᱾ + ᱱᱩᱣᱟ ᱯᱟᱭᱤᱯ ᱱᱤᱛ ᱦᱟᱹᱵᱤᱡ ᱱᱚᱶᱟ ᱥᱟᱦᱴᱟᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾_x000D_ \n_x000D_ \nᱱᱚᱶᱟ ᱫᱚ ᱢᱚᱵᱟᱤᱞ ᱣᱟᱨᱥᱚᱱ ᱨᱮ ᱥᱚᱯᱷᱴᱣᱮᱨ ᱦᱩᱭᱩᱜᱼᱟ ᱾ ᱞᱚᱠ ᱥᱠᱨᱤᱱ ᱛᱷᱚᱠ ᱟᱨ ᱱᱳᱴᱤᱯᱷᱤᱠᱮᱥᱚᱱ ᱵᱟᱱᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱛᱚᱢᱱᱤᱞ ᱵᱮᱵᱷᱟᱨ ᱢᱮ ᱟᱢᱟᱜ ᱰᱤᱵᱟᱤᱥ ᱨᱮ ᱱᱚᱶᱟ ᱮᱯ ᱵᱟᱹᱱᱩᱜ-ᱟ ᱱᱚᱶᱟ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱫᱚ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱯᱷᱤᱞ ᱢᱮᱱᱮᱡᱚᱨ ᱵᱟᱝ ᱧᱟᱢ ᱞᱮᱱᱟ ᱾ %s @@ -656,9 +620,7 @@ ᱡᱟᱹᱥᱛᱤ ᱧᱮᱞ ᱟᱠᱟᱱᱟ ᱢᱟᱲᱟᱝ ᱨᱮ ᱡᱩᱫᱤ ᱟᱢᱟᱜ ᱰᱤᱠᱳᱰᱟᱨ ᱮᱛᱚᱦᱚᱵ ᱨᱮᱭᱟᱜ ᱞᱟᱹᱞᱤᱥ ᱛᱟᱦᱮᱸᱱᱟ, ᱮᱱᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱵᱟᱪᱷᱱᱟᱣ ᱫᱚ ᱮᱥᱮᱨ ᱢᱮ, ᱡᱟᱦᱟᱫᱚ ᱮᱛᱚᱦᱚᱵ ᱰᱤᱠᱳᱰᱟᱨ ᱮᱛᱚᱦᱚᱵ ᱵᱟᱝ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱞᱟᱛᱟᱨᱼᱯᱨᱳᱭᱨᱤᱴᱤ ᱰᱤᱠᱳᱰᱟᱨ ᱨᱮ ᱨᱩᱣᱟᱹᱲ ᱦᱮᱡᱚᱜᱼᱟ ᱾ ᱱᱚᱶᱟ ᱨᱮᱭᱟᱜ ᱚᱡᱮ ᱫᱚ ᱮᱛᱚᱦᱚᱵ ᱰᱤᱠᱳᱰᱟᱨ ᱠᱚ ᱵᱮᱣᱦᱟᱨ ᱚᱠᱛᱚ ᱠᱷᱚᱱ ᱵᱮᱼᱲᱤᱪᱟᱹᱲ ᱯᱟᱥᱱᱟᱶ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ - ᱱᱚᱶᱟ ᱠᱟᱹᱢᱤ ᱦᱚᱨᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱳᱰᱮᱠ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱨ ᱨᱤ-ᱤᱱᱥᱴᱟᱱᱥᱟᱭᱤᱴ (re-instantiates) ᱮᱫᱟ, ᱚᱱᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱠᱳᱰᱮᱠ ᱨᱮ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱥᱩᱯᱩᱨ ᱥᱩᱯᱩᱨ ᱛᱮ ᱥᱮᱴᱮᱨᱚᱜ ᱨᱮᱱᱟᱜ ᱠᱟᱱᱟ ᱾ ᱱᱚᱶᱟ ᱥᱟᱛᱟᱢ ᱥᱟᱶᱛᱮ ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱟᱭᱢᱟ ᱚᱱᱚᱞ ᱨᱮ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱱᱟ, ᱱᱚᱶᱟ ᱥᱤᱴᱤᱝ ᱫᱚ ᱟᱱᱰᱨᱚᱭᱮᱰ ᱖ ᱟᱨ ᱚᱱᱟ ᱠᱷᱚᱱ ᱪᱮᱛᱟᱱ ᱨᱮᱜᱮ ᱟᱯᱷᱮᱠᱴ ᱟᱠᱟᱱᱟ -\n -\nᱱᱮᱛᱟᱨᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ ᱥᱮ ᱯᱷᱩᱞᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱡᱚᱠᱷᱚᱱ ᱱᱚᱶᱟ ᱵᱟᱪᱷᱟᱣ ᱮᱢ ᱫᱚᱦᱚ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ + ᱱᱚᱶᱟ ᱠᱟᱹᱢᱤ ᱦᱚᱨᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱵᱚᱫᱚᱞ ᱦᱩᱭ ᱞᱮᱱ ᱠᱷᱟᱱ ᱵᱷᱤᱰᱤᱭᱳ ᱠᱳᱰᱮᱠ ᱠᱚ ᱵᱚᱫᱚᱞ ᱟᱨ ᱨᱤ-ᱤᱱᱥᱴᱟᱱᱥᱟᱭᱤᱴ (re-instantiates) ᱮᱫᱟ, ᱚᱱᱟ ᱫᱚ ᱥᱩᱨᱥᱩᱯᱩᱨ ᱠᱳᱰᱮᱠ ᱨᱮ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱥᱩᱯᱩᱨ ᱥᱩᱯᱩᱨ ᱛᱮ ᱥᱮᱴᱮᱨᱚᱜ ᱨᱮᱱᱟᱜ ᱠᱟᱱᱟ ᱾ ᱱᱚᱶᱟ ᱥᱟᱛᱟᱢ ᱥᱟᱶᱛᱮ ᱮᱠᱥᱳᱯᱞᱮᱭᱟᱨ ᱟᱭᱢᱟ ᱚᱱᱚᱞ ᱨᱮ ᱵᱮᱵᱷᱟᱨ ᱟᱠᱟᱱᱟ, ᱱᱚᱶᱟ ᱥᱤᱴᱤᱝ ᱫᱚ ᱟᱱᱰᱨᱚᱭᱮᱰ ᱖ ᱟᱨ ᱚᱱᱟ ᱠᱷᱚᱱ ᱪᱮᱛᱟᱱ ᱨᱮᱜᱮ ᱟᱯᱷᱮᱠᱴ ᱟᱠᱟᱱᱟ \n \nᱱᱮᱛᱟᱨᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱞᱮᱭᱟᱨ ᱥᱮ ᱯᱷᱩᱞᱥᱠᱨᱤᱱ ᱨᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱡᱚᱠᱷᱚᱱ ᱱᱚᱶᱟ ᱵᱟᱪᱷᱟᱣ ᱮᱢ ᱫᱚᱦᱚ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱪᱮᱱᱟᱞ ᱥᱟᱦᱴᱟ ᱠᱚᱨᱮ ᱪᱮᱫ ᱴᱮᱵᱽ ᱠᱚ ᱵᱚᱫᱚᱞᱟ ᱚᱯᱮᱱ ᱯᱞᱮ ᱠᱭᱩᱤ ᱡᱚᱛᱚ ᱥᱠᱨᱤᱱ ᱨᱮ ᱵᱷᱮᱡᱟ ᱢᱮ @@ -720,8 +682,7 @@ ᱞᱟᱭᱥᱮᱱᱥ ᱥᱮᱞᱮᱫᱚᱜ ᱢᱮ ᱱᱤᱭᱩ ᱯᱟᱭᱯᱮ ᱨᱮᱱᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴᱤ ᱯᱚᱞᱤᱥᱤ - ᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱯᱨᱚᱡᱮᱠᱴ ᱟᱢᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱟᱹᱰᱤ ᱥᱚᱨᱮᱥ ᱜᱮᱭᱟ. ᱚᱱᱟᱛᱮ, ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱟᱹᱱᱩᱜ ᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱡᱟᱦᱟᱱ ᱰᱮᱴᱟ ᱵᱟᱭ ᱥᱟᱢᱟᱝᱟ ᱾_x000D_ -\nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱨᱮᱱᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱰᱮᱴᱟ ᱠᱚ ᱟᱢ ᱠᱨᱮᱥᱚᱨ ᱨᱮᱯᱳᱨᱴ ᱚᱠᱟᱛᱮ ᱟᱢ ᱚᱠᱟ ᱞᱮᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱰᱮᱴᱟ ᱠᱚ ᱵᱚᱫᱚᱞᱟ ᱟᱨ ᱵᱚᱫᱚᱞᱟ ᱚᱱᱟ ᱵᱟᱵᱚᱫ ᱛᱮ ᱡᱚᱛᱚ ᱵᱟᱰᱟᱭ ᱮᱢᱚᱜ ᱟ᱾ + ᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱯᱨᱚᱡᱮᱠᱴ ᱟᱢᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱟᱹᱰᱤ ᱥᱚᱨᱮᱥ ᱜᱮᱭᱟ. ᱚᱱᱟᱛᱮ, ᱟᱢᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱟᱹᱱᱩᱜ ᱠᱷᱟᱱ ᱱᱚᱶᱟ ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱡᱟᱦᱟᱱ ᱰᱮᱴᱟ ᱵᱟᱭ ᱥᱟᱢᱟᱝᱟ ᱾_x000D_ \nᱱᱤᱣ ᱯᱟᱭᱤᱯ ᱨᱮᱱᱟᱜ ᱯᱨᱟᱭᱵᱷᱮᱴ ᱯᱚᱞᱤᱥᱤ ᱨᱮ ᱡᱟᱦᱟᱸᱱ ᱰᱮᱴᱟ ᱠᱚ ᱟᱢ ᱠᱨᱮᱥᱚᱨ ᱨᱮᱯᱳᱨᱴ ᱚᱠᱟᱛᱮ ᱟᱢ ᱚᱠᱟ ᱞᱮᱠᱟᱛᱮ ᱟᱢᱟᱜ ᱰᱮᱴᱟ ᱠᱚ ᱵᱚᱫᱚᱞᱟ ᱟᱨ ᱵᱚᱫᱚᱞᱟ ᱚᱱᱟ ᱵᱟᱵᱚᱫ ᱛᱮ ᱡᱚᱛᱚ ᱵᱟᱰᱟᱭ ᱮᱢᱚᱜ ᱟ᱾ ᱯᱨᱟᱭᱵᱷᱮᱴᱤ ᱯᱚᱞᱤᱥ ᱯᱟᱲᱦᱟᱣ ᱢᱮ ᱞᱟᱭᱥᱮᱱᱥ ᱯᱟᱲᱦᱟᱣ ᱢᱮ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱚᱞ ᱟᱠᱟᱱ ᱯᱩᱥᱴᱟ diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 5f5887f5f..73271cc67 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -1,14 +1,6 @@ - Importa sas iscritziones dae Google takeout: -\n -\n1. Bae a custu URL: %1$s -\n2. Intra cando ti l\'ant a pedire -\n3. Incarca in \"Totu sos datos incluidos\", a pustis in \"Boga sa seletzione a totus\" e a pustis galu ischerta petzi \"iscritziones\" e incarca \"AB\" -\n4. Incarca in \"Passu imbeniente\" e a pustis in \"Crea un\'esportatzione\" -\n5. Cando aparit, incarca in su butone \"Iscarrigamentu\" -\n6. Incarca in IMPORTA SU DOCUMENTU in suta e ischerta su documentu .zip iscarrigadu -\n6. [Si s\'importatzione fallit] Estrae su documentu .csv (de sòlitu tenet su nùmene\"\"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), incarca in IMPORTA SU DOCUMENTU in suta e ischerta su documentu csv estratu + Importa sas iscritziones dae Google takeout: \n \n1. Bae a custu URL: %1$s \n2. Intra cando ti l\'ant a pedire \n3. Incarca in \"Totu sos datos incluidos\", a pustis in \"Boga sa seletzione a totus\" e a pustis galu ischerta petzi \"iscritziones\" e incarca \"AB\" \n4. Incarca in \"Passu imbeniente\" e a pustis in \"Crea un\'esportatzione\" \n5. Cando aparit, incarca in su butone \"Iscarrigamentu\" \n6. Incarca in IMPORTA SU DOCUMENTU in suta e ischerta su documentu .zip iscarrigadu \n6. [Si s\'importatzione fallit] Estrae su documentu .csv (de sòlitu tenet su nùmene\"\"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), incarca in IMPORTA SU DOCUMENTU in suta e ischerta su documentu csv estratu Esportatzione de s\'iscritzione fallida Importatzione de s\'iscritzione fallida Esportatzione anteposta @@ -33,7 +25,7 @@ Miniadura de s\'iscalita mudada. Postu in s\'iscalita Iscalita creada - Iscantzellare custa iscalita\\\? + Iscantzellare custa iscalita\\? Boga su sinnalibru Annanghe s\'iscalita a sos preferidos Imposta che a miniadura de s\'iscalita @@ -67,7 +59,7 @@ Sos mègius 50 Tendèntzias Carrigamentu de sos cummentos fallidu - Cheres fintzas importare sas impostatziones\? + Cheres fintzas importare sas impostatziones? Custu at a subraiscrìere sas impostatziones tuas de como. Avisu: no est istadu possìbile importare totu sos documentos. Perunu documentu ZIP vàlidu @@ -84,15 +76,14 @@ Cuntenutu de sa pàgina printzipale Prus riproduidos Ùrtima riprodutzione - Cheres iscantzellare custu elementu dae sa cronologia de chirca\? + Cheres iscantzellare custu elementu dae sa cronologia de chirca? Cronologia Cronologia Leghe sa litzèntzia NewPipe est unu programma lìberu cun litzèntzia copyleft: lu podes impreare, cumpartzire e megiorare comente cheres. Pro èssere prus craros, lu podes torrare a intregare in suta de sos tèrmines de sa Litzèntzia Generale Pùblica GNU publicada dae sa Free Software Foundation, sa versione 3 de sa litzèntzia o, si preferis, una prus noa. Litzèntzia de NewPipe Leghe sa polìtica de riservadesa - Su progetu NewPipe pigat sa riservadesa tua in manera sèria a beru. Pro custa resone s\'aplicatzione non collit perunu datu chene su cunsensu tuo. -\n Sa polìtica de riservadesa de NewPipe ispiegat a sa minuda ite genia de datos benint imbiados cando imbias unu raportu de errore. + Su progetu NewPipe pigat sa riservadesa tua in manera sèria a beru. Pro custa resone s\'aplicatzione non collit perunu datu chene su cunsensu tuo. \n Sa polìtica de riservadesa de NewPipe ispiegat a sa minuda ite genia de datos benint imbiados cando imbias unu raportu de errore. Polìtica de riservadesa de NewPipe Bìsita su situ web de NewPipe pro àteras informatziones e noas. Situ web @@ -183,7 +174,7 @@ Sinnala cun sa posta eletrònica Iscusa, custu non diat dèpere èssere acontèssidu. Fruni su permissu pro l\'ammustrare in subra de àteras aplicatziones - Cheres ripristinare sos valores predefinidos\? + Cheres ripristinare sos valores predefinidos? Riprìstina sos predefinidos No est istadu possìbile lèghere sas ischedas sarbadas. S\'ant a impreare sas predefinidas Perunu flussu a disponimentu pro s\'iscarrigamentu @@ -201,35 +192,17 @@ Riprodutzione de custu flussu fallida S\'apl./s\'IU s\'est serrada Galu perunu sinnalibru de iscalitas - Pensas chi su carrigamentu de sa fonte de cuntenutos (su feed) siat tropu lentu\? Si est gasi, proa a abilitare su carrigamentu lestru (lu podes mudare in sas impostatziones o incarchende su butone inoghe in suta). -\n -\nNewPipe oferit duas istrategias de carrigamentu de sas fontes de cuntenutos: -\n • Recuperende totu su canale de iscritzione, cosa chi est lenta ma prus cumprida. -\n • Impreende unu puntu de essida de unu servìtziu dedicadu, cosa chi est lestra ma, de sòlitu, non cumprida. -\n -\nSa diferèntzia printzipale intre sas duas est su fatu chi cun sa lestra, de sòlitu, unas cantas informatziones mancant, che a sa longària de s\'elementu o sa casta sua (non podet bìdere sa diferèntzia intre sos vìdeos indireta e sos chi sunt normales) diat pòdere frunire prus pagos elementos. -\n -\nYouTube est un\'esèmpiu de unu servìtziu chi frunit custu mètodu lestru cun sa fonte de cuntenutos RSS sua. -\n -\nDuncas s\'issèberu dipendet dae su chi preferis tue: sa lestresa o sas informatziones a sa minuda. + Pensas chi su carrigamentu de sa fonte de cuntenutos (su feed) siat tropu lentu? Si est gasi, proa a abilitare su carrigamentu lestru (lu podes mudare in sas impostatziones o incarchende su butone inoghe in suta). \n \nNewPipe oferit duas istrategias de carrigamentu de sas fontes de cuntenutos: \n • Recuperende totu su canale de iscritzione, cosa chi est lenta ma prus cumprida. \n • Impreende unu puntu de essida de unu servìtziu dedicadu, cosa chi est lestra ma, de sòlitu, non cumprida. \n \nSa diferèntzia printzipale intre sas duas est su fatu chi cun sa lestra, de sòlitu, unas cantas informatziones mancant, che a sa longària de s\'elementu o sa casta sua (non podet bìdere sa diferèntzia intre sos vìdeos indireta e sos chi sunt normales) diat pòdere frunire prus pagos elementos. \n \nYouTube est un\'esèmpiu de unu servìtziu chi frunit custu mètodu lestru cun sa fonte de cuntenutos RSS sua. \n \nDuncas s\'issèberu dipendet dae su chi preferis tue: sa lestresa o sas informatziones a sa minuda. Sa \'Storage Access Framework\' (Istrutura de Atzessu a s\'Archiviatzione) permitet sos iscarrigamentos in un\'ischeda SD esterna postu in lista Ammustra una notìfica pro cussigiare un\'agiornamentu de s\'aplicatzione cando b\'est una versione noa a disponimentu - Importa unu profilu de SoundCloud iscriende o s\'URL o su còdighe identificativu (ID) tuo: -\n -\n 1. Abìlita sa modalidade \"pro elaboradores de iscrivania\" in unu navigadore web (custu situ no est a disponimentu pro dispositivos mòbiles) -\n 2. Bae a custu URL: %1$s -\n 3. Intra in su contu tuo cando ti lu benit pedidu -\n 4. Còpia s\'URL de su profilu a ue ses istadu mandadu. + Importa unu profilu de SoundCloud iscriende o s\'URL o su còdighe identificativu (ID) tuo: \n \n 1. Abìlita sa modalidade \"pro elaboradores de iscrivania\" in unu navigadore web (custu situ no est a disponimentu pro dispositivos mòbiles) \n 2. Bae a custu URL: %1$s \n 3. Intra in su contu tuo cando ti lu benit pedidu \n 4. Còpia s\'URL de su profilu a ue ses istadu mandadu. Esportende… - B\'at bisòngiu de custu permissu pro -\nabèrrere sa modalidade ventanedda + B\'at bisòngiu de custu permissu pro \nabèrrere sa modalidade ventanedda Ite:\nRechesta:\nLimba de su cuntenutu\nIstadu de su cuntenutu:\nLimba de s\'aplicatzione:\nServìtziu:\nOràriu GMT:\nPachete:\nVersione:\nVersione SO: A dolu mannu b\'at àpidu carchi problema. Cronologia de chirca iscantzellada - Custu vìdeu tenet unu lìmite de edade. -\n -\nAllughe \"%1$s\" in sas impostatziones si lu cheres pompiare. + Custu vìdeu tenet unu lìmite de edade. \n \nAllughe \"%1$s\" in sas impostatziones si lu cheres pompiare. Perunu riproduidore de flussos agatadu (pro lu riproduire podes installare VLC). Pàgina de s\'iscalita Ammustra petzi sas iscritziones no agrupadas @@ -241,9 +214,7 @@ De %s Creadu dae %s Miniadura de avatar de su canale - Custu cuntenutu no est galu suportadu dae NewPipe. -\n -\n Isperamus chi at a èssere suportadu in una versione benidora. + Custu cuntenutu no est galu suportadu dae NewPipe. \n \n Isperamus chi at a èssere suportadu in una versione benidora. Disabìlita sa modalidade lestra Abìlita sa modalidade lestra A disponimentu in unos cantos servìtzios, de sòlitu est meda prus lestru ma diat pòdere frunire unu nùmeru limitadu de elementos e, fatu-fatu, informatziones no intreas (es. peruna longària, casta de elementu, indicadore de istadu in direta) @@ -253,7 +224,7 @@ Lìmite de agiornamentu de sa fonte de cuntenutos Fonte de cuntenutos Nou - Cheres iscantzellare custu grupu\? + Cheres iscantzellare custu grupu? Su nùmene de su grupu est bòidu %d ischertadu @@ -292,8 +263,7 @@ Limba de s\'aplicatzione Issèbera un\'istàntzia Imprea s\'ischertadore de cartellas de sistema (SAF) - T\'at a bènnere pedidu in ue sarvare cada documentu. -\nAbìlita s\'ischertadore de cartellas de sistema (SAF) si cheres iscarrigare in un\'ischeda SD esterna + T\'at a bènnere pedidu in ue sarvare cada documentu. \nAbìlita s\'ischertadore de cartellas de sistema (SAF) si cheres iscarrigare in un\'ischeda SD esterna Pedi in ue iscarrigare Pone in pàusa sos iscarrigamentos Faghe incumintzare sos iscarrigamentos @@ -306,7 +276,7 @@ Tentativos màssimos Firma Iscantzella sos documentos iscarrigados - Cheres isboidare sa cronologia de sos iscarrigamentos tuos o iscantzellare totu sos documentos iscarrigados\? + Cheres isboidare sa cronologia de sos iscarrigamentos tuos o iscantzellare totu sos documentos iscarrigados? Isbòida sa cronologia de sos iscarrigamentos Impossìbile recuperare custu iscarrigamentu Connessione iscadida @@ -353,8 +323,7 @@ Perunu lìmite Refuda Atzeto - Pro pòdere rispetare su Regulamentu Europeu Generale de Amparu de sos Datos (GDPR) ti pedimus de dare cara a sa polìtica de riservadesa de NewPipe. -\n La depes atzetare pro nos pòdere imbiare sa sinnalatzione de errore. + Pro pòdere rispetare su Regulamentu Europeu Generale de Amparu de sos Datos (GDPR) ti pedimus de dare cara a sa polìtica de riservadesa de NewPipe. \n La depes atzetare pro nos pòdere imbiare sa sinnalatzione de errore. Reseta Passu Avantzamentu lestru durante su silèntziu @@ -362,27 +331,25 @@ Tonu Ritmu Controllos de sa lestresa de riprodutzione - Ammenta·ti chi custa operatzione diat pòdere impreare meda sa retza tua. -\n -\n Cheres sighire\? + Ammenta·ti chi custa operatzione diat pòdere impreare meda sa retza tua. \n \n Cheres sighire? IDtuo, soundcloud.com/IDtuo Impostatzione de su menù de iscarrigamentu fallida Cuntenutu no a disponimentu Anàlisi de su situ web fallida No est istadu possìbile carrigare totu sas miniaduras Errore de retza - Impossìbile iscarrigare in s\'ischeda SD esterna. Cheres resetare sa positzione de sa cartella de iscarrigamentu\? + Impossìbile iscarrigare in s\'ischeda SD esterna. Cheres resetare sa positzione de sa cartella de iscarrigamentu? Memòria esterna non disponìbile Errore - Cheres iscantzellare totu sa cronologia de sas chircas\? + Cheres iscantzellare totu sa cronologia de sas chircas? Iscantzella sa cronologia de sas paràulas chircadas Iscantzella sa cronologia de chirca Positziones de riprodutzione iscantzelladas - Cheres iscantzellare totu sas positziones de riprodutzione\? + Cheres iscantzellare totu sas positziones de riprodutzione? Iscantzella totu sas positziones de riprodutzione Iscantzella sas positziones de riprodutzione Cronologia de sos pompiados iscantzellada - Cheres iscantzellare totu sa cronologia de sos pompiados\? + Cheres iscantzellare totu sa cronologia de sos pompiados? Iscantzellat sa cronologia de sos cuntenutos riproduidos e sas positziones de riprodutzione Isbòida sa cronologia de sos pompiados Esporta sa cronologia, sos abbonamentos, sas iscalitas e sas impostatziones @@ -482,7 +449,7 @@ Àudio Ammustra un\'optzione pro riproduire unu vìdeu pro mèdiu de su tentru multimediale Kodi Ammustra s\'optzione \"Riprodui cun Kodi\" - Cheres installare s\'aplicatzione Kore chi mancat\? + Cheres installare s\'aplicatzione Kore chi mancat? Riprodui cun Kodi Petzi unos cantos dispositivos podent riproduire vìdeos in 2K/4K Ammustra sas risolutziones prus artas @@ -511,7 +478,7 @@ Bogat s\'àudio pro unas cantas risolutziones Imprea unu riproduidore de vìdeos esternu Cumpartzi cun - Cherias nàrrere \"%1$s\"\? + Cherias nàrrere \"%1$s\"? Impostatziones Chirca Iscàrriga su documentu de trasmissione @@ -521,14 +488,14 @@ Aberi in su navigadore web Annulla Installa - Perunu riproduidore de flussos agatadu. Cheres installare VLC\? + Perunu riproduidore de flussos agatadu. Cheres installare VLC? Publicadu su %1$s Toca sa lente de ismanniamentu pro incumintzare. Mai Cun su Wi-Fi ebbia Incumintza cun sa riprodutzione automaticamente — %s Lista de riprodutzione - Reconnoschimentu de s\'URL fallidu. Lu cheres abèrrere cun un\'àtera aplicatzione\? + Reconnoschimentu de s\'URL fallidu. Lu cheres abèrrere cun un\'àtera aplicatzione? Annanghidura automàtica a sa lista Sa lista dae su riproduidore ativu at a èssere remplasada Colende dae unu riproduidore a s\'àteru dias pòdere remplasare sa lista tua @@ -579,8 +546,7 @@ Custa est una rasta SoundCloud Go+, a su mancu in su paisu tuo, e duncas non podet èssere riproduida o iscarrigada dae NewPipe. Custu cuntenutu no est a disponimentu in su paisu tuo. Faghe serrare s\'aplicatzione - Custu vìdeu tenet unu lìmite de edade. -\nPro neghe de sas polìticas noas de YouTube in subra de sos vìdeos limitados pro edade, NewPipe non podet atzèdere a perunu flussu vìdeu de custa genia e duncas non los podet riproduire. + Custu vìdeu tenet unu lìmite de edade. \nPro neghe de sas polìticas noas de YouTube in subra de sos vìdeos limitados pro edade, NewPipe non podet atzèdere a perunu flussu vìdeu de custa genia e duncas non los podet riproduire. Ràdiu In evidèntzia Risolve @@ -611,9 +577,7 @@ Aberi su situ web Contu serradu Su recùperu lestru de sos flussos non frunit àteras informatziones in subra de custu. - Su contu de s\'autore l\'ant serradu. -\nNewPipe no at a èssere prus in gradu de carrigare custu flussu in su tempus benidore. -\nCheres bogare s\'iscritzione a custu canale\? + Su contu de s\'autore l\'ant serradu. \nNewPipe no at a èssere prus in gradu de carrigare custu flussu in su tempus benidore. \nCheres bogare s\'iscritzione a custu canale? Carrigamentu de su flussu pro \'%s\' fallidu. Errore carrighende su flussu T\'at a bènnere pedidu in ue sarvare cada documentu @@ -655,11 +619,9 @@ Ammustra un\'optzione pro fàghere serrare de repente su riproduidore cando l\'impreas Crea una notìfica de errore Elementos noos de su flussu - No est istadu agatadu perunu gestore de documentos pro custa atzione. -\nPro praghere installa·nde unu o proa a inabilitare \'%s\' in sas impostatziones de iscarrigamentu + No est istadu agatadu perunu gestore de documentos pro custa atzione. \nPro praghere installa·nde unu o proa a inabilitare \'%s\' in sas impostatziones de iscarrigamentu Ammustra \"faghe serrare su riproduidore\" - No est istadu agatadu perunu gestore de documentos pro custa atzione. -\nPro praghere installa unu gestore de documentos cumpatìbile cun su \"Sistema de Atzessu a s\'Archiviatzione\" + No est istadu agatadu perunu gestore de documentos pro custa atzione. \nPro praghere installa unu gestore de documentos cumpatìbile cun su \"Sistema de Atzessu a s\'Archiviatzione\" Faghe serrare su riproduidore Cummentu apicadu LeakCanary no est a disponimentu @@ -685,7 +647,7 @@ Notìfica de su riproduidore Notìficas Flussos noos - Iscantzellare totu sos archìvios iscarrigados dae su discu\? + Iscantzellare totu sos archìvios iscarrigados dae su discu? Pertzentuale Semitonu Seletziona sa calidade pro sos letores esternos @@ -714,8 +676,8 @@ Ùtile, a esempru, si ses impreende cùfias cun butones fìsicos segados Ammustra sos flussos chi sighint Boga sos duplicados - Bogare sos duplicados\? - Boles bogare totu sos flussos duplicados in custa iscalita\? + Bogare sos duplicados? + Boles bogare totu sos flussos duplicados in custa iscalita? Ammustra/Cua flussos Bidu de su totu Bidu in parte @@ -741,9 +703,7 @@ dopiadu descritivu Imprea semper sa solutzione alternativa de s\'impostatzione de superfìtzie de s\'essida vìdeu de ExoPlayer - Custa solutzione alternativa lìberat e torrat a istantziare sos codificadores de vìdeu cando acontesset unu càmbiu de superfìtzie, in càmbiu de impostare sa superfìtzie e su codificadore in manera direta. Giai impreada dae ExoPlayer in unos cantos dispositivos cun custu problema, custa impostatziones tenet un\'efetu petzi in Android 6 e versiones prus noas. -\n -\nS\'abilitatzione de custa optzione diat pòdere prevènnere faddinas de riprodutzione cando si càmbiat su riproduidore vìdeu atuale o si colat a s\'ischermu intreu + Custa solutzione alternativa lìberat e torrat a istantziare sos codificadores de vìdeu cando acontesset unu càmbiu de superfìtzie, in càmbiu de impostare sa superfìtzie e su codificadore in manera direta. Giai impreada dae ExoPlayer in unos cantos dispositivos cun custu problema, custa impostatziones tenet un\'efetu petzi in Android 6 e versiones prus noas. \n \nS\'abilitatzione de custa optzione diat pòdere prevènnere faddinas de riprodutzione cando si càmbiat su riproduidore vìdeu atuale o si colat a s\'ischermu intreu Seletziona una rasta àudio pro riproduidores esternos Seletziona sa rasta sonora originale in manera indipendente dae sa limba Una rasta àudio diat dèpere èssere giai presente in custu flussu @@ -756,8 +716,7 @@ Ite ischedas benint ammustradas in sas pàginas de su canale Cumpartzi una lista de URL Cumpartzi cun sos tìtulos - %1$s -\n%2$s + %1$s \n%2$s Ischedas de su canale Curtzos Carrighende sos metadatos… @@ -800,8 +759,7 @@ Modìfica cada atzione de notìfica inoghe in suta tochende·la. Sas primas tres atziones (riprodutzione/pàusa, antepostu e imbeniente) sunt impostadas dae su sistema e non si podent personalizare. Non b\'at ispàtziu lìberu bastante in su dispositivu Mustra de mancu - NewPipe podet chircare in automàticu versiones noas cada tantu e notificare·ti cando sunt a disponimentu. -\nLu boles abilitare? + NewPipe podet chircare in automàticu versiones noas cada tantu e notificare·ti cando sunt a disponimentu. \nLu boles abilitare? Nono Còpia de seguresa e riprìstinu @@ -812,9 +770,7 @@ Eja Reseta sas impostatziones Reseta totu sas impostatziones a sos valores predefinidos issoro - Resetende totu sas impostatziones as a iscartare totu sas impostatziones preferidas tuas e a torrare a allùghere s\'aplicatzione. -\n -\nSes seguru de bòlere sighire? + Resetende totu sas impostatziones as a iscartare totu sas impostatziones preferidas tuas e a torrare a allùghere s\'aplicatzione. \n \nSes seguru de bòlere sighire? Sas impostatziones in s\'esportatzione chi benit importada impreant unu formadu vulneràbile chi est disusadu dae sa versione 0.27.0 de NewPipe. Assegura·ti chi s\'esportatzione importada bèngiat dae una fonte fidada, e preferi a impreare petzi esportatziones otentas dae NewPipe 0.27.0 o prus nou, in su benidore. Su suportu a s\'importatzione de impostatziones in custu formadu vulneràbile at a èssere luego bogadu de su totu, e dae cussu momentu sas versiones de NewPipe prus betzas no ant a èssere prus in gradu de importare impostatziones pro mèdiu de esportatziones de versiones prus noas. Iscalitas Cumpartzi comente un\'iscalita temporànea de YouTube diff --git a/app/src/main/res/values-si/strings.xml b/app/src/main/res/values-si/strings.xml index 85f248b11..00a5c20f8 100644 --- a/app/src/main/res/values-si/strings.xml +++ b/app/src/main/res/values-si/strings.xml @@ -1,7 +1,7 @@ තොරතුරු පෙන්වන්න - ඔබ අදහස් කළේ \"%1$s\" ද\? + ඔබ අදහස් කළේ \"%1$s\" ද? සැකසුම් සොයන්න බාහිර මෘදුකාංගයක් භාවිත කරන්න @@ -30,4 +30,4 @@ ප්‍රවාහ වාදකයක් හමු නොවීය (ඔබට එය වාදනය කිරීමට VLC ස්ථාපනය කළ හැක). ප්‍රවාහ ගොනුව බාගන්න ප්‍රවාහ වාදකයක් හමු නොවීය. VLC ස්ථාපනය කරන්නද? - \ 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 1f2a81de4..d527022bf 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -9,7 +9,7 @@ Prevziať Hľadať Nastavenia - Mysleli ste \"%1$s\"\? + Mysleli ste \"%1$s\"? Zdieľať s Použiť externý prehrávač videa Použiť externý prehrávač zvuku @@ -21,7 +21,7 @@ Stiahnuté zvukové súbory sú uložené tu Štandardné rozlíšenie Prehrať cez Kodi - Nainštalovať chýbajúcu aplikáciu Kore\? + Nainštalovať chýbajúcu aplikáciu Kore? Zobraziť možnosť \"Prehrať cez Kodi\" Zobrazí možnosť prehrať video cez mediálne centrum Kodi Zvuk @@ -84,8 +84,7 @@ Všetko Požiadavka reCAPTCHA Otvoriť vo vyskakovacom okne - Tieto práva sú potrebné pre -\nprehrávanie v mini okne + Tieto práva sú potrebné pre \nprehrávanie v mini okne Preferovaný formát videa Prehrávanie v mini okne Vypnuté @@ -145,6 +144,7 @@ %s odberateľ %s odberatelia + %s odberateľov %s odberateľov Žiadne zobrazenia @@ -158,6 +158,7 @@ %s video %s videá + %s videí %s videí Nebol nájdený žiadny prehrávač pre stream (môžete si nainštalovať napr. VLC). @@ -274,25 +275,10 @@ Predchádzajúci export Nemožno importovať odbery Nemožno exportovať odbery - Import odberov služby YouTube pomocou Google takeout: -\n -\n1. Prejdite na túto adresu URL: %1$s -\n2. Po výzve sa prihláste do svojho účtu -\n3. Kliknite na \"Zahrnuté sú všetky údaj služby YouTube\", kliknite na \"Zrušiť výber\", zaškrtnite \"odbery\" a kliknite na OK -\n4. Kliknite na \"Ďalší krok\" a potom na \"Vytvoriť export\" -\n5. Po chvíli sa objaví tlačidlo s nápisom \"Stiahnuť\" -\n6. Kliknite na IMPORT ZO SÚBORU a zvoľte stiahnutý zip súbor -\n7. Ak import zip súbory zlyhá. Stiahnutý súbor otvorte a extrahujte .csv súbor (nachádza sa v \"/Takeout/YouTube a YouTube Music/odbery/\"), tento súbor importujte do NewPipe - Importovať SoundCloud profil zadaním URL adresy alebo vášho ID: -\n -\n1. Prepnite režim na \"desktop\" (web nie je dostupný pre mobilné zariadenia) -\n2. Prejdite na túto URL adresu: %1$s -\n3. Po výzve sa prihláste do svojho účtu -\n4. Skopírujte adresu URL, na ktorú ste boli presmerovaní. + Import odberov služby YouTube pomocou Google takeout: \n \n1. Prejdite na túto adresu URL: %1$s \n2. Po výzve sa prihláste do svojho účtu \n3. Kliknite na \"Zahrnuté sú všetky údaj služby YouTube\", kliknite na \"Zrušiť výber\", zaškrtnite \"odbery\" a kliknite na OK \n4. Kliknite na \"Ďalší krok\" a potom na \"Vytvoriť export\" \n5. Po chvíli sa objaví tlačidlo s nápisom \"Stiahnuť\" \n6. Kliknite na IMPORT ZO SÚBORU a zvoľte stiahnutý zip súbor \n7. Ak import zip súbory zlyhá. Stiahnutý súbor otvorte a extrahujte .csv súbor (nachádza sa v \"/Takeout/YouTube a YouTube Music/odbery/\"), tento súbor importujte do NewPipe + Importovať SoundCloud profil zadaním URL adresy alebo vášho ID: \n \n1. Prepnite režim na \"desktop\" (web nie je dostupný pre mobilné zariadenia) \n2. Prejdite na túto URL adresu: %1$s \n3. Po výzve sa prihláste do svojho účtu \n4. Skopírujte adresu URL, na ktorú ste boli presmerovaní. vašeID, soundcloud.com/vašeid - Operácia môže byť náročná na počet prenesených dát. -\n -\nChcete pokračovať? + Operácia môže byť náročná na počet prenesených dát. \n \nChcete pokračovať? Ovládanie rýchlosti prehrávania Rýchlosť Výška @@ -303,7 +289,7 @@ História pozerania bola vymazaná Vymazať históriu vyhľadávania Odstráni históriu vyhľadávania kľúčových slov - Vymazať celú históriu vyhľadávania\? + Vymazať celú históriu vyhľadávania? História vyhľadávaní bola vymazaná 1 položka bola vymazaná. NewPipe je voľný softvér s copyleftom: Môžete ho používať, študovať, zdieľať a vylepšovať podľa vlastného uváženia. Konkrétne ho môžete redistribuovať a/alebo modifikovať podľa podmienok Všeobecnej verejnej licencie GNU, ako ju uverejnila Free Software Foundation, buď verzie 3 licencie, alebo (podľa vášho výberu) akejkoľvek neskoršej verzie. @@ -311,8 +297,7 @@ Projekt NewPipe berie ochranu vašich osobných údajov veľmi vážne. Aplikácia preto bez vášho súhlasu nezhromažďuje žiadne údaje.\nV zásadách ochrany osobných údajov NewPipe je podrobne vysvetlené, aké údaje sa odosielajú a ukladajú pri zaslaní správy o chybe. Prečítajte si zásady ochrany osobných údajov Chcete zároveň importovať aj nastavenia? - V súlade s Európskym Všeobecným Nariadením o Ochrane Údajov (GDPR), chceme upriamiť Vašu pozornosť na zmluvu o ochrane osobných údajov v NewPipe. Starostlivo si ju prečítajte. -\nMusíte ju prijať pred nahlásením chyby. + V súlade s Európskym Všeobecným Nariadením o Ochrane Údajov (GDPR), chceme upriamiť Vašu pozornosť na zmluvu o ochrane osobných údajov v NewPipe. Starostlivo si ju prečítajte. \nMusíte ju prijať pred nahlásením chyby. Prijať Odmietnuť Bez limitu @@ -337,10 +322,10 @@ Oznámenie o aktualizácii aplikácie Upozornenia na novú verziu NewPipe Externé úložisko je nedostupné - Sťahovanie na externú SD kartu nie je možné. Obnoviť umiestnenie priečinka na sťahovanie\? + Sťahovanie na externú SD kartu nie je možné. Obnoviť umiestnenie priečinka na sťahovanie? Chyba pri načítavaní uložených kariet, použijú sa predvolené Obnoviť predvolené nastavenia - Chcete obnoviť predvolené hodnoty\? + Chcete obnoviť predvolené hodnoty? Počet odberateľov nie je k dispozícii Aké karty sa zobrazujú na hlavnej stránke Konferencie @@ -398,31 +383,32 @@ V zariadení už nie je voľné miesto Nemožno pokračovať, súbor bol vymazaný Spojenie vypršalo - Chcete vymazať históriu sťahovania alebo odstrániť všetky stiahnuté súbory\? + Chcete vymazať históriu sťahovania alebo odstrániť všetky stiahnuté súbory? Limitovať počet položiek pri sťahovaní Súbory sa budú sťahovať jeden po druhom Spustite sťahovanie Pozastaviť sťahovanie Pýtať sa na adresár sťahovania - Pri každom sťahovaní súboru sa bude vyžadovať zadanie cieľového adresára. -\nAk chcete súbory sťahovať na externú SD kartu povoľte možnosť výberu adresára (SAF) + Pri každom sťahovaní súboru sa bude vyžadovať zadanie cieľového adresára. \nAk chcete súbory sťahovať na externú SD kartu povoľte možnosť výberu adresára (SAF) Použite výber adresára (SAF) \"Storage Access Framework\" umožňuje sťahovanie na externú SD kartu Odstrániť pozície prehrávania Odstráni všetky pozície prehrávania - Odstrániť všetky pozície prehrávania\? + Odstrániť všetky pozície prehrávania? Prepnúť službu, práve vybraté: Predvolený kiosk Toto nikto nesleduje %s sleduje %s sledujú + %s sleduje %s sleduje Toto nikto nepočúva %s poslucháč %s poslucháči + %s poslucháčov %s poslucháčov Dĺžka rýchleho pretáčania @@ -455,21 +441,25 @@ %d sekunda %d sekundy + %d sekúnd %d sekúnd %d minuta %d minuty + %d minút %d minút %d hodina %d hodiny + %d hodín %d hodín %d deň %d dni + %d dní %d dní Skupiny kanálov @@ -482,10 +472,11 @@ %d vybraný %d vybrané + %d vybraných %d vybraných Bez názvu skupiny - Chcete zmazať vybranú skupinu\? + Chcete zmazať vybranú skupinu? Nový Zdroj Interval obnovy zdroja @@ -495,20 +486,8 @@ Služba je dostupná len pre určité zdroje, zvyčajne je rýchlejšia ale môže vrátiť obmedzený počet položiek alebo neúplné informácie (napr. dĺžka, typ, status) Povoliť rýchly režim Zakázať rýchly režim - Myslíte si, že načítavanie informačného kanála je príliš pomalé\? Ak áno, skúste povoliť rýchle načítanie (môžete ho zmeniť v nastaveniach alebo stlačením tlačidla nižšie). -\n -\nNewPipe ponúka dve stratégie načítania informačného kanála: -\n• Načítava sa celý kanál prihlásenia na odber, ktorý je pomalý, ale úplný. -\n• Používanie vyhradeného koncového bodu služby, ktorý je rýchly, ale zvyčajne nie je kompletný. -\n -\nRozdiel medzi nimi je ten, že v prípade rýchleho zvyčajne chýbajú nejaké informácie, napríklad trvanie alebo typ položky (nedá sa rozlíšiť medzi živými videami a normálnymi videami) a môže načítať menej položiek. -\n -\nYouTube je príkladom služby, ktorá ponúka túto rýchlu metódu s informačným kanálom RSS. -\n -\nTakže výber sa zredukuje na to, čo uprednostňujete: rýchlosť alebo presné informácie. - Tento obsah ešte nie je podporovaný v NwPipe. -\n -\nMožno v budúcnosti sa to zmení. + Myslíte si, že načítavanie informačného kanála je príliš pomalé? Ak áno, skúste povoliť rýchle načítanie (môžete ho zmeniť v nastaveniach alebo stlačením tlačidla nižšie). \n \nNewPipe ponúka dve stratégie načítania informačného kanála: \n• Načítava sa celý kanál prihlásenia na odber, ktorý je pomalý, ale úplný. \n• Používanie vyhradeného koncového bodu služby, ktorý je rýchly, ale zvyčajne nie je kompletný. \n \nRozdiel medzi nimi je ten, že v prípade rýchleho zvyčajne chýbajú nejaké informácie, napríklad trvanie alebo typ položky (nedá sa rozlíšiť medzi živými videami a normálnymi videami) a môže načítať menej položiek. \n \nYouTube je príkladom služby, ktorá ponúka túto rýchlu metódu s informačným kanálom RSS. \n \nTakže výber sa zredukuje na to, čo uprednostňujete: rýchlosť alebo presné informácie. + Tento obsah ešte nie je podporovaný v NwPipe. \n \nMožno v budúcnosti sa to zmení. Áno aj čiastočne pozreté videá Videá, ktoré ste sledovali pred a po pridaní do playlistu, budú odstránené. \nNaozaj to chcete urobiť? Odstrániť pozerané videá? @@ -520,9 +499,7 @@ Umelci Skladby Albumy - Vekovo obmedzené video. -\n -\nPre zobrazenie videa povoľte \"%1$s\" v nastaveniach. + Vekovo obmedzené video. \n \nPre zobrazenie videa povoľte \"%1$s\" v nastaveniach. Zapnúť \"Obmedzený režim YouTube\" %s Vytvoril %s @@ -539,7 +516,7 @@ Žiadne záložky playlistov Vyberte playlist Skontrolujte prosím, či rovnaká chyba už nie je nahlásená. Vytváranie duplicitných hlásení komplikuje prácu vývojárov. - Nemožno rozpoznať URL. Otvoriť pomocou inej aplikácie\? + Nemožno rozpoznať URL. Otvoriť pomocou inej aplikácie? Automatický rad Zoznam aktuálneho prehrávača bude prepísaný Prepnutie z jedného prehrávača na druhý môže nahradiť vaše poradie @@ -589,8 +566,7 @@ Táto skladba je typu SoundCloud Go+, pre vašu krajinu je tento typ zakázaný a preto ju NewPipe nemôže streamovať ani sťahovať. Tento obsah nie je vo vašej krajine k dispozícii. Vynútiť zastavenie - Toto video je vekovo obmedzené. -\nNewPipe ho nemôže prehrať z dôvodu nových pravidiel služby YouTube pre videá s vekovým obmedzením. + Toto video je vekovo obmedzené. \nNewPipe ho nemôže prehrať z dôvodu nových pravidiel služby YouTube pre videá s vekovým obmedzením. Sťahovanie začalo Dolu si môžete vybrať svoju obľúbenú nočnú tému Vyberte si svoju obľúbenú nočnú tému — %s @@ -620,9 +596,7 @@ Otvoriť webstránku Účet bol zrušený Tento rýchly režim neposkytuje viac informácií. - Účet autora bol zrušený. -\nPreto ho NewPipe nebude môcť v budúcnosti načítať. -\nChcete sa odhlásiť z odberu tohto kanála\? + Účet autora bol zrušený. \nPreto ho NewPipe nebude môcť v budúcnosti načítať. \nChcete sa odhlásiť z odberu tohto kanála? Nemožno načítať informačný kanál \'%s\'. Chyba pri načítaní kanála Od Androidu 10 je podporovaný len \'Storage Access Framework\' @@ -636,11 +610,13 @@ %1$s sťahovanie zmazané %1$s sťahovania zmazané + %1$s sťahovaní zmazaných %1$s sťahovaní zmazaných Sťahovanie ukončené %s ukončené sťahovania + %s ukončených sťahovaní %s ukončených sťahovaní Neukazovať @@ -660,12 +636,10 @@ Ručne skontrolovať nové verzie Kontrolujú sa aktualizácie… Nové položky informačného kanála - Pre túto akciu sa nenašiel vhodný správca súborov. -\nNainštalujte si správcu súborov alebo skúste vypnúť \'%s\' v nastaveniach sťahovania + Pre túto akciu sa nenašiel vhodný správca súborov. \nNainštalujte si správcu súborov alebo skúste vypnúť \'%s\' v nastaveniach sťahovania Zobraziť „Zhodiť prehrávač“ LeakCanary nie je k dispozícii - Pre túto akciu sa nenašiel vhodný správca súborov. -\nNainštalujte správcu súborov kompatibilného s rozhraním Storage Access Framework + Pre túto akciu sa nenašiel vhodný správca súborov. \nNainštalujte správcu súborov kompatibilného s rozhraním Storage Access Framework Pripnutý komentár Zlyhanie prehrávača Nahlásenie chyby @@ -678,7 +652,7 @@ ExoPlayer preddefinovaný Oznámenia Frekvencia kontroly - Vymazať všetky stiahnuté súbory z disku\? + Vymazať všetky stiahnuté súbory z disku? Upozornenia sú vypnuté Upozornenie z prehrávača Nastavte oznámenie aktuálneho streamu prehrávania @@ -691,6 +665,7 @@ %s nový stream %s nové streamy + %s nových streamov %s nových streamov Skontrolovať nové streamy @@ -731,7 +706,7 @@ Hlasitosť Nič Odstrániť duplikáty - Odstrániť duplikáty\? + Odstrániť duplikáty? Rozpozerané Dopozerané Toto sa môže hodiť v prípade, že máte pokazené tlačidlá na slúchadlách @@ -758,9 +733,7 @@ Vyberte zvukovú stopu s popisom pre osoby so zrakovým postihnutím, ak je k dispozícii Zobrazovať/Skrývať streamy Nastavenia ExoPlayer - Toto riešenie uvoľní a znovu nastaví videokodeky pri zmene rozhrania namiesto priameho nastavenia rozhrania kodeku. Nastavenie už používa ExoPlayer na niektorých zariadeniach s týmto problémom a týka sa len systému Android 6 a vyššie -\n -\nPovolením tejto možnosti môžete zabrániť chybám prehrávania pri zmene aktuálneho prehrávača videa alebo pri prepnutí do režimu celej obrazovky + Toto riešenie uvoľní a znovu nastaví videokodeky pri zmene rozhrania namiesto priameho nastavenia rozhrania kodeku. Nastavenie už používa ExoPlayer na niektorých zariadeniach s týmto problémom a týka sa len systému Android 6 a vyššie \n \nPovolením tejto možnosti môžete zabrániť chybám prehrávania pri zmene aktuálneho prehrávača videa alebo pri prepnutí do režimu celej obrazovky popisná Videá Odberatelia @@ -813,22 +786,19 @@ %s odpoveď %s odpovede + %s odpovedí %s odpovedí - %1$s: %2$s - %1$s -\n%2$s + %1$s \n%2$s Nedostatok voľného miesta v zariadení Obnoví všetky nastavenia na pôvodné hodnoty Obnoviť nastavenia Záloha a obnovenie - Obnovením nastavení sa zrušia všetky preferované nastavenia a aplikácia sa reštartuje. -\n -\nSte si istí, že chcete pokračovať? + Obnovením nastavení sa zrušia všetky preferované nastavenia a aplikácia sa reštartuje. \n \nSte si istí, že chcete pokračovať? Nie Áno - NewPipe môže z času na čas automaticky kontrolovať nové verzie a upozorniť vás, keď budú k dispozícii. -\nChcete to povoliť? + NewPipe môže z času na čas automaticky kontrolovať nové verzie a upozorniť vás, keď budú k dispozícii. \nChcete to povoliť? Nastavenia v importovanom exporte používajú zraniteľný formát, ktorý bol od verzie NewPipe 0.27.0 zrušený. Uistite sa, že importovaný export pochádza z dôveryhodného zdroja, a v budúcnosti radšej používajte len exporty získané z verzie NewPipe 0.27.0 alebo novšej. Podpora importu nastavení v tomto zraniteľnom formáte bude čoskoro úplne odstránená a potom už staré verzie programu NewPipe nebudú môcť importovať nastavenia exportov z nových verzií. sekundárny Zdieľať ako dočasný playlist YouTube diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index ed316e93e..0fc6dacc6 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -1,7 +1,7 @@ Objavljeno %1$s - Predvajalnika pretoka ni mogoče najti. Želite namestiti program VLC\? + Predvajalnika pretoka ni mogoče najti. Želite namestiti program VLC? Namesti Prekliči Odpri v brskalniku @@ -9,7 +9,7 @@ Prejmi Iskanje Nastavitve - Ali ste mislili \"%1$s\"\? + Ali ste mislili \"%1$s\"? Omogoči souporabo z Uporabi zunanji predvajalnik videa Uporabi zunanji predvajalnik zvoka @@ -18,7 +18,7 @@ Izberite mapo za prenos video datotek Privzeta ločljivost Predvajaj s Kodi - Ali želite namestiti manjkajoči program Kore\? + Ali želite namestiti manjkajoči program Kore? Pokaži možnost \"Predvajaj s Kodi\" Privzet zapis zvoka Zvok @@ -84,8 +84,7 @@ Črna Vse Odpri v pojavnem načinu - To dovoljenje je potrebno za odpiranje -\nv pojavnem načinu + To dovoljenje je potrebno za odpiranje \nv pojavnem načinu Predvajanje v pojavnem načinu Onemogočeno Prednostni zapis video datoteke @@ -204,7 +203,7 @@ Uporabno ko preklopite na mobilne podatke, četudi nekateri prenosi ne morejo biti začasno ustavljeni Največje število poskusov pred preklicom prenosa Izbriši prenesene datoteke - Želite počistiti zgodovino prenosov ali izbrisati vse prenose\? + Želite počistiti zgodovino prenosov ali izbrisati vse prenose? Počisti zgodovino prenosa Ni mogoče povrniti prenos Napredek je izgubljen, ker je bila datoteka izbrisana @@ -238,7 +237,7 @@ Povečaj Napolni Seznam predvajanja je bil ustvarjen - Izbrišem seznam predvajanja\? + Izbrišem seznam predvajanja? Dodaj v seznam predvajanja Preimenuj Nov seznam predvajanja @@ -267,9 +266,9 @@ Zgodila se je napaka: %1$s Ni take mape Datoteka premaknjena ali izbrisana - Prenašanje na zunanjo SD kartico ni mogoče. Resetiram lokacijo mape z prenosi\? + Prenašanje na zunanjo SD kartico ni mogoče. Resetiram lokacijo mape z prenosi? Zgodovina gledanja izbrisana - Izbrišem vso zgodovino gledanja\? + Izbrišem vso zgodovino gledanja? Izbriši zgodovino gledanja Izvozi zgodovino, naročnine, sezname predvajanj in nastavitve Obvestila posodobitve aplikacije @@ -291,9 +290,9 @@ Odjava Predvajalnika pretoka ni mogoče najti (namestite lahko VLC program za predvajanje). Predvajalnik v ozadju - Želite uvoziti tudi nastavite\? + Želite uvoziti tudi nastavite? Zgodovina iskanja izbrisana - Izbrišem vso zgodovino brskanja\? + Izbrišem vso zgodovino brskanja? Izbriši zgodovino brskanja Izbriši piškotke, ki jih NewPipe shrani, ko rešite reCAPTCHA Izbrišite piškodke reCAPTCHA @@ -351,8 +350,7 @@ Opozorilo: ni mogoče uvoziti vseh datotek. Izberi seznam predvajanja NewPipe je prosta in odprta programska oprema: lahko jo uporabljaš, preučuješ in izboljšaš po želji. Lahko jo distributiraš in/ali spremeniš pod pogoji GNU General Public Licence, kot jo je izdala Free Software Foundation v različici 3 ali po izbiri v katerikoli novejši različici. - Projekt NewPipe jemlje vašo zasebnost zelo resno. Aplikacija zato ne zbira kakršnih koli podatkov brez vašega dovoljenja. -\nPolitika zasebnosti NewPipe-a podrobno pojasnjuje, kateri podatki so poslani in shranjeni, ko pošljete poročilo o zrušitvi. + Projekt NewPipe jemlje vašo zasebnost zelo resno. Aplikacija zato ne zbira kakršnih koli podatkov brez vašega dovoljenja. \nPolitika zasebnosti NewPipe-a podrobno pojasnjuje, kateri podatki so poslani in shranjeni, ko pošljete poročilo o zrušitvi. Pomagaj NewPipe razvijajo prostovoljci, ki preživljajo svoj prosti čas, da vam prinašajo najboljšo uporabniško izkušnjo. Pomagajte razvijalcem pri izdelavi še boljšega NewPipe-a medtem ko uživajo skodelico kave. Pritisni \"končano\" ko je rešena @@ -382,7 +380,7 @@ Prijavite na GitHub-u Kopiraj oblikovano poročilo Odobrite dovoljenje, da se ta aplikacija prikaže pred drugimi aplikacijami - Ali želite obnoviti privzete vrednosti\? + Ali želite obnoviti privzete vrednosti? Povrni privzeto Nobeden pretok ni na voljo za prenos Ime datoteke ne sme biti prazno @@ -394,7 +392,7 @@ Zunanja shramba ni na voljo Izbriše zgodovino ključnih besed za iskanje Položaji predvajalnika so bili izbrisani - Ali želite izbrisati vse položaje predvajalnika\? + Ali želite izbrisati vse položaje predvajalnika? Izbriše vse položaje predvajalnika Izbriši položaje predvajalnika Izbriše zgodovino predvajanih videoposnetkov in položajev predvajalnika @@ -409,9 +407,7 @@ Dogodki Posnetki Videoposnetki - Ta video ima omejitev starosti. -\n -\nVklopite \"%1$s\" v nastavitvah, če ga želite predvajati. + Ta video ima omejitev starosti. \n \nVklopite \"%1$s\" v nastavitvah, če ga želite predvajati. Youtube ponuja \"omejeni način\", ki skrije potencialno vsebino za odrasle Vklop YouTubovega \"omejenega načina\" Prikaz vsebin, ki so morda neprimerne za otroke zaradi omejitve starosti (kot na primer 18+) @@ -423,7 +419,7 @@ Izberite vaše najljubše instance PeerTuba Instance PeerTube Privzeta država vsebine - URL-ja ni bilo mogoče prepoznati. Želite odpreti z drugo aplikacijo\? + URL-ja ni bilo mogoče prepoznati. Želite odpreti z drugo aplikacijo? Pokaži nasvet, ko boste pritisnili na ozadje ali pojavno okno v \"Podrobnosti:\" Samodejno predvajanje Pokaži indikator položaja predvajalnika na seznamih diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index 34ebeada7..796a52b28 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -53,7 +53,7 @@ Isticmaal muuqaal daare dibada ah Ku La wadaag Kutusaya natiijooyinka: %s - Ma waxaad ka waday \"%1$s\"\? + Ma waxaad ka waday \"%1$s\"? Fadhiga Daji midka socda La wadaag @@ -62,7 +62,7 @@ Ka noqo Ku shub Wax fura lama helin shaygan. (waxaad Ku shuban kartaa VLC si aad u furto). - Wax fura lama helin shaygan. Ku shubo VLC\? + Wax fura lama helin shaygan. Ku shubo VLC? Lasoo galiyay: %1$s Ku dhufo raadinta si aad wax uraadiso. Shay magacan leh ayaa horay ujiray @@ -109,7 +109,7 @@ Galkii xulka waa la baddalay. La xulay Xulka waa la sameeyay - Saar xulkan\? + Saar xulkan? Ka saar calaamadsashada Calaamadso Xulka Ku fadhiisi galka xulka @@ -140,7 +140,7 @@ Cusub oo Shiddan 50ka Sare Faallooyinka lama soo kicin karo - Inaad sidoo kale fadhiga soo galiso ma rabtaa\? + Inaad sidoo kale fadhiga soo galiso ma rabtaa? Tani waxay baddali fadhiga siduu kuu yahay hadda. Digniin: Lama soowada galin karo faylashoo dhan. Shay ZIP ah oo sax ah majiro @@ -159,15 +159,14 @@ Bogga guud Badanaa La Daawado U Dambeeyay ee La Daawaday - Ma rabtaa inaad ka saarto shaygan kaydka wixii la raadiyay\? + Ma rabtaa inaad ka saarto shaygan kaydka wixii la raadiyay? Wixii Hore Liisanka akhri NewPipe waa copyleft software libre: Waad isticmaali kartaa, baran kartaa, wadaagi kartaa, oo waad hagaajin kartaa markaad doonto. Gaar ahaan waad dib u qaybin kartaa oo/ama wax ka beddeli kartaa iyada oo la raacayo shuruudaha GNU General Public License sida ay daabacday Mu\'asasada Software-ka Xorta ah, nooca 3 ee shatiga, ama (doorashadaada) nooc kasta oo dambe. Siyaasadda Arrimaha Khaaska ah ee NewPipe Shatiga NewPipe Akhri siyaasadda asturnaanta - Mashruuca NewPipe sir dhawrkaaga aad ayuu u qiimeeyaa. Sidaas darteed, App-ku wax xogtaada ah ma uruuriyo fasax la\'aan. -\nSiyaasada sir-dhawrka NewPipe ayaa si faahfaahsan u sharaxda wixii xog ah ee la diro lana kaydiyo markaad cilad farsamo wariso. + Mashruuca NewPipe sir dhawrkaaga aad ayuu u qiimeeyaa. Sidaas darteed, App-ku wax xogtaada ah ma uruuriyo fasax la\'aan. \nSiyaasada sir-dhawrka NewPipe ayaa si faahfaahsan u sharaxda wixii xog ah ee la diro lana kaydiyo markaad cilad farsamo wariso. Booqo Mareegta NewPipe si aad u hesho macluumaad dheeraad ah iyo warar. Mareegta internetka Soo celi @@ -193,8 +192,7 @@ Taabo \"Dhameeyay\" ✅ markaad xaliso Tijaabada reCAPTCHA 1 shay ayaa la saaray. - Ogolaanshahan ayaa loo baahan yahay si -\nloogu furo qaabka daaqada + Ogolaanshahan ayaa loo baahan yahay si \nloogu furo qaabka daaqada Fadlan khaanada wax lagu dajin doono hadhawto xaga fadhiga kasoo dooro Dhakada ayaa lagu qabtay Fadlan sug… @@ -265,7 +263,7 @@ Khaladkan email ahaan uga war bixi Waan ka xunahay, sidaa inay dhacdo ma ahayn. U ogolow appka inuu dul fuulo applicationada kale - Ma rabtaa inaad sidii hore kuceliso\? + Ma rabtaa inaad sidii hore kuceliso? Dib ugu celi sidii hore Lama akhrin karo daaqadihii la kaydiyay, …isticmaalaya kuwii app-ku kusoo baxay Wax la dajiyo lama heli karo @@ -287,15 +285,15 @@ Lama furi karo website-ka Lama soo wada kicin karo galalkoo dhan khalad xaga khadka ah - Ku dajinta kaydka dibadda (mimoriga) suurtogal ma aha. Dib u fadhiisi khaanada wax lagu dajiyo\? + Ku dajinta kaydka dibadda (mimoriga) suurtogal ma aha. Dib u fadhiisi khaanada wax lagu dajiyo? Kaydka dibadda lama heli karo Khalad Wixii la raadiyay waa la tirtiray - Tirtir dhamaan wixii la raadiyay\? + Tirtir dhamaan wixii la raadiyay? Wuxuu tirtiraa kaydka wixii lagu qoray xaga raadinta Meelihii ay marayeen waa la tirtiray Tirtir wixii la raadiyay - Tirtir dhamaan meelaha ay kuu marayeen\? + Tirtir dhamaan meelaha ay kuu marayeen? Wuxuu tirtiraa meelihii ay kuu marayeen waxyaabaha aad furtay oo dhan Tirtir meelaha ay marayaan Kaydka @@ -315,7 +313,7 @@ Muuqaalo Dhammaan Kaydka wixii ladaawaday waa la tirtiray - Tirtir gabi ahaan kaydka wixii ladaawaday\? + Tirtir gabi ahaan kaydka wixii ladaawaday? Wuxuu tirtiraa kaydka wixii la daaray iyo meelihii ay kuu marayeen Nadiifi kaydka wixii ladaawaday Nadiifi kaydka uu NewPipe kaydiyo markaad xaliso reCAPTCHA @@ -342,9 +340,7 @@ Tayada ugu fiican Bandhigyo Warcelin khalad - Muuqaalkan da\'da qofka ayuu ku xidhanyahay. -\n -\nKasoo fur \"%1$s\" xaga fadhiga hadaad rabto inaad aragto. + Muuqaalkan da\'da qofka ayuu ku xidhanyahay. \n \nKasoo fur \"%1$s\" xaga fadhiga hadaad rabto inaad aragto. YouTube-ku wuxuu leeyahay nidaamka \"Qaabka Xadidan\" kaasoo qariya waxyaabo laga yaabo ineysa haboonayn Fur \"Qaabka Xadidan\" Soo bandhig waxyaabaha laga yaabo inaysa ku haboonayn caruurta sababtoo ah waxay ku xidhan yihiin da\'da qofka (sida 18+) @@ -369,7 +365,7 @@ Qaybaha PeerTube Luuqada muuqaalka/dhagaysiga Wadanka muuqaalada/dhagaysiga - Lama aqoonsan karo tixraacan. Ku fur app kale\? + Lama aqoonsan karo tixraacan. Ku fur app kale? Tixraac aan la furi karin Tus sharaxaada marka la riixayo batoonka xaga dambe ama midka daaqada ee ku yaala xaga \"Faahfaahinta:\" muuqaalka Tus sharaxaada \"Farta ku hay si aad iskugu darto\" @@ -443,20 +439,8 @@ Sameeyay %s Waxaa sameeyay %s Waxa u saaran kanaalka - Shaygan wali NewPipe ma taageerin. -\n -\nMustaqbalka in la taageero ayaa la rajaynayaa. - Soo kicinta bandhiggu aad miyuu u daahayaa\? Haday saas tahay, iskuday furashada qaabka dagdaga ah (waxaad ka baddali kartaa xaga fadhiga ama adoo riixaya batoonka hoose). -\n -\nNewPipe wuxuu leeyahay laba qaab oo uu bandhiga usoo furo: -\n• Soo kicinta dhamaan rukunka kanaalka, taasoo ah mid culus laakiin dhamaystiran. -\n• Inuu isticmaalo adeeg hawshan loogu talagalay, taasoo ah mid dagdaga ah laakiin badanaa aan dhamaystirnayn. -\n -\nFarqiga labadan u dhexeeya ayaa ah in midka dagdaga ah uu la\'yahay xogta shayga qaar, sida intuu shaygu socdo ama nooca (mana kala garan karo muuqaalada tooska ah iyo kuwa caadiga ah) wuxuuna sidoo kale soodhigi karaa waxyaabo yar. -\n -\nYouTube waa tusaale adeegyada ku bixiya qaabka dagdaga ah xagooda bandhiga RSS -ka. -\n -\nSidaa darteed dookhu wuxuu ku xidhanyahay kolba kaad rabto: adeeg dagdag ah ama wax saxan oo dhamaystiran. + Shaygan wali NewPipe ma taageerin. \n \nMustaqbalka in la taageero ayaa la rajaynayaa. + Soo kicinta bandhiggu aad miyuu u daahayaa? Haday saas tahay, iskuday furashada qaabka dagdaga ah (waxaad ka baddali kartaa xaga fadhiga ama adoo riixaya batoonka hoose). \n \nNewPipe wuxuu leeyahay laba qaab oo uu bandhiga usoo furo: \n• Soo kicinta dhamaan rukunka kanaalka, taasoo ah mid culus laakiin dhamaystiran. \n• Inuu isticmaalo adeeg hawshan loogu talagalay, taasoo ah mid dagdaga ah laakiin badanaa aan dhamaystirnayn. \n \nFarqiga labadan u dhexeeya ayaa ah in midka dagdaga ah uu la\'yahay xogta shayga qaar, sida intuu shaygu socdo ama nooca (mana kala garan karo muuqaalada tooska ah iyo kuwa caadiga ah) wuxuuna sidoo kale soodhigi karaa waxyaabo yar. \n \nYouTube waa tusaale adeegyada ku bixiya qaabka dagdaga ah xagooda bandhiga RSS -ka. \n \nSidaa darteed dookhu wuxuu ku xidhanyahay kolba kaad rabto: adeeg dagdag ah ama wax saxan oo dhamaystiran. Xidh qaabka dagdaga Fur qaabka dagdaga ah Laga heli karo adeegyada qaar, inta badana wuu ka dagdag badanyahay laakiin wuu ka natiijooyin yar yahay inta badana xogtu ma dhamaystirna (tusaale intuu shaygu soconayo ma tusayo, nooca shayga sidoo kale, mana sheegayo inuu muuqaalku toos yahay) @@ -465,7 +449,7 @@ Wakhtiga cusboonaysiinta udambaysa ee bandhigga, ka hor intaan rukunka laga sooqaadin mid duug ah — %s Xadka cusboonaysiinta Rukummada aan kooxaysnayn kaliya - Ma rabtaa inaad kooxdan saarto\? + Ma rabtaa inaad kooxdan saarto? Magac kooxeed madhan Wax rukun ah lama dooran Dooro rukummada @@ -499,8 +483,7 @@ Dooro qayb \'Storage Access Framework\' loosoo gaabiyo SAF wuxuu suurto galiyaa in mimoriga wax lagu dajiyo Maamulaha faylasha ee aallada (SAF) - Shay walba meesha lagu kaydin doono ayaa lagu waydiin. -\nSoo fur maamulaha faylasha aallada (SAF) hadaad rabto inaad ku dajiso mimoriga + Shay walba meesha lagu kaydin doono ayaa lagu waydiin. \nSoo fur maamulaha faylasha aallada (SAF) hadaad rabto inaad ku dajiso mimoriga Waydii meesha lagu dajinayo Wada qabo dajinta Wada bilow dajinta @@ -510,7 +493,7 @@ Dhabqinta dajinta (khadka xadidan) Xadka dib-isugudayida Saar dajinta - Ma waxaad rabtaa inaad nadiifiso kaydka wixii lasoo dajiyay (tani ma tirtirto wixii lasoo dajiyay) mise inaad saarto dhammaan wixii lasoo dajiyay\? + Ma waxaad rabtaa inaad nadiifiso kaydka wixii lasoo dajiyay (tani ma tirtirto wixii lasoo dajiyay) mise inaad saarto dhammaan wixii lasoo dajiyay? Nadiifi dajinta Dajintan lama hagaajin karo Ku xidhidii ayaa wakhtigii ka dhacay @@ -535,27 +518,12 @@ Ogaysiis soo bandhig doonaya inaad appka cusboonaysiiso marka mid cusub soo baxo Xadid tayada (khadka SIM-ka) Aqbal - Si loogu hogaansamo Maaraynta Xog Dhawrka Guud ee heer Yurub (GDPR), waxaan halkan kugu xusuusinaynaa siyaasada sirdhawrka NewPipe. Fadlan si taxadar leh u akhriso. -\nWaana inaad aqbashaa si [hadii aad damacdo] aad cilad appka ah warcelin nooga soo dirto. + Si loogu hogaansamo Maaraynta Xog Dhawrka Guud ee heer Yurub (GDPR), waxaan halkan kugu xusuusinaynaa siyaasada sirdhawrka NewPipe. Fadlan si taxadar leh u akhriso. \nWaana inaad aqbashaa si [hadii aad damacdo] aad cilad appka ah warcelin nooga soo dirto. Dheelitirka codka Ka fur (sababi kara isdbadal) - Hawlgalkan wuxuu noqon karaa mid khad badan isticmaala. -\n -\nMa rabtaa inaad sii wado\? - Soogali meesha SoundCloud adoo ku qoraya tixraaca ama ID-gaaga: -\n -\n1. Fur nidaamka \"Desktop mode\" browser-kaaga dhexdiisa (sababtoo ah websitekan moobilada kuma shaqaynayo) -\n2. Booqo tixraacan %1$s -\n3. Gali akoonkaaga marka lagu waydiiyo -\n4. Koobiyee tixraaca boga ee lagugu xawilay. - Soo gali rukumada YouTube-ka: -\n -\n1. Booqo tixraacan: %1$s -\n2. Gali akoonkaaga marka lagu waydiiyo -\n3. Kusii dhufo \"Xogtoo dhan ku dar\", kadibna \"Ha calaamdin dhamaan\" kadibna dooro kaliya \"Rukunka\" oo \"OK\" dheh -\n4. Ku dhufo \"Talaabada xigta\" kadibna \"Samee gudbin\" -\n5. Ku dhufo batoonka \"Daji\" kadib markuu soo muuqdo -\n6. Zip-ka lasoo dajiyay kala furfur faylka .jason (badanaa wuxuu hoos tagaa \" \"YouTube and YouTube Music/subscriptions/subscriptions.json\") kadibna xagan soo gali. + Hawlgalkan wuxuu noqon karaa mid khad badan isticmaala. \n \nMa rabtaa inaad sii wado? + Soogali meesha SoundCloud adoo ku qoraya tixraaca ama ID-gaaga: \n \n1. Fur nidaamka \"Desktop mode\" browser-kaaga dhexdiisa (sababtoo ah websitekan moobilada kuma shaqaynayo) \n2. Booqo tixraacan %1$s \n3. Gali akoonkaaga marka lagu waydiiyo \n4. Koobiyee tixraaca boga ee lagugu xawilay. + Soo gali rukumada YouTube-ka: \n \n1. Booqo tixraacan: %1$s \n2. Gali akoonkaaga marka lagu waydiiyo \n3. Kusii dhufo \"Xogtoo dhan ku dar\", kadibna \"Ha calaamdin dhamaan\" kadibna dooro kaliya \"Rukunka\" oo \"OK\" dheh \n4. Ku dhufo \"Talaabada xigta\" kadibna \"Samee gudbin\" \n5. Ku dhufo batoonka \"Daji\" kadib markuu soo muuqdo \n6. Zip-ka lasoo dajiyay kala furfur faylka .jason (badanaa wuxuu hoos tagaa \" \"YouTube and YouTube Music/subscriptions/subscriptions.json\") kadibna xagan soo gali. Qoraal-hooseed isa-sameeyay La ekaysii @@ -580,8 +548,7 @@ Shaygan wadanka aad joogto looma heli karo. Khalkhali appka Xalli - Muuqaalkan da\'da qofka ayuu ku xidhan yahay. -\nAyadooy ugu wacantahay talaabooyin cusub oo YouTube uu ku qaaday muuqaalada da\'da ku xidhan, NewPipe ma furi karo muuqaalkan. + Muuqaalkan da\'da qofka ayuu ku xidhan yahay. \nAyadooy ugu wacantahay talaabooyin cusub oo YouTube uu ku qaaday muuqaalada da\'da ku xidhan, NewPipe ma furi karo muuqaalkan. Dajintii way bilaabatay Hoos ayaad ka dooran kartaa nashqada habaynkii ee aad door-biday Dooro nashqada habaynkii ee aad doorbiday — %s @@ -609,9 +576,7 @@ Hadda waad dooran kartaa qoraalka ku dhexjira faahfaahinta. Ogow markaad caalamdinayso qoraalka boggu wuu boodboodi karaa tixraacyadana waxay noqon karaan kuwo aan lagu dhufan karin. Akoonka waa lajoojiyay Nidaamka dagdaga ah faahfaahin dheeraad ah uma hayo shaygan. - Akoonka soosaaraha waa la joojiyay. -\nNewPipe ma awoodi doono inuu soo kiciyo bandhiggan mustaqbalka. -\nMa iska joojin rabtaa rukunka kanaalkan\? + Akoonka soosaaraha waa la joojiyay. \nNewPipe ma awoodi doono inuu soo kiciyo bandhiggan mustaqbalka. \nMa iska joojin rabtaa rukunka kanaalkan? Lama soo kicin karo bandhigga: \'%s\'. Khalad ayaa ka dhacay sookicintii Laga bilaabo Android 10 kaliya waxaa la isticmaali \'SAF\' diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 398a6cf45..f3ca31f83 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -9,7 +9,7 @@ Shkarko Kërko Cilësimet - A po mendonit \"%1$s\"\? + A po mendonit \"%1$s\"? Shpërndaje me Shfaq informatat Të rejat @@ -63,8 +63,7 @@ Zgjidhni një instancë \'Storage Access Framework\' lejon shkarkime në një kartë SD të jashtme Përdor zgjedhësin e direktorisë së sistemit (SAF) - Ju do të pyeteni se ku duhet ruajtur çdo shkarkim -\nAktivizoni zgjedhësin e direktorisë së sistemit (SAF) nëse doni t\'i shkarkoni në një kartë SD të jashtme + Ju do të pyeteni se ku duhet ruajtur çdo shkarkim \nAktivizoni zgjedhësin e direktorisë së sistemit (SAF) nëse doni t\'i shkarkoni në një kartë SD të jashtme Pyet se ku duhet shkarkuar Ndërprit shkarkimet Nis shkarkimet @@ -77,7 +76,7 @@ Provat maksimale Ndalo Fshij skedarët e shkarkuar - A dëshironi të boshatisni historikun e shkarkimeve apo të fshini të gjithë skedarët e shkarkuar\? + A dëshironi të boshatisni historikun e shkarkimeve apo të fshini të gjithë skedarët e shkarkuar? Boshatis historikun e shkarkimeve Nuk mund të rikuperohet ky shkarkim Koha e lidhjes skadoi @@ -125,8 +124,7 @@ Pa limit Refuzo Prano - Për të qenë në përputhje me Rregulloren e Përgjithshme Evropiane për Mbrojtjen e të Dhënave (GDPR), ne ju tërheqim vëmendjen tek politika e privatësisë së NewPipe. Ju lutemi lexojeni me kujdes. -\nJu duhet ta pranoni atë për të na dërguar raportin e problemit. + Për të qenë në përputhje me Rregulloren e Përgjithshme Evropiane për Mbrojtjen e të Dhënave (GDPR), ne ju tërheqim vëmendjen tek politika e privatësisë së NewPipe. Ju lutemi lexojeni me kujdes. \nJu duhet ta pranoni atë për të na dërguar raportin e problemit. Rikthe Shkallë Shtyje përpara gjatë momenteve të heshtura @@ -134,24 +132,10 @@ Intonacioni Ritmi Kontrolli i Shpejtësisë së Luajtjes - Duhet të dini se ku veprim mund të jetë i shtrenjtë në kosto interneti. -\n -\nDëshironi të vazhdoni\? + Duhet të dini se ku veprim mund të jetë i shtrenjtë në kosto interneti. \n \nDëshironi të vazhdoni? IDjuaj, soundcloud.com/idjuaj - Importoni një profil nga SoundCloud duke shkruar URL ose ID tuaj: -\n -\n1. Aktivizoni \"modalitetin desktop\" në një shfletues interneti (faqja e internetit nuk është e disponueshme për pajisjet mobile) -\n2. Shkoni tek kjo URL: %1$s -\n3. Hyni kur t\'ju kërkohet -\n4. Kopjoni URL e profilit drejt të cilit u ridrejtuat. - Importoni abonimet nga YouTube përmes Google Takeout: -\n -\n1. Shkoni tek kjo URL: %1$s -\n2. Hyni kur t\'ju kërkohet -\n3. Klikoni në \"All data included\", më pas në \"Deselect all\", dhe më pas zgjidhni vetëm \"subscriptions\" dhe klikoni \"OK\" -\n4. Klikoni në \"Next step\" dhe më pas në \"Create export\" -\n5. Klikoni në butonin \"Download\" pasi të shfaqet dhe -\n6. Nga skedari zip i shkarkuar, ekstraktoni skedarin .json (zakonisht ndodhet tek \"YouTube and YouTube Music/subscriptions/subscriptions.json\") dhe importojeni atë këtu. + Importoni një profil nga SoundCloud duke shkruar URL ose ID tuaj: \n \n1. Aktivizoni \"modalitetin desktop\" në një shfletues interneti (faqja e internetit nuk është e disponueshme për pajisjet mobile) \n2. Shkoni tek kjo URL: %1$s \n3. Hyni kur t\'ju kërkohet \n4. Kopjoni URL e profilit drejt të cilit u ridrejtuat. + Importoni abonimet nga YouTube përmes Google Takeout: \n \n1. Shkoni tek kjo URL: %1$s \n2. Hyni kur t\'ju kërkohet \n3. Klikoni në \"All data included\", më pas në \"Deselect all\", dhe më pas zgjidhni vetëm \"subscriptions\" dhe klikoni \"OK\" \n4. Klikoni në \"Next step\" dhe më pas në \"Create export\" \n5. Klikoni në butonin \"Download\" pasi të shfaqet dhe \n6. Nga skedari zip i shkarkuar, ekstraktoni skedarin .json (zakonisht ndodhet tek \"YouTube and YouTube Music/subscriptions/subscriptions.json\") dhe importojeni atë këtu. Nuk arritën të eksportohen abonimet Nuk arritën të importohen abonimet Eksportimi i kaluar @@ -174,7 +158,7 @@ Pamja statike e listës së luajtjes u ndryshua. E shtuar në listën e luajtjes Lista e luajtjes u krijua - Të fshihet kjo listë luajtjeje\? + Të fshihet kjo listë luajtjeje? Hiq Shenjuesin Shenjoje Listën e Luajtjes Vendose si pamjen statike të listës së luajtjes @@ -208,7 +192,7 @@ Top 50 E trendit Nuk mundën të ngarkohen komentet - A dëshironi që të importoni dhe aranzhimet gjithashtu\? + A dëshironi që të importoni dhe aranzhimet gjithashtu? Kjo do të mbishkruajë strukturimin tuaj të tanishëm. Kujdes: Nuk arritën të importohen të gjithë skedarët. Nuk është skedar ZIP i vlefshëm @@ -225,14 +209,13 @@ Përmbajtja e faqes kryesore Më të Luajturat Luajtur së Fundmi - Doni ta fshini këtë objekt nga historiku i kërkimeve\? + Doni ta fshini këtë objekt nga historiku i kërkimeve? Historiku Historiku Lexo licensën Licensa e NewPipe Lexoni politikën e privatësisë - Projekti NewPipe e merr privatësinë tuaj seriozisht. Kështu, aplikacioni nuk mbledh të dhëna pa dijeninë tuaj. -\nPolitika e privatësisë së NewPipe shpjegon në detaje se çfarë të dhënat dërgohen dhe ruhen kur ju dërgoni një raport dështimi/crash. + Projekti NewPipe e merr privatësinë tuaj seriozisht. Kështu, aplikacioni nuk mbledh të dhëna pa dijeninë tuaj. \nPolitika e privatësisë së NewPipe shpjegon në detaje se çfarë të dhënat dërgohen dhe ruhen kur ju dërgoni një raport dështimi/crash. Politika e Privatësisë së NewPipe Shfletoni faqen e internetit të NewPipe për më tepër informacion dhe lajme. Faqja e internetit @@ -259,8 +242,7 @@ Shtyp \"U bë\" kur ta zgjidhni sfida reCAPTCHA 1 objekt u fshi. - Kjo leje duhet për -\nt\'u hapur në modalitetin popup + Kjo leje duhet për \nt\'u hapur në modalitetin popup Ju lutemi vendosni një dosje shkarkimi më vonë nga aranzhimet U kopjua në tabelën e kopjeve Ju lutem prisni… @@ -315,7 +297,7 @@ Raportoni këtë problem përmes e-mailit Na vjen keq, kjo nuk duhej të ndodhte. Jepni leje për tu shfaqur mbi aplikacionet e tjera - A doni të riktheheni në gjendjen fillestare\? + A doni të riktheheni në gjendjen fillestare? Kthe në gjendjen fillestare Nuk arritën të lexohen tab-et e ruajtura, do përdoren të paravendosurat Nuk ka streams të disponueshme për shkarkim @@ -342,7 +324,7 @@ Përdorni lexues video të jashtëm Shkarko skedarin stream Hape në modalitetin popup - Nuk u gjend lexues për stream. Instalo VLC\? + Nuk u gjend lexues për stream. Instalo VLC? %s video %s video @@ -361,22 +343,10 @@ Popup Pistë - Mendoni se lista po ngarkohet shumë ngadalë\? Nëse po, provoni të aktivizoni ngarkimin e shpejtë (ju mund ta ndryshoni tek aranzhimet ose duke shtypur butonin më poshtë). -\n -\nNewPipe ofron dy strategji të ndryshme të ngarkimit: -\n• Të merret i gjithë kanali i abonuar, më e ngadaltë por e plotë -\n• Të përdoret një shërbim i dedikuar, i cili është i shpejtë por jo i plotë. -\n -\nNdryshimi midis të dyjave është se i shpejti zakonisht ka më pak informacion, si psh kohëzgjatja e objektit apo lloji (nuk mund të bëjë dallimin midis videove në kohë reale apo atyre normale) dhe mund të kthejë më pak objekte. -\n -\nYouTube është një shembull i një shërbimi i cili e ofron këtë metodë të shpejtë me anë të listës së vetë RSS. -\n -\nSi përfundim, zgjedhja mbetet në dorën tuaj dhe se çfarë ju preferoni: shpejtësi apo informacion të saktë. + Mendoni se lista po ngarkohet shumë ngadalë? Nëse po, provoni të aktivizoni ngarkimin e shpejtë (ju mund ta ndryshoni tek aranzhimet ose duke shtypur butonin më poshtë). \n \nNewPipe ofron dy strategji të ndryshme të ngarkimit: \n• Të merret i gjithë kanali i abonuar, më e ngadaltë por e plotë \n• Të përdoret një shërbim i dedikuar, i cili është i shpejtë por jo i plotë. \n \nNdryshimi midis të dyjave është se i shpejti zakonisht ka më pak informacion, si psh kohëzgjatja e objektit apo lloji (nuk mund të bëjë dallimin midis videove në kohë reale apo atyre normale) dhe mund të kthejë më pak objekte. \n \nYouTube është një shembull i një shërbimi i cili e ofron këtë metodë të shpejtë me anë të listës së vetë RSS. \n \nSi përfundim, zgjedhja mbetet në dorën tuaj dhe se çfarë ju preferoni: shpejtësi apo informacion të saktë. Detyroni raportimin e përjashtimeve Rx të padërgueshme jashtë fragmentit apo ciklit jetësor të aktivitetit pas hedhjes NewPipe është program i lirë copyleft: Ju mund ta përdorni, ta studioni, ta ndani me të tjerët dhe ta përmirësoni sipas dëshirës. Specifikisht ju mund ta rishpërndani dhe/ose ta modifikoni sipas kushteve të Licensës GNU General Public siç është publikuar nga Fondacioni për Softuerin e Lirë (FSF), sipas versionit 3 të Licensës, ose (sipas mundësive tuaja) në një version më të ri. - Kjo përmbajtje nuk është ende e mbështetur nga NewPipe. -\n -\nShpresojmë se do të mbështetet në një version të ardhshëm. + Kjo përmbajtje nuk është ende e mbështetur nga NewPipe. \n \nShpresojmë se do të mbështetet në një version të ardhshëm. Çaktivizo Aktivizo modalitetin e shpejtë E disponueshme në disa shërbime, zakonisht është shumë më e shpejtë por mund të kthejë një numër të limituar objektesh dhe shpesh informacion të paplotë (psh. pa kohëzgjatje, lloj objekti, status në kohë reale) @@ -386,7 +356,7 @@ Pragu i përditësimit të listës Lista E re - A doni ta fshini këtë grup\? + A doni ta fshini këtë grup? Emër bosh i grupit Nuk u gjendën stream për video Luajtësit e jashtëm nuk i mbështesin këto lloje ndërlidhjesh @@ -399,19 +369,19 @@ Nuk u arrit të analizohej faqja Nuk u mundën të ngarkoheshin të gjitha pamjet statike Problem rrjeti - Shkarkimi në kartën SD të jashtme nuk ishte i mundur. Doni të rivendosni vendndodhjen e dosjes së shkarkimeve\? + Shkarkimi në kartën SD të jashtme nuk ishte i mundur. Doni të rivendosni vendndodhjen e dosjes së shkarkimeve? Magazina e jashtme u padisponueshme Gabim Historiku i kërkimeve u fshi - Doni të fshini të gjithë historikun e kërkimeve\? + Doni të fshini të gjithë historikun e kërkimeve? Fshin historikun e fjalëve kyçe të kërkuara Fshini historikun e kërkimeve Pozicionet e luajtjeve u fshinë - Doni të fshini të gjitha pozicionet e luajtjeve\? + Doni të fshini të gjitha pozicionet e luajtjeve? Fshini të gjitha pozicionet e luajtjeve Fshini pozicionin e luajtjes Historiku i videove të luajtura u fshi - Doni të fshini të gjithë historikun e videove të luajtura\? + Doni të fshini të gjithë historikun e videove të luajtura? Fshin historikun e stream-ave të luajtura dhe pozicioneve të luajtjes Pastro historinë e videove të luajtura Eksporto historikun, abonimet, listat e luajtjes dhe mundësimet @@ -444,9 +414,7 @@ Listat e videove Kanalet Në kohë reale - Kjo video ka kufizime moshe. -\n -\nAktivizoni \"%1$s\" tek aranzhimet nëse doni ta shihni. + Kjo video ka kufizime moshe. \n \nAktivizoni \"%1$s\" tek aranzhimet nëse doni ta shihni. Shfaq përmbajtjet me moshë të kufizuar Duke luajtur në modalitetin popup Duke luajtur në sfond @@ -496,7 +464,7 @@ Formati i parazgjedhur audio Shfaq një opsion për të luajtur videot përmes Kodi Shfaq opsionin \"Luaj me Kodi\" - Instaloni aplikacionin Kore që mungon\? + Instaloni aplikacionin Kore që mungon? Vetëm disa pajisje mund të luajnë video 2K/4K Shfaq rezolucione më të larta Rezolucioni i parazgjedhur i popup @@ -529,7 +497,7 @@ Kurrë Nise luajtjen automatikisht — %s Lista e luajtjes - Nuk u njoh URL. Të hapet me një aplikacion tjetër\? + Nuk u njoh URL. Të hapet me një aplikacion tjetër? Listë automatike luajtjeje Lista aktive e luajtjes do të zëvendësohet Kalimi nga një luajtës në një tjetër mund të zëvendësojë listën tuaj të luajtjes @@ -602,9 +570,7 @@ Kjo përmbajtje nuk është e disponueshme në shtetin tuaj. Përdor pamje statike për sfondin e ekranit të kyçur si dhe për njoftimet Modaliteti i feed-it të shpejtë nuk mundëson më tepër informacion mbi këtë. - Llogaria e autorit është bllokuar. -\nNewPipe nuk do mund ta ngarkojë këtë feed në të ardhmen. -\nA doni të ç\'abonoheni nga ky kanal\? + Llogaria e autorit është bllokuar. \nNewPipe nuk do mund ta ngarkojë këtë feed në të ardhmen. \nA doni të ç\'abonoheni nga ky kanal? Nuk u arrit të ngarkohej feed-i për \'%s\'. Gabim gjatë ngarkimit të feed-it Duke nisur nga Android 10 vetëm \'Storage Access Framework\' është i mbështetur @@ -617,8 +583,7 @@ Shfaq detajet e kanalit Zgjidh Nuk ka ende një skedar të zgjedhur të shkarkimeve, zgjidheni skedarin e paravendosur tani - Kjo video është e kufizuar në moshë. -\nPër shkak të politikave të reja të YouTube në lidhje me videot e kufizuara në moshë, NewPipe nuk mund të aksesojë asnjë nga videot dhe nuk mund t\'i luajë ato. + Kjo video është e kufizuar në moshë. \nPër shkak të politikave të reja të YouTube në lidhje me videot e kufizuara në moshë, NewPipe nuk mund të aksesojë asnjë nga videot dhe nuk mund t\'i luajë ato. Tema e natës E pëlqyer nga krijuesi Mos shfaq @@ -635,7 +600,7 @@ Kartë Panjohur Format i panjohur - Hiq duplikatet\? + Hiq duplikatet? Së shpejti Te shikuara në plotësi Gjysmë të shikuar diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index 967e643d8..8113fd2dc 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -9,14 +9,14 @@ Преузми Претрага Подешавања - Да ли сте мислили: „%1$s“\? + Да ли сте мислили: „%1$s“? Делите помоћу Фолдер за преузимање видео снимака Преузети видео снимци се чувају овде Изаберите фолдер за преузимање видео снимака Подразумевана резолуција Пусти помоћу Kodi-ја - Инсталирати апликацију Kore која недостаје\? + Инсталирати апликацију Kore која недостаје? Прикажи опцију „Пусти помоћу Kodi-ја“ Прикажите опцију за пуштање видео снимака преко Kodi медија центра Аудио снимак @@ -84,8 +84,7 @@ Црна Све Отвори у искачућем облику - Ова дозвола је потребна за -\nотварање у искачућем режиму + Ова дозвола је потребна за \nотварање у искачућем режиму Пуштање у режиму искачућег прозора Онемогућено Подразумевани формат видео снимка @@ -164,7 +163,7 @@ Није могуће пустити овај ток Дошло је до непоправљиве грешке плејера Опорављање од грешке плејера - Желите ли да избришете ову ставку из историје претраге\? + Желите ли да избришете ову ставку из историје претраге? Садржај главне странице Празна страница Киоск страница @@ -214,8 +213,7 @@ Изаберите инстанцу „Storage Access Framework“ омогућава преузимање на спољну, SD (меморијску), картицу Користи системски бирач фолдера (SAF) - Бићете упитани где желите да сачувате свако преузимање. -\nОмогућите системски бирач фолдера (SAF), ако желите да преузмете на спољну, SD (меморијску), картицу + Бићете упитани где желите да сачувате свако преузимање. \nОмогућите системски бирач фолдера (SAF), ако желите да преузмете на спољну, SD (меморијску), картицу Питај где да се преузме Паузирај преузимања Започни преузимања @@ -228,7 +226,7 @@ Највише покушаја Заустави Избриши преузете фајлове - Желите ли да очистите историју преузимања или избришете све преузете фајлове\? + Желите ли да очистите историју преузимања или избришете све преузете фајлове? Очисти историју преузимања Није могуће опоравити ово преузимање Веза је истекла @@ -280,8 +278,7 @@ Одбиј Без ограничења Прихвати - Да бисмо били у складу са Европском општом уредбом о заштити података (GDPR), скрећемо вам пажњу на политику приватности NewPipe-а. Пажљиво је прочитајте. -\nМорате је прихватити да бисте нам послали извештај о грешци. + Да бисмо били у складу са Европском општом уредбом о заштити података (GDPR), скрећемо вам пажњу на политику приватности NewPipe-а. Пажљиво је прочитајте. \nМорате је прихватити да бисте нам послали извештај о грешци. Ресетуј Корак Премотавање унапред током тишине @@ -289,25 +286,10 @@ Висина тона Брзина Контроле брзине репродукције - Имајте на уму да ова операција може потрошити доста података. -\n -\nЖелите ли да наставите\? + Имајте на уму да ова операција може потрошити доста података. \n \nЖелите ли да наставите? ВашID, soundcloud.com/yourid - Увезите SoundCloud профил тако што ћете откуцати URL адресу или свој ID: -\n -\n1. Омогућите „верзију сајта за рачунар“ у веб-прегледачу (сајт није доступан за мобилне уређаје) -\n2. Идите на ову URL адресу: %1$s -\n3. Пријавите се када се то од вас затражи -\n4. Копирајте URL адресу профила на који сте преусмерени. - Увезите YouTube праћења из Google Takeout-а: -\n -\n1. Идите на ову URL адресу: %1$s -\n2. Пријавите се када се то од вас затражи -\n3. Кликните на „Сви подаци укључени“, затим на „Опозови све“, затим изаберите само „праћења“ и кликните на „ У реду“ -\n4. Кликните на „Следећи корак“, а затим на „Направи извоз“ -\n5. Кликните на дугме „Преузми“ након што се појави -\n6. Кликните на УВЕЗИ ФАЈЛ испод и изаберите преузети .zip фајл -\n7. [Ако увоз .zip не успе] Извуците .csv фајл (обично под „YouTube and YouTube Music/subscriptions/subscriptions.csv“), кликните на УВЕЗИ ФАЈЛ испод и изаберите извучени csv фајл + Увезите SoundCloud профил тако што ћете откуцати URL адресу или свој ID: \n \n1. Омогућите „верзију сајта за рачунар“ у веб-прегледачу (сајт није доступан за мобилне уређаје) \n2. Идите на ову URL адресу: %1$s \n3. Пријавите се када се то од вас затражи \n4. Копирајте URL адресу профила на који сте преусмерени. + Увезите YouTube праћења из Google Takeout-а: \n \n1. Идите на ову URL адресу: %1$s \n2. Пријавите се када се то од вас затражи \n3. Кликните на „Сви подаци укључени“, затим на „Опозови све“, затим изаберите само „праћења“ и кликните на „ У реду“ \n4. Кликните на „Следећи корак“, а затим на „Направи извоз“ \n5. Кликните на дугме „Преузми“ након што се појави \n6. Кликните на УВЕЗИ ФАЈЛ испод и изаберите преузети .zip фајл \n7. [Ако увоз .zip не успе] Извуците .csv фајл (обично под „YouTube and YouTube Music/subscriptions/subscriptions.csv“), кликните на УВЕЗИ ФАЈЛ испод и изаберите извучени csv фајл Није могуће извести праћења Није могуће увести праћења Претходни извоз @@ -335,7 +317,7 @@ Сличица плејлисте је промењена. Додато на плејлисту Плејлиста је направљена - Избрисати ову плејлисту\? + Избрисати ову плејлисту? Обележи плејлисту Уклони обележивач Постави као сличицу плејлисте @@ -365,7 +347,7 @@ Недавно додато Локално Није могуће учитати коментаре - Желите ли да увезете и подешавања\? + Желите ли да увезете и подешавања? Ово ће заменити ваше тренутно подешавање. Упозорење: Није могуће увести све фајлове. Нема важећег ZIP фајла @@ -379,8 +361,7 @@ Последње пуштано NewPipe је слободан софтвер за копирање: Можете га користити, проучавати, делити и побољшавати по жељи. Конкретно, можете га поново дистрибуирати и/или модификовати под условима GNU Опште јавне лиценце коју је објавила Фондација за слободни софтвер, било верзију 3 лиценце или (по вашем избору) било коју каснију верзију. Прочитај политику приватности - Пројекат NewPipe веома озбиљно схвата вашу приватност. Стога, апликација не прикупља никакве податке без вашег пристанка. -\nПолитика приватности NewPipe-а детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о отказивању апликације. + Пројекат NewPipe веома озбиљно схвата вашу приватност. Стога, апликација не прикупља никакве податке без вашег пристанка. \nПолитика приватности NewPipe-а детаљно објашњава који се подаци шаљу и чувају када пошаљете извештај о отказивању апликације. Политика приватности NewPipe-а Готово Реши @@ -415,7 +396,7 @@ Копирајте форматирани извештај Дајте дозволу за приказивање преко других апликација Врати подразумеване вредности - Желите ли да вратите подразумеване вредности\? + Желите ли да вратите подразумеване вредности? Није могуће прочитати сачуване картице, тако да се користе подразумеване Нема токова доступних за преузимање Дошло је до грешке: %1$s @@ -427,18 +408,18 @@ Нису пронађени видео токови Нису пронађени аудио токови Спољни плејери не подржавају ове врсте линкова - Преузимање на спољну, SD (меморијску), картицу није могуће. Ресетовати локацију фолдера за преузимање\? + Преузимање на спољну, SD (меморијску), картицу није могуће. Ресетовати локацију фолдера за преузимање? Спољна меморија није доступна Историја претраге је избрисана - Избрисати целу историју претраге\? + Избрисати целу историју претраге? Брише историју кључних речи за претрагу Очисти историју претраге Позиције репродукције су избрисане - Избрисати све позиције репродукције\? + Избрисати све позиције репродукције? Брише све позиције репродукције Избриши позиције репродукције Историја гледања је избрисана - Избрисати целу историју гледања\? + Избрисати целу историју гледања? Брише историју пуштаних токова и позиције репродукције Очисти историју гледања Чисти колачиће које NewPipe чува када решите „reCAPTCHA“ @@ -466,11 +447,8 @@ Видео снимци Плејлисте Канали - Овај видео снимак је старосно ограничен. -\nЗбог нових YouTube смерница за старосно ограничене видео снимке, NewPipe не може да им приступи, па није у могућности да их пушта. - Овај видео снимак је старосно ограничен. -\n -\nУкључите „%1$s“ у подешавањима, ако желите да га видите. + Овај видео снимак је старосно ограничен. \nЗбог нових YouTube смерница за старосно ограничене видео снимке, NewPipe не може да им приступи, па није у могућности да их пушта. + Овај видео снимак је старосно ограничен. \n \nУкључите „%1$s“ у подешавањима, ако желите да га видите. YouTube омогућава „Ограничени режим“ који скрива потенцијални садржај за одрасле Укључи YouTube-ов „Ограничени режим“ Приказивање садржаја који можда није прикладан за децу, јер има старосну границу (попут 18+) @@ -483,7 +461,7 @@ Пронађите инстанце које вам се свиђају на %s PeerTube инстанце Изаберите своје омиљене PeerTube инстанце - URL адреса није препозната. Отворити помоћу друге апликације\? + URL адреса није препозната. Отворити помоћу друге апликације? Аутоматско пуштање Чишћење података Прикажите индикаторе положаја репродукције на листама @@ -540,20 +518,8 @@ Од %s Направио %s Сличица аватара канала - NewPipe још увек не подржава овај садржај. -\n -\nНадамо се да ће бити подржан у будућој верзији. - Мислите ли да је учитавање фида превише споро\? Ако јесте, покушајте да омогућите брзо учитавање (можете га променити у подешавањима или притиском на дугме испод). -\n -\nNewPipe нуди две стратегије учитавања фида: -\n• Прикупљање целог претплатничког канала, што је споро, али потпуно. -\n• Коришћење наменске крајње тачке услуге, која је брза, али обично није потпуна. -\n -\nРазлика између њих је у томе што брзом начину обично недостају неке информације, као што је трајање или врста ставке (не могу да се разликују видео снимци уживо и нормални) и може да врати мање ставки. -\n -\nYouTube је пример услуге која нуди ову брзу методу са својим RSS фидом. -\n -\nДакле, избор се своди на оно што ви преферирате: брзину или прецизне информације. + NewPipe још увек не подржава овај садржај. \n \nНадамо се да ће бити подржан у будућој верзији. + Мислите ли да је учитавање фида превише споро? Ако јесте, покушајте да омогућите брзо учитавање (можете га променити у подешавањима или притиском на дугме испод). \n \nNewPipe нуди две стратегије учитавања фида: \n• Прикупљање целог претплатничког канала, што је споро, али потпуно. \n• Коришћење наменске крајње тачке услуге, која је брза, али обично није потпуна. \n \nРазлика између њих је у томе што брзом начину обично недостају неке информације, као што је трајање или врста ставке (не могу да се разликују видео снимци уживо и нормални) и може да врати мање ставки. \n \nYouTube је пример услуге која нуди ову брзу методу са својим RSS фидом. \n \nДакле, избор се своди на оно што ви преферирате: брзину или прецизне информације. Онемогући брзи режим Омогући брзи режим Доступан у неким услугама, обично је много бржи, али може да врати ограничену количину ставки и често непотпуне информације (нпр. нема трајања, врсте ставке, нема статуса уживо) @@ -564,7 +530,7 @@ Фид Прикажи само негруписана праћења Нова - Желите ли да избришете ову групу\? + Желите ли да избришете ову групу? Празан назив групе %d изабран @@ -620,9 +586,7 @@ Сада можете изабрати текст унутар описа. Имајте на уму да страница може треперети и да се на линкове можда неће моћи кликнути док сте у режиму избора. Налог укинут Режим брзог фида не пружа више информација о овоме. - Налог аутора је укинут. -\nNewPipe убудуће неће моћи да учита овај фид. -\nЖелите ли да прекинете праћење овог канала\? + Налог аутора је укинут. \nNewPipe убудуће неће моћи да учита овај фид. \nЖелите ли да прекинете праћење овог канала? Није могуће учитати фид за „%s“. Грешка при учитавању фида Од Android-а 10 само „Storage Access Framework“ је подржан @@ -668,7 +632,7 @@ Прикажи траку са грешком Учесталост провере Картица - Уклонити дупликате\? + Уклонити дупликате? Желите ли да уклоните све дупликате токова на овој плејлисти? Предстојеће Подешавања ExoPlayer-а @@ -688,7 +652,7 @@ Полутон Обавештавање о новим токовима из праћења Провера ажурирања… - Избрисати све преузете фајлове са диска\? + Избрисати све преузете фајлове са диска? Уклони дупликате Прикачен коментар ExoPlayer подразумевано @@ -737,8 +701,7 @@ Проценат Користите најновију верзију NewPipe-а Не приказуј - Није пронађен одговарајући менаџер фајлова за ову радњу. -\nИнсталирајте менаџер фајлова или покушајте да онемогућите „%s“ у подешавањима преузимања + Није пронађен одговарајући менаџер фајлова за ову радњу. \nИнсталирајте менаџер фајлова или покушајте да онемогућите „%s“ у подешавањима преузимања Често постављана питања Приказује опцију рушења, када користите плејер @@ -746,8 +709,7 @@ Избрисано је %1$s преузимања Избрисано је %1$s преузимања - Није пронађен одговарајући менаџер фајлова за ову радњу. -\nИнсталирајте менаџер фајлова компатибилан са Storage Access Framework-ом + Није пронађен одговарајући менаџер фајлова за ову радњу. \nИнсталирајте менаџер фајлова компатибилан са Storage Access Framework-ом Срце од стране креатора Обавештења су онемогућена Добијајте обавештења @@ -757,9 +719,7 @@ синхронизовани Управљајте неким подешавањима ExoPlayer-а. Ове промене захтевају рестартовање плејера да би се примениле Преферирај оригинални аудио снимак - Ово заобилазно решење ослобађа и поново инстанцира кодеке видео снимка када дође до промене површине, уместо да се површина директно поставља на кодек. ExoPlayer већ користи ово на неким уређајима са овим проблемом, ово подешавање утиче само на Android 6 и новије верзије. -\n -\nОмогућавање ове опције може спречити грешке при репродукцији приликом пребацивања тренутног плејера видео снимака или преласка на цео екран + Ово заобилазно решење ослобађа и поново инстанцира кодеке видео снимка када дође до промене површине, уместо да се површина директно поставља на кодек. ExoPlayer већ користи ово на неким уређајима са овим проблемом, ово подешавање утиче само на Android 6 и новије верзије. \n \nОмогућавање ове опције може спречити грешке при репродукцији приликом пребацивања тренутног плејера видео снимака или преласка на цео екран Аудио снимак: %s Брзи режим , @@ -806,8 +766,7 @@ Претходни ток Дели листу URL адреса Дели са насловима - %1$s -\n%2$s + %1$s \n%2$s Дели плејлисту -%1$s: %2$s @@ -822,13 +781,10 @@ Прављење резервне копије и враћање Ресетуј подешавања Ресетујте сва подешавања на подразумеване вредности - Ресетовање свих подешавања ће одбацити сва жељена подешавања и поново покренути апликацију. -\n -\nЖелите ли заиста да наставите? + Ресетовање свих подешавања ће одбацити сва жељена подешавања и поново покренути апликацију. \n \nЖелите ли заиста да наставите? Не Да - NewPipe може аутоматски да проверава да ли постоје нове верзије с времена на време и да вас обавести када буду доступне. -\nЖелите ли да омогућите ово? + NewPipe може аутоматски да проверава да ли постоје нове верзије с времена на време и да вас обавести када буду доступне. \nЖелите ли да омогућите ово? Подешавања у извозу који се увозе користе рањив формат који је застарео од NewPipe верзије 0.27.0. Уверите се да извоз који се увози долази из поузданог извора и радије користите само извозе добијене из NewPipe 0.27.0 или новије верзије, у будућности. Подршка за увоз подешавања у овом рањивом формату ће ускоро бити потпуно уклоњена и тада старе NewPipe верзије више неће моћи да увозе подешавања извоза из нових верзија. секундарни Дели као YouTube привремену плејлисту diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index f331b0ffc..a69774ea5 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -6,18 +6,18 @@ Installera Avbryt Öppna i webbläsare - Öppna i popup-läge + Öppna i popupläge Dela Hämta Sök Inställningar - Menade du: %1$s\? + Menade du ”%1$s”? Dela med Använd extern videospelare Ljud saknas vid vissa upplösningar Använd extern ljudspelare Bakgrund - Popup + Popupfönster Hämtningsmapp för video Hämtade videofiler lagras här Välj hämtningsmapp för videofiler @@ -25,7 +25,7 @@ Hämtade ljudfiler lagras här Välj hämtningsmapp för ljudfiler Standardupplösning - Standardupplösning för popup + Standardupplösning för popupfönster Visa högre upplösningar Endast ett fåtal enheter har stöd för uppspelning av 2K/4K-videor Spela upp med Kodi @@ -36,8 +36,8 @@ Standardformat för ljud Standardformat för video Tema - Ljus - Mörk + Ljust + Mörkt Svart Kom ihåg popupfönstrets inställningar Kom ihåg popupfönstrets senaste storlek och placering @@ -45,12 +45,12 @@ Välj vilka förslag som ska visas när du söker Hämta Visa ”Nästa” och ”Liknande videor” - URL:en stöds inte + Webbadressen stöds inte Standardinnehållsspråk Ljud och bild Utseende Spelar upp i bakgrunden - Spelar upp i popup-läge + Spelar upp i popupläge Innehåll Visa åldersbegränsat innehåll Live @@ -75,28 +75,28 @@ Vad hände: Din kommentar (på engelska): Detaljer: - Gilla-markeringar - Ogilla-markeringar + Gillamarkeringar + Ogillamarkeringar Prenumerera Prenumererar Prenumeration avslutad Det gick inte att ändra prenumerationen Det gick inte att uppdatera prenumerationen Prenumerationer - Vad är nytt + Nytt Sökhistorik Spara sökfrågor lokalt Visningshistorik Håll koll på videor som du tittat på Återuppta uppspelning - Fortsätt uppspelning efter avbrott (t.ex. telefonsamtal) + Fortsätt uppspelningen efter avbrott (t.ex. telefonsamtal) Visa tipset ”Håll ned för att köa” Visa ett tips när du trycker på knappen för bakgrunds- eller popupuppspelning på videons detaljsida Spelare Beteende Historik och cache Ångra - Spela alla + Spela upp alla NewPipe-avisering Aviseringar för NewPipes spelare [Okänd] @@ -127,7 +127,7 @@ %s video %s videor - Start + Starta Pausa Ta bort Kontrollsumma @@ -138,9 +138,9 @@ Hämtning i NewPipe Tryck för att visa detaljer Vänta… - Kopierat till urklippet + Kopierat till urklipp Ange en hämtningsmapp senare i inställningarna - Den här behörigheten krävs för att \nöppna popupfönstret + Den här behörigheten krävs för att\nöppna popupfönstret reCAPTCHA-utmaning reCAPTCHA-utmaning begärd Hämtningar @@ -176,9 +176,9 @@ Ta bort Detaljer Ljudinställningar - Håll för att köa - Börja spela i bakgrunden - Börja spela i en popup + Håll ned för att köa + Börja spela upp i bakgrunden + Börja spela upp i ett popupfönster Donera NewPipe utvecklas av frivilliga som ägnar sin fritid åt att ge dig den bästa användarupplevelsen. Ge något tillbaka genom att hjälpa utvecklarna att göra NewPipe ännu bättre medan de njuter av en kopp kaffe. Ge tillbaka @@ -200,33 +200,33 @@ Ta bort all cachelagrad metadata Metadatacachen har rensats Köa nästa ström automatiskt - Fortsätt en avslutad uppspelningskö som inte upprepas genom att lägga till en relaterad ström + Fortsätt uppspelningen när kön tar slut genom att lägga till en relaterad ström, om upprepning är avstängd Standardinnehållsland Kanaler Spellistor Spår Användare - Växla till bakgrund - Växla till popup - Växla till huvudspelare + Växla till bakgrundsspelaren + Växla till popupspelaren + Växla till huvudspelaren Importera databas Exportera databas Skriver över din nuvarande historik, dina prenumerationer och spellistor samt, valfritt, dina inställningar Exportera historik, prenumerationer, spellistor och inställningar Rensa visningshistorik Tar bort historiken över uppspelade videor och sparade uppspelningspositioner - Ta bort hela visningshistoriken\? - Visningshistorik borttagen + Ta bort hela visningshistoriken? + Visningshistoriken har tagits bort Rensa sökhistorik - Tar bort historiken för sökta nyckelord - Ta bort hela sökhistoriken\? - Sökhistorik borttagen + Tar bort historiken över sökord + Ta bort hela sökhistoriken? + Sökhistoriken har tagits bort Externa spelare stöder inte dessa typer av länkar - Inga videoströmningar hittades - Inga ljudspår hittades - Ingen sådan mapp + Inga videoströmmar hittades + Inga ljudströmmar hittades + Mappen finns inte Filen eller innehållskällan finns inte - Filen finns inte eller saknar läs- eller skrivbehörighet + Filen finns inte eller så saknas läs- eller skrivbehörighet Filnamnet får inte vara tomt Ett fel uppstod: %1$s Inga strömmar är tillgängliga för hämtning @@ -239,8 +239,8 @@ NewPipe-projektet tar din integritet på största allvar. Appen samlar därför inte in några uppgifter utan ditt medgivande. \nNewPipes integritetspolicy beskriver i detalj vilka uppgifter som skickas och lagras när du skickar en kraschrapport. Läs integritetspolicyn NewPipe är fri programvara under en copyleft-licens: du får använda, studera, dela och förbättra programmet. Du får distribuera och ändra det enligt villkoren i GNU General Public License, version 3 eller, om du föredrar det, en senare version. - Senast spelade - Mest spelade + Senast uppspelade + Mest uppspelade Exporterad Importerad Ogiltig ZIP-fil @@ -253,7 +253,7 @@ Standardåtgärden när du öppnar innehåll — %s Videospelare Bakgrundsspelare - Popup-spelare + Popupspelare Fråga alltid Hämtar information… Läser in begärt innehåll @@ -264,17 +264,17 @@ Använd som spellistans miniatyrbild Bokmärk spellistan Ta bort bokmärke - Ta bort spellista\? + Ta bort spellista? Spellistan skapades Tillagd i spellistan Spellistans miniatyrbild har ändrats. - Ingen textning - Passa + Inga undertexter + Anpassa Fyll - Zoom - Automatiskt genererad + Zooma + Automatiskt genererade Undertexter - Ändra spelarens textstorlek och bakgrundsstil. Appen måste startas om innan ändringarna börjar gälla + Ändra undertexternas storlek och bakgrundsstil. Appen måste startas om innan ändringarna börjar gälla Övervakning av minnesläckor kan göra att appen inte svarar när en heap-dump skapas Rapportera fel utanför livscykeln Tvinga rapportering av otillåtna Rx-undantag utanför fragmentets eller aktivitetens livscykel efter rensning @@ -287,14 +287,14 @@ Föregående export Det gick inte att importera prenumerationerna Det gick inte att exportera prenumerationerna - Importera YouTube-prenumerationer från Google Takeout: \n \n1. Gå till följande URL: %1$s \n2. Logga in när du blir ombedd \n3. Klicka på ”All YouTube-data tas med”, sedan på ”Avmarkera alla”, välj endast ”prenumerationer” och klicka på ”OK” \n4. Klicka på ”Nästa steg” och sedan på ”Skapa export” \n5. Klicka på knappen ”Hämta” när den visas \n6. Klicka på IMPORTERA FIL nedan och välj den hämtade ZIP-filen \n7. [Om ZIP-importen misslyckas] Packa upp CSV-filen, klicka på IMPORTERA FIL nedan och välj den uppackade filen - Importera en SoundCloud-profil genom att ange profilens URL eller ditt ID: \n \n1. Aktivera skrivbordsläget i en webbläsare eftersom sidan inte är tillgänglig för mobila enheter \n2. Gå till följande URL: %1$s \n3. Logga in när du blir ombedd \n4. Kopiera URL:en till profilen som du omdirigerades till. + Importera YouTube-prenumerationer från Google Takeout: \n \n1. Gå till följande webbadress: %1$s \n2. Logga in när du blir ombedd \n3. Klicka på ”All YouTube-data tas med”, sedan på ”Avmarkera alla”, välj endast ”prenumerationer” och klicka på ”OK” \n4. Klicka på ”Nästa steg” och sedan på ”Skapa export” \n5. Klicka på knappen ”Hämta” när den visas \n6. Klicka på IMPORTERA FIL nedan och välj den hämtade ZIP-filen \n7. [Om ZIP-importen misslyckas] Packa upp CSV-filen, klicka på IMPORTERA FIL nedan och välj den uppackade filen + Importera en SoundCloud-profil genom att ange profilens webbadress eller ditt ID: \n \n1. Aktivera skrivbordsläget i en webbläsare eftersom sidan inte är tillgänglig för mobila enheter \n2. Gå till följande webbadress: %1$s \n3. Logga in när du blir ombedd \n4. Kopiera webbadressen till profilen som du omdirigerades till. dittID, soundcloud.com/dittid Den här åtgärden kan använda mycket nätverksdata. \n \nVill du fortsätta? Kontroller för uppspelningshastighet Tempo Tonhöjd - Koppla isär (kan orsaka distorsion) + Koppla isär tempo och tonhöjd (kan orsaka distorsion) Hoppa över tystnad Steg Återställ @@ -303,12 +303,12 @@ Avböj Ingen gräns Begränsa upplösningen när mobildata används - Minimera när du lämnar appen + Minimera vid byte av app Åtgärd när du växlar från huvudvideospelaren till en annan app — %s Ingen Minimera till bakgrundsspelare - Minimera till popup-spelare - Sluta prenumerera + Minimera till popupspelare + Avsluta prenumeration Välj flik Uppdateringar Filen har tagits bort @@ -319,13 +319,13 @@ Återställ standardvärden Vill du återställa standardvärdena? Antalet prenumeranter är otillgängligt - Vilka flikar visas på huvudsidan + Vilka flikar som visas på huvudsidan Uppdateringar Visa en avisering när en ny version av appen finns tillgänglig Listläge Lista Rutnät - Auto + Automatiskt En NewPipe-uppdatering är tillgänglig! Slutförda pausad @@ -341,7 +341,7 @@ Det gick inte att upprätta en säker anslutning Det gick inte att hitta servern Det gick inte att ansluta till servern - Servern skickar ingen data + Servern skickar inga data Servern stöder inte flertrådade hämtningar. Försök igen med @string/msg_threads = 1. Hittades inte Efterbehandlingen misslyckades @@ -354,8 +354,8 @@ Inaktivera för att dölja kommentarer Återuppta uppspelning Återställ den senaste uppspelningspositionen - Positioner i listor - Spela automatiskt + Uppspelningspositioner i listor + Spela upp automatiskt Rensa data Hoppintervall framåt och bakåt Visa indikatorer för uppspelningsposition i listor @@ -364,12 +364,12 @@ Välj dina favoritinstanser på PeerTube Hitta de instanser du gillar på %s Lägg till instans - Ange instansens URL + Ange instansens webbadress Det gick inte att validera instansen - Endast HTTPS-URL:er stöds + Endast HTTPS-adresser stöds Instansen finns redan Videor - Ta bort alla uppspelningspositioner\? + Ta bort alla uppspelningspositioner? Tar bort alla uppspelningspositioner Filen har flyttats eller tagits bort Det går inte att hämta till det externa SD-kortet. Vill du återställa hämtningsmappens plats? @@ -377,9 +377,7 @@ Artister Album Låtar - Denna video är åldersbegränsad. -\n -\nOm du vill visa den aktiverar du \"%1$s\" i inställningarna. + Denna video är åldersbegränsad. \n \nOm du vill visa den aktiverar du \"%1$s\" i inställningarna. Inga kommentarer Tryck på ”Klar” när du är färdig ∞ videor @@ -399,19 +397,19 @@ Standardkiosk Destinationsmappen kan inte skapas Det går inte att skapa filen - Det finns en pågående hämtning med det här namnet - kan inte skriva över filen + Det finns en väntande hämtning med det här namnet + Det går inte att skriva över filen Det finns redan en hämtad fil med det här namnet En fil med det namnet finns redan - återhämtar + återställer Väntande Visa tjänsternas ursprungliga tidsangivelser för strömmar Visa ursprungliga tidsangivelser Automatiskt genererad (ingen uppladdare hittades) Slå på ljudet - Tysta + Stäng av ljudet Mest gillade - Nyligen tillagd + Nyligen tillagda Lokala Klar Slå på YouTubes \"Begränsat läge\" @@ -425,7 +423,7 @@ Tidsgräns för flödesuppdatering Flöde Ny - Vill du ta bort den här gruppen\? + Vill du ta bort den här gruppen? Tomt gruppnamn %d vald @@ -433,8 +431,8 @@ Ingen prenumeration vald Välj prenumerationer - Bearbetar flöde… - Läser in flöde… + Bearbetar flödet… + Läser in flödet… Inte inläst: %d Flödet senast uppdaterat: %s Kanalgrupper @@ -455,10 +453,10 @@ %d sekunder På grund av begränsningar i ExoPlayer sattes hoppintervallet till %d sekunder - Ja, och delvis tittade videor + Ja, även delvis uppspelade strömmar Strömmar som har spelats upp både före och efter att de lades till i spellistan tas bort. \nVill du fortsätta? - Ta bort tittade strömningar? - Ta bort tittade + Ta bort uppspelade strömmar? + Ta bort uppspelade Systemets standardspråk Appspråk Välj en instans @@ -468,13 +466,13 @@ Fråga var filen ska sparas Pausa hämtningar Starta hämtningar - En hämtning körs samtidigt + En hämtning åt gången Begränsa hämtningskön Stäng Användbart vid byte till mobildata, även om vissa hämtningar inte kan pausas Pausa i nätverk med datagräns Ta bort hämtade filer - Vill du rensa din hämtningshistorik eller ta bort alla hämtade filer\? + Vill du rensa din hämtningshistorik eller ta bort alla hämtade filer? Rensa hämtningshistorik Kan inte återställa den här hämtningen Tidsgränsen för anslutningen överskreds @@ -495,7 +493,7 @@ Beskär videominiatyrbilden i aviseringen från bildförhållandet 16:9 till 1:1 Starta uppspelning automatiskt — %s Uppspelningskö - URL:en kunde inte identifieras. Vill du öppna den med en annan app? + Webbadressen kunde inte identifieras. Vill du öppna den med en annan app? Köa automatiskt Den aktiva uppspelningskön kommer att ersättas Att byta från en spelare till en annan kan ersätta din kö @@ -515,7 +513,7 @@ reCAPTCHA-kakor har tagits bort Rensa reCAPTCHA-kakor YouTube erbjuder ett \"Begränsat läge\" som döljer material som potentiellt är olämpligt för barn - Automatiskt (enhetens förvalda) + Automatiskt (enhetens tema) Blanda Köad Från och med Android 10 stöds bara \"Storage Access Framework\" @@ -526,7 +524,7 @@ Köa Relaterade objekt Avisering för videohashning - Tycker du att inläsningen av flödet är för långsamt? Testa i så fall att aktivera snabbinläsning (du kan ändra det i inställningarna eller genom att trycka på knappen nedan). \n \nNewPipe erbjuder två strategier för att ladda flödet: \n• Att hämta hela den prenumererade kanalen, vilket är långsamt, men komplett. \n• Att använda en \"särskild tjänsteslutpunkt\", vilket är snabbt, men vanligtvis inte komplett. \n \nSkillnaden mellan de två är att den snabba varianten ofta saknar viss information, som objektets speltid eller typ (kan inte skilja på livevideor och vanliga videor) och den kan returnera färre objekt. \n \nYouTube är ett exempel på en tjänst som erbjuder denna snabba metod genom sitt RSS-flöde. \n \nSå valet handlar i grunden om vad du föredrar: hastighet eller precis information. + Tycker du att inläsningen av flödet är för långsam? Prova att aktivera snabbläge (du kan ändra det i inställningarna eller med knappen nedan). \n \nNewPipe erbjuder två sätt att läsa in flödet: \n• Hämta hela kanalen du prenumererar på. Det är långsamt men ger fullständig information. \n• Använda en särskild tjänsteslutpunkt. Det är snabbt men ger vanligtvis ofullständig information. \n \nDen snabba metoden saknar ofta information som objektets speltid eller typ. Den kan inte skilja mellan direktsändningar och vanliga videor och kan ge färre objekt. \n \nYouTube är ett exempel på en tjänst som erbjuder den snabba metoden via sitt RSS-flöde. \n \nValet handlar alltså om vad du föredrar: hastighet eller detaljerad information. Inaktivera för att dölja rutor med metainformation som ytterligare information om strömmens skapare, strömmens innehåll eller sökord Inaktivera för att dölja videobeskrivning och ytterligare information Visa metainformation @@ -537,7 +535,7 @@ Du kan som mest välja tre åtgärder att visa i den kompakta aviseringen! Lös Support - Integritet + Synlighet Av På Intern @@ -548,9 +546,9 @@ Licens Taggar Kategori - Omöjliggör markering av text i beskrivningen - Möjliggör markering av text i beskrivningen - Du kan nu markera text i beskrivningen. Notera att sidan kan flimra och att länkar kan vara oklickbara när du är i markeringsläge. + Inaktivera textmarkering i beskrivningen + Aktivera textmarkering i beskrivningen + Du kan nu markera text i beskrivningen. Observera att sidan kan flimra och att länkar kanske inte går att klicka på i markeringsläget. Hämtningen har startat Radio Detta innehåll är endast tillgängligt för användare som har betalat för det, så det kan inte strömmas eller hämtas av NewPipe. @@ -578,29 +576,29 @@ Visa innehåll som på grund av sin åldersgräns (t.ex. 18+) kan vara olämpligt för barn Visa beskrivning Öppna med - Visa miniatyrer + Visa miniatyrbild Underkanalens miniatyrbild Det snabba flödesläget ger inte mer information om detta. Fel vid inläsning av flödet Markera som sedd Olistad Aktuellt - Natt-tema - Aviseringar för videohashningsframsteg + Nattema + Aviseringar om förloppet vid videohashning Inaktivera medietunnel om du upplever en svart skärm eller att videouppspelningen hackar. Inaktivera medietunnel Hjärtmärkt av innehållsskaparen - Välj ditt favorittema för nattläge nedan + Välj det nattema du föredrar nedan Välj önskat nattema — %s - Förhandsvisning i sökfältet + Förhandsvisning i tidslinjen Lokala sökförslag - Tog bort %1$s nedladdning - Tog bort %1$s nedladdningar + Tog bort %1$s hämtning + Tog bort %1$s hämtningar - Nedladdning slutförd - %s nedladdningar slutförda + Hämtningen är klar + %s hämtningar är klara Köa nästa Köade nästa @@ -608,7 +606,7 @@ Bearbetar… Kan ta en stund Senaste Svep objekt för att ta bort dem - Förslag via fjärrsökning + Sökförslag från tjänsten Starta videor direkt i helskärmsläge i stället för i minispelaren när automatisk rotation är låst. Du kan fortfarande öppna minispelaren genom att lämna helskärmsläget Sök efter uppdateringar Sök manuellt efter nya versioner @@ -624,41 +622,40 @@ Visa ett tillfälligt felmeddelande Skapa en felavisering Ingen lämplig filhanterare hittades för åtgärden. \nInstallera en filhanterare eller prova att inaktivera \'%s\' i hämtningsinställningarna - Ingen lämplig filhanterare hittades för denna åtgärd. -\nInstallera en filhanterare som är kompatibel med Storage Access Framework + Ingen lämplig filhanterare hittades för denna åtgärd. \nInstallera en filhanterare som är kompatibel med Storage Access Framework Fäst kommentar LeakCanary är inte tillgänglig ExoPlayer-standard Ändra storleken på inläsningsintervallet för progressivt innehåll (för närvarande %s). Ett lägre värde kan påskynda den första inläsningen - Uppdateringsintervall + Kontrollintervall Nödvändig nätverksanslutning Alla nätverk - Radera alla nedladdade filer från disken\? + Ta bort alla hämtade filer från disken? Aviseringar är avstängda Aktivera aviseringar Du prenumererar nu på denna kanal - Aviseringar om nya strömningar för prenumerationer + Aviseringar om nya strömmar från kanaler du prenumererar på - %s ny strömning - %s nya strömningar + %s ny ström + %s nya strömmar Konfigurera aviseringen för strömmen som spelas upp - Sök efter nya strömningar - Meddela om nya strömningar från prenumerationer + Sök efter nya strömmar + Meddela om nya strömmar från kanaler du prenumererar på Aviseringar - Nya strömningar + Nya strömmar Läser in information om strömmen… - Aviseringar om nya strömningar + Aviseringar om nya strömmar , Spelaraviseringar Växla alla Procent Halvton - Inga videoströmningar tillgängliga för externa spelare + Inga videoströmmar är tillgängliga för externa spelare Okänd kvalitet - Inga ljudströmningar tillgängliga för externa spelare + Inga ljudströmmar är tillgängliga för externa spelare Okänt format - Videoströmningar som ännu inte stöds av nedladdaren visas inte + Videoströmmar som ännu inte stöds av hämtningsfunktionen visas inte Storlek på inläsningsintervall Välj kvalitet för externa spelare Den valda videoströmmen stöds inte av externa spelare @@ -677,14 +674,14 @@ Antal tillagda dubbletter: %d Spellistor som är gråmarkerade innehåller redan det här objektet. Användbart om du till exempel använder ett headset med trasiga fysiska knappar - Ignorera hårdvarans mediaknappar - Ta bort dubbletter\? - Visa följande strömningar - Delvis sedd + Ignorera fysiska medieknappar + Ta bort dubbletter? + Visa följande strömmar + Delvis uppspelade Vill du ta bort alla dubbletter i den här spellistan? Ta bort dubbletter Visa eller dölj strömmar - Fullständigt sedd + Helt uppspelade Kommande Volym Ingen @@ -707,55 +704,54 @@ Välj ett syntolkat ljudspår för personer med synnedsättning när ett sådant finns Använd ExoPlayers reservavkodare Aktivera det här alternativet om du har problem med att initiera avkodare. ExoPlayer försöker då använda avkodare med lägre prioritet om de primära avkodarna inte kan initieras. Detta kan ge sämre uppspelningsprestanda än när de primära avkodarna används - Denna lösning frigör och skapar om videokodekar när videoytan ändras, i stället för att ställa in ytan direkt i kodeken. ExoPlayer använder redan detta på vissa enheter med det här problemet, så inställningen har bara effekt på Android 6 och senare.\n\nOm du aktiverar alternativet kan det förhindra uppspelningsfel när du byter videospelare eller växlar till fullskärm + Denna lösning frigör och skapar om videokodekar när videoytan ändras, i stället för att ställa in ytan direkt i kodeken. ExoPlayer använder redan detta på vissa enheter med det här problemet, så inställningen har bara effekt på Android 6 och senare.\n\nOm du aktiverar alternativet kan det förhindra uppspelningsfel när du byter videospelare eller växlar till helskärm %1$s %2$s original - beskrivande + syntolkad dubbad Flytta huvudflikarna längst ned Huvudflikarnas position - Inga strömningar + Inga strömmar Inga direktsändningar Medietunnel har inaktiverats som standard på din enhet eftersom enhetsmodellen inte stöder funktionen. Bildkvalitet Videor Prenumeranter Vilka flikar som visas på kanalsidor - Dela URL-lista + Dela lista med webbadresser Kanalflikar Shorts - Laddar metadata… + Läser in metadata… Växla skärmorientering Låg kvalitet Växla helskärmsläge Hämta kanalflikar - Nästa strömning + Nästa ström Öppna uppspelningskön - Ladda inte bilder + Läs inte in bilder Hög kvalitet Om Dela spellista Spola framåt Album Spola tillbaka - Spela igen + Spela upp igen Medelkvalitet Spellistor - Spela + Spela upp Fler alternativ Miniatyrbilder Spår Längd Kanaler - Föregående strömning + Föregående ström Direktsändningar \? Dela med titlar - %1$s -\n%2$s + %1$s \n%2$s Profilbilder Underkanalens profilbilder - Flikar att hämta när flödet uppdateras. Det här alternativet har ingen effekt om en kanal uppdateras i snabbt läge. + Flikar att hämta när flödet uppdateras. Det här alternativet har ingen effekt om en kanal uppdateras i snabbläge. Uppladdarens profilbilder Banderoller - %1$s: %2$s @@ -766,7 +762,7 @@ %s svar Visa mindre - Redigera aviseringsåtgärderna genom att trycka på dem. De tre första åtgärderna – spela/pausa, föregående och nästa – bestäms av systemet och kan inte ändras. + Redigera aviseringsåtgärderna genom att trycka på dem. De tre första åtgärderna – spela upp/pausa, föregående och nästa – bestäms av systemet och kan inte ändras. Inte tillräckligt med ledigt utrymme på enheten Nej Säkerhetskopiera och återställ @@ -779,19 +775,19 @@ sekundär Dela som tillfällig YouTube-spellista Spellistor - Välj en flödesgrupp - Ingen flödesgrupp har skapats ännu + Välj en kanalgrupp + Ingen kanalgrupp har skapats ännu Kanalgruppsida - Sök %1$s - Sök %1$s (%2$s) - %sK - %sM - %sB + Sök på %1$s + Sök på %1$s (%2$s) + %s tn + %s mn + %s md Gillar - SoundCloud Topp 50-sida borttagen + SoundClouds Topp 50-sida har tagits bort SoundCloud har lagt ner de ursprungliga topp 50-listorna. Motsvarande flik har tagits bort från din startsida. YouTubes kombinerade trender har tagits bort - YouTube tog bort den kombinerade trendsidan den 21 juli 2025. NewPipe ersatte standardtrendsidan med populära direktsändningar.\n\nDu kan välja andra trendsidor under ”Inställningar > Innehåll > Innehåll på huvudsidan”. + YouTube tog bort den kombinerade trendsidan den 21 juli 2025. NewPipe ersatte standardtrendsidan med populära direktsändningar.\n\nDu kan välja andra trendsidor under ”Inställningar > Innehåll > Huvudsidans innehåll”. Speltrender Populära poddar Populära filmer och serier @@ -800,11 +796,11 @@ \"Tillåt visning över andra appar\" Ta bort fil Ta bort post - Konto avslutat\n\n%1$s anger denna anledning: %2$s - Posten borttagen - Servern svarade med HTTP-fel 403 under uppspelningen. Strömnings-URL:en kan ha löpt ut eller IP-adressen blivit blockerad + Kontot har avslutats\n\n%1$s anger följande skäl: %2$s + Posten har tagits bort + Servern svarade med HTTP-fel 403 under uppspelningen. Strömmens webbadress kan ha löpt ut eller IP-adressen ha blockerats Servern svarade med HTTP-fel %1$s under uppspelningen - Servern svarade med HTTP-fel 403 under uppspelningen, troligen på grund av en IP-blockering eller problem med avobfuskering av strömnings-URL:er + Servern svarade med HTTP-fel 403 under uppspelningen, troligen på grund av en IP-blockering eller problem med avobfuskering av strömmarnas webbadresser %1$s vägrade att lämna ut uppgifter och krävde inloggning för att bekräfta att begäran inte kommer från en robot.\n\nDin IP-adress kan ha blockerats tillfälligt av %1$s. Vänta en stund eller byt IP-adress, till exempel genom att slå av och på en VPN-anslutning eller växla mellan Wi-Fi och mobildata.\n\nLäs avsnittet i vanliga frågor för mer information. Innehållet är inte tillgängligt i det valda innehållslandet.\n\nÄndra valet under ”Inställningar > Innehåll > Standardinnehållsland”. I augusti 2025 meddelade Google att från och med september 2026 kommer installation av appar att kräva utvecklarverifiering för alla Android-appar på certifierade enheter, inklusive de som installerats utanför Play Store. Eftersom utvecklarna av NewPipe inte godkänner detta krav kommer NewPipe inte längre att fungera på certifierade Android-enheter efter den tiden. @@ -828,8 +824,8 @@ Läser in %d prenumerationer… NewPipe upphör med stödet för Android 5 - Tyvärr är NewPipe beroende av ett fåtal bibliotek som slutat stödja Android 5.0 och 5.1. Nästa NewPipe-utgåva kommer därför tyvärr bara att fungera på enheter med Android 6 eller senare. Läs mer i blogginlägget. + NewPipe är beroende av några bibliotek som inte längre stöder Android 5.0 och 5.1. Nästa version av NewPipe kommer därför endast att fungera på enheter med Android 6 eller senare. Läs mer i blogginlägget. Blogginlägg - Podcasts + Poddar Kurser diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml index b743a2825..de581239f 100644 --- a/app/src/main/res/values-sw/strings.xml +++ b/app/src/main/res/values-sw/strings.xml @@ -6,7 +6,7 @@ Onyesha chaguo la \"Cheza na Kodi\" Onyesha chaguo la kucheza video kupitia kituo cha media cha Kodi iliyochapishwa kwa %1$s - Hakuna stream player kilichopatikana. Sakinisha VLC\? + Hakuna stream player kilichopatikana. Sakinisha VLC? Hakuna stream player kilichopatikana(unaweza sakinisha VLC kuicheza). Sakinisha Cancel @@ -18,7 +18,7 @@ Download Settings Tafuta - Ulimaanisha \"%1$s\"\? + Ulimaanisha \"%1$s\"? OK Inaonyesha matokeo ya:%s Tumia kicheza sauti cha nje @@ -42,4 +42,4 @@ Buffering Hakuna Use fast inexact seek - \ No newline at end of file + diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 86dd3cc43..fb18befd9 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -2,7 +2,7 @@ ஆரம்பிக்க பூதக்கண்ணாடியைத் தட்டு. %1$s அன்று வெளியிடப்பட்டது - நிகழ்பட ஓட்டி இல்லை. VLCஐ நிறுவவா\? + நிகழ்பட ஓட்டி இல்லை. VLCஐ நிறுவவா? நிறுவு ரத்துசெய் உலாவியில் திற @@ -14,7 +14,7 @@ நிகழ்பட ஓட்டி இல்லை (இதை இயக்க VLC-ஐப் பயன்படுத்தலாம்). திரைமேல் நிலையில் காட்டு நிகழ்பட கோப்பைப் பதிவிறக்கு - \"%1$s\" என்றீர்களா\? + \"%1$s\" என்றீர்களா? வேறு நிகழ்பட ஓட்டியைப் பயன்படுத்து வேறு ஒலி இயக்கியைப் பயன்படுத்து சந்தாசேர் @@ -39,7 +39,7 @@ இயல்பிருப்பு திரைமேல் நிலை பிரிதிறன் உயரிய பிரிதிறன்களைக் காட்டு Kodiயுடன் இயக்கு - இல்லாத Kore செயலியை நிறுவவா\? + இல்லாத Kore செயலியை நிறுவவா? \"Kodiயுடன் இயக்கு\" இடப்பைக் காட்டு ஒலி இயல்பிருப்பு ஒலி வடிவம் @@ -118,9 +118,9 @@ தகவல்கலை ஏற்றுமதி செய் தற்போதைய வரலாறு, சந்தாக்கள், ஒளிச்சரங்கள் மற்றும் (விரும்பினால்) அமைவை மீறும் வரலாறு, சந்தாக்கள், ஒளிச்சரங்கள் மற்றும் அமைவை ஏற்றுமதி செய் - பார்த்த வரலாறு முழுவதையும் அழி\? + பார்த்த வரலாறு முழுவதையும் அழி? தேடப்பட்ட வார்த்தைகளின் வரலாற்றை அழி - தேடல் வரலாறு முழுவதையும் அழி\? + தேடல் வரலாறு முழுவதையும் அழி? பிழை சிறந்த திரைத் தெளிவுத்திறன் NewPipe இயக்கிக்கான அறிவிப்புகள் @@ -177,9 +177,9 @@ வேகமாக முன்னோக்கி / திரும்பத் தேடும் காலம் வரிசையை அழிக்கும் முன் உறுதிப்படுத்தலைக் கேள் - உங்கள் பதிவிறக்க வரலாற்றை அழிக்க வேண்டுமா அ எல்லா பதிவிறக்கிய கோப்புகளையும் நீக்க வேண்டுமா\? + உங்கள் பதிவிறக்க வரலாற்றை அழிக்க வேண்டுமா அ எல்லா பதிவிறக்கிய கோப்புகளையும் நீக்க வேண்டுமா? பதிவிறக்க வரலாற்றை அழி - தேடல் வரலாற்றிலிருந்து இந்த உருப்படியை நீக்கவா\? + தேடல் வரலாற்றிலிருந்து இந்த உருப்படியை நீக்கவா? வரலாறு வரலாறு மேனிலை தகவல் காட்டு @@ -224,15 +224,15 @@ உள்ளூர் தேடல் பரிந்துரைகள் பாய்வு உருவாக்குநர், பாய்வு உள்ளடக்கம் அ தேடல் கோரிக்கை குறித்த கூடுதல் தகவலையுடைய மேனிலைத் தகவட்பெட்டிகளை மறைக்க அணை பியர்டியூப் நிகழ்வுகள் - புற SD அட்டைக்குப் பதிவிறக்குதல் சாத்தியமில்லை. பதிவிறக்க அடைவிடத்தை அகரமாக்கவா\? + புற SD அட்டைக்குப் பதிவிறக்குதல் சாத்தியமில்லை. பதிவிறக்க அடைவிடத்தை அகரமாக்கவா? reCAPTCHA நினைவிகளைத் துடை - இயல்பிருப்புகளை மீட்டெடுக்க வேண்டுமா\? + இயல்பிருப்புகளை மீட்டெடுக்க வேண்டுமா? உறவுடைய உருப்படிகள் reCAPTCHAஐ தீர்க்கையில் NewPipe சேமிக்கும் நினைவிகளைத் துடை முதன்மை இயக்கியை முழுதிரையில் துவக்கு நிகழ்வை செல்லுபடுயாக்க முடியவில்லை எல்லா இயக்கக குறியிடங்களையும் அழிக்கும் - எல்லா இயக்கக குறியிடங்களையும் அழிக்கவா\? + எல்லா இயக்கக குறியிடங்களையும் அழிக்கவா? இயக்கக குறியிடங்கள் அழிக்கப்பட்டன விவரிப்பு தொகுப்புகள் @@ -262,10 +262,8 @@ இயக்கியைச் சிதை பட்டியல்களில் இயக்கக குறியட நிலைகாட்டிகளைக் காட்டு துணையியக்கியில் காணொளிகளை துவக்காதே, ஆனால் தானாக சுழற்றல் பூட்டப்பட்டிருந்தால் நேரடியாக முழுதிரைக்குத் திரும்பு. முழுதிரையை வெளியேறி நீங்கள் இன்னும் துணையியக்கியை அணுகலாம் - உரலியை அங்கீகரக்க முடியவில்லை. மற்றொரு செயலியில் திறக்கவா\? - இக்காணொளி வயது வரம்புக்குட்டபட்டது. -\n -\nஇதைக் காண வேண்டுமெனில் அமைவில் \"%1$s\"ஐ இயக்கு. + உரலியை அங்கீகரக்க முடியவில்லை. மற்றொரு செயலியில் திறக்கவா? + இக்காணொளி வயது வரம்புக்குட்டபட்டது. \n \nஇதைக் காண வேண்டுமெனில் அமைவில் \"%1$s\"ஐ இயக்கு. பிழையறிக்கை அறிவிப்பு இப்பாய்வினை இயக்க முடியவில்லை மீட்கவியலாத இயக்கி பிழை ஏற்பட்டது @@ -325,7 +323,7 @@ மாற்றீடு வரியுரு ஒளிச்சரப் பக்கம் ஒன்றிணைக்கா சந்தாக்களை மட்டும் காட்டு - அமைவையும் இறக்குமதி செய்யவா\? + அமைவையும் இறக்குமதி செய்யவா? பின்னணியில் இயங்கத் துவங்கு பாப்அப்பில் இயங்கத் துவங்கு பதிவுத்தட விவரங்களைக் காட்டு @@ -342,7 +340,7 @@ சந்தாக்களை இறக்குமதி செய்ய முடியவில்லை ஒளிச்சர சிறுபடம் மாறியது. கோப்புப்பெயர்களில் அனுமதிக்கப்பட்ட வரியுருக்கள் - இந்த ஒளிச்சரத்தை அழிக்கவா\? + இந்த ஒளிச்சரத்தை அழிக்கவா? சாரைபடுத்தப்பட்டது சந்தாக்களை ஏற்றுமதி செய்ய முடியவில்லை சந்தாக்களைத் தேர்ந்தெடு @@ -361,8 +359,7 @@ புதிய நீரோடைகள் வீடியோ ஹேஷிங் முன்னேற்றத்திற்கான அறிவிப்புகள் சந்தாவுக்கான புதிய ஸ்ட்ரீம்கள் பற்றிய அறிவிப்புகள் - இந்த வீடியோ வயது வரம்புக்குட்பட்டது. -\nவயது வரம்புக்குட்பட்ட வீடியோக்கள் கொண்ட புதிய YouTube கொள்கைகள் காரணமாக, NewPipe ஆல் அதன் எந்த வீடியோ ஸ்ட்ரீம்களையும் அணுக முடியாது, இதனால் அதை இயக்க முடியவில்லை. + இந்த வீடியோ வயது வரம்புக்குட்பட்டது. \nவயது வரம்புக்குட்பட்ட வீடியோக்கள் கொண்ட புதிய YouTube கொள்கைகள் காரணமாக, NewPipe ஆல் அதன் எந்த வீடியோ ஸ்ட்ரீம்களையும் அணுக முடியாது, இதனால் அதை இயக்க முடியவில்லை. வேகமான பயன்முறை ஆம் இல்லை diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index a422dc996..e64b650a4 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -9,7 +9,7 @@ డౌన్లోడ్ వెతుకు అమరికలు - మీ ఉద్దేశ్యం \"%1$s\"\? + మీ ఉద్దేశ్యం \"%1$s\"? పంచుకో బాహ్య ఆడియో ప్లేయర్ని ఉపయోగించండి సభ్యత్వం @@ -28,7 +28,7 @@ ఆడియో కోసం డౌన్లోడ్ మార్గాన్ని నమోదు చేయండి ఆడియో ఫైల్లకు డౌన్లోడ్ మార్గాన్ని ఇవ్వండి కోడితో ప్లే చేయండి - కోరే ఆప్ కనుగొనబడలేదు. దీన్ని ఇన్స్టాల్ చెయ్యాలా\? + కోరే ఆప్ కనుగొనబడలేదు. దీన్ని ఇన్స్టాల్ చెయ్యాలా? కోరే అనువర్తనం కనుగొనబడలేదు. దీన్ని ఇన్స్టాల్ చేయండి ఆడియో డిఫాల్ట్ ఆడియో ఫార్మాట్ @@ -133,7 +133,7 @@ వివరాలు ఆడియో సెట్టింగ్లు ఎన్క్యూలో పట్టుకోండి - మీదగ్గర వీడియోకి కావాల్సిన ప్లేయర్ లేదు. VLC ప్లేయర్ని ఇన్స్టాల్ చేసుకుంటారా\? + మీదగ్గర వీడియోకి కావాల్సిన ప్లేయర్ లేదు. VLC ప్లేయర్ని ఇన్స్టాల్ చేసుకుంటారా? మీదగ్గర వీడియోకి కావాల్సిన ప్లేయర్ లేదు (మీరు VLCని ఇన్స్టాల్ చేసుకోండి ). పాపప్ మోడ్లో తెరవండి డిఫాల్ట్ పాపప్ స్పష్టత @@ -146,7 +146,7 @@ నోటిఫికేషన్‌లో చూపబడిన వీడియో థంబ్‌నెయిల్‌ను 16:9 నుండి 1:1 కారక నిష్పత్తికి మార్చుము పునరావృతం చేయండి వీడియో \"వివరాలు:\"లో బ్యాక్‌గ్రౌండ్ లేదా పాప్‌అప్ బటన్‌ను నొక్కినప్పుడు చిట్కాను చూపు - URLని గుర్తించడం సాధ్యపడలేదు. మరొక యాప్‌తో తెరవాలా\? + URLని గుర్తించడం సాధ్యపడలేదు. మరొక యాప్‌తో తెరవాలా? నోటిఫికేషన్‌ను రంగులమయం చేయండి స్థానిక శోధన సూచనలు రిమోట్ శోధన సూచనలు @@ -224,11 +224,8 @@ ఈవెంట్స్ కొత్త NewPipe వెర్షన్ కోసం నోటిఫికేషన్‌లు కంటెంట్‌కి వయస్సు పరిమితి (18+ వంటివి) ఉన్నందున పిల్లలకు అనుచితమైన కంటెంట్‌ను చూపండి - ఈ వీడియో వయో పరిమితి విధించబడింది. -\nవయో-నియంత్రిత వీడియోలతో కూడిన కొత్త YouTube విధానాల కారణంగా, NewPipe దాని వీడియో స్ట్రీమ్‌లలో దేనినీ యాక్సెస్ చేయదు మరియు దానిని ప్లే చేయడం సాధ్యం కాదు. - ఈ వీడియోకు వయో పరిమితి ఉంది. -\n -\nమీరు దీన్ని చూడాలనుకుంటే సెట్టింగ్‌లలో \"%1$s\"ని ఆన్ చేయండి. + ఈ వీడియో వయో పరిమితి విధించబడింది. \nవయో-నియంత్రిత వీడియోలతో కూడిన కొత్త YouTube విధానాల కారణంగా, NewPipe దాని వీడియో స్ట్రీమ్‌లలో దేనినీ యాక్సెస్ చేయదు మరియు దానిని ప్లే చేయడం సాధ్యం కాదు. + ఈ వీడియోకు వయో పరిమితి ఉంది. \n \nమీరు దీన్ని చూడాలనుకుంటే సెట్టింగ్‌లలో \"%1$s\"ని ఆన్ చేయండి. ట్రాక్స్ పాటలు వెనుకగా మార్చు @@ -256,7 +253,7 @@ [తెలియదు] ఫైల్ పేరు ఖాళీగా ఉండకూడదు సేవ్ చేసిన ట్యాబ్‌లను చదవడం సాధ్యం కాలేదు, కాబట్టి డిఫాల్ట్ వాటిని ఉపయోగిస్తోంది - మీరు డిఫాల్ట్‌లను పునరుద్ధరించాలనుకుంటున్నారా\? + మీరు డిఫాల్ట్‌లను పునరుద్ధరించాలనుకుంటున్నారా? ప్లేబ్యాక్ స్థానాలు తొలగించబడ్డాయి బాహ్య ప్లేయర్‌లు ఈ రకమైన లింక్‌లకు మద్దతు ఇవ్వవు చెక్సమ్ @@ -265,13 +262,13 @@ ఎవరూ వినడం లేదు ఎవరూ చూడటం లేదు వ్యాఖ్యలు లేవు - బాహ్య SD కార్డ్‌కి డౌన్‌లోడ్ చేయడం సాధ్యం కాదు. డౌన్‌లోడ్ ఫోల్డర్ స్థానాన్ని రీసెట్ చేయాలా\? + బాహ్య SD కార్డ్‌కి డౌన్‌లోడ్ చేయడం సాధ్యం కాదు. డౌన్‌లోడ్ ఫోల్డర్ స్థానాన్ని రీసెట్ చేయాలా? సృష్టించు డౌన్‌లోడ్ చేయడానికి స్ట్రీమ్‌లు ఏవీ అందుబాటులో లేవు డిఫాల్ట్‌ విలువలకు మార్చు క్రమాన్ని మార్చడానికి లాగండి వీక్షణ చరిత్రను శుభ్రపరచుము - మొత్తం వీక్షణ చరిత్రను తొలగించాలా\? + మొత్తం వీక్షణ చరిత్రను తొలగించాలా? ప్లేబ్యాక్ స్థానాలను తొలగించండి బాహ్య నిల్వ అందుబాటులో లేదు యాప్/UI విఫలమైనది @@ -289,12 +286,12 @@ ∞ వీడియోలు వ్యాఖ్యలు నిలిపివేయబడ్డాయి మీరు reCAPTCHAని పరిష్కరించినప్పుడు NewPipe స్టోర్ చేసే కుక్కీలను క్లియర్ చేయండి - అన్ని ప్లేబ్యాక్ స్థానాలను తొలగించాలా\? + అన్ని ప్లేబ్యాక్ స్థానాలను తొలగించాలా? వీక్షణ చరిత్ర తొలగించబడింది శోధన చరిత్ర తొలగించబడింది శోధన చరిత్రను శుభ్రపరచు శోధన కీలకపదాల చరిత్రను తొలగిస్తుంది - మొత్తం శోధన చరిత్రను తొలగించాలా\? + మొత్తం శోధన చరిత్రను తొలగించాలా? అన్ని ప్లేబ్యాక్ స్థానాలను తొలగిస్తుంది ప్లే చేసిన స్ట్రీమ్‌ల చరిత్ర మరియు ప్లేబ్యాక్ స్థానాలను తొలగిస్తుంది అటువంటి ఫైల్/కంటెంట్ సోర్స్ లేదు @@ -316,8 +313,7 @@ చెరుపు వాటిని తీసివేయడానికి వాటిని స్వైప్ చేయండి మరింత సమాచారం మరియు వార్తల కోసం NewPipe వెబ్‌సైట్‌ని సందర్శించండి. - NewPipe ప్రాజెక్ట్ మీ గోప్యతను చాలా తీవ్రంగా పరిగణిస్తుంది. కాబట్టి, మీ సమ్మతి లేకుండా యాప్ ఎలాంటి డేటాను సేకరించదు. -\nNewPipe యొక్క గోప్యతా విధానం మీరు క్రాష్ నివేదికను పంపినప్పుడు ఏ డేటా పంపబడుతుందో మరియు నిల్వ చేయబడుతుందో వివరంగా వివరిస్తుంది. + NewPipe ప్రాజెక్ట్ మీ గోప్యతను చాలా తీవ్రంగా పరిగణిస్తుంది. కాబట్టి, మీ సమ్మతి లేకుండా యాప్ ఎలాంటి డేటాను సేకరించదు. \nNewPipe యొక్క గోప్యతా విధానం మీరు క్రాష్ నివేదికను పంపినప్పుడు ఏ డేటా పంపబడుతుందో మరియు నిల్వ చేయబడుతుందో వివరంగా వివరిస్తుంది. NewPipe అనేది కాపీ లెఫ్ట్ లిబ్రే సాఫ్ట్‌వేర్: మీరు దీన్ని ఇష్టానుసారంగా ఉపయోగించవచ్చు, అధ్యయనం చేయవచ్చు మరియు మెరుగుపరచవచ్చు. ప్రత్యేకంగా మీరు ఫ్రీ సాఫ్ట్‌వేర్ ఫౌండేషన్ ద్వారా ప్రచురించబడిన GNU జనరల్ పబ్లిక్ లైసెన్స్ నిబంధనల ప్రకారం, లైసెన్స్ యొక్క వెర్షన్ 3 లేదా (మీ ఐచ్ఛికం ప్రకారం) ఏదైనా తర్వాతి సంస్కరణలో దాన్ని పునఃపంపిణీ చేయవచ్చు మరియు/లేదా సవరించవచ్చు. ప్లేజాబితా బుక్‌మార్క్‌లు ఇంకా లేవు గోప్యతా విధానాన్ని చదవండి @@ -325,8 +321,7 @@ విరాళం ఇవ్వండి కియోస్క్‌ని ఎంచుకోండి reCAPTCHA కుక్కీలను క్లియర్ చేయండి - దీనికి ఈ అనుమతి అవసరం -\nతేలియాడే పద్ధతిలో తెరవండి + దీనికి ఈ అనుమతి అవసరం \nతేలియాడే పద్ధతిలో తెరవండి © %3$s కింద %2$s ద్వారా %1$s చివరిగా ఆడింది చరిత్ర, సభ్యత్వాలు, ప్లేజాబితాలు మరియు అమరికలను ఎగుమతిచేయుము @@ -378,7 +373,7 @@ మూగ హెచ్చరిక: అన్ని ఫైల్‌లను దిగుమతి చేయడం సాధ్యపడలేదు. ఇది మీ ప్రస్తుత సెటప్‌ను భర్తీ చేస్తుంది. - మీరు అమరికలను కూడా దిగుమతి చేయాలనుకుంటున్నారా\? + మీరు అమరికలను కూడా దిగుమతి చేయాలనుకుంటున్నారా? వ్యాఖ్యలను లోడ్ చేయడం సాధ్యపడలేదు ఇటీవల జోడించినవి చాలా నచ్చింది @@ -400,7 +395,7 @@ వినోదజాబితాకు సూక్ష్మచిత్రంగా మార్చుము వినోదజాబితాను ఇష్టంశంగా మార్చుము ఇష్టంశాన్ని తొలగించండి - ఇష్టంశాన్ని నాశనం చేయాలా\? + ఇష్టంశాన్ని నాశనం చేయాలా? తగినది పూరించండి పరివీక్షణ @@ -422,9 +417,7 @@ స్ట్రీమ్ వివరాలను లోడ్ చేస్తోంది… మెమరీ లీక్‌లను చూపించు జీవితచక్రం లేని లోపాలను నివేదించండి - ఈ చర్య నెట్‌వర్క్ ఖరీదైనదని గుర్తుంచుకోండి. -\n -\nమీరు కొనసాగించాలనుకుంటున్నారా\? + ఈ చర్య నెట్‌వర్క్ ఖరీదైనదని గుర్తుంచుకోండి. \n \nమీరు కొనసాగించాలనుకుంటున్నారా? శాతం అర్ధరాగం ప్లేబ్యాక్ లోడ్ విరామం పరిమాణం diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 5cae007ec..c3c82d4a9 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -2,7 +2,7 @@ แตะที่สัญลักษณ์แว่นขยายเพื่อเริ่มต้น เผยแพร่เมื่อ %1$s - ไม่พบแอปที่สามารถสตรีมสื่อวีดีโอได้ คุณต้องการติดตั้ง VLC หรือไม่\? + ไม่พบแอปที่สามารถสตรีมสื่อวีดีโอได้ คุณต้องการติดตั้ง VLC หรือไม่? ไม่พบแอปที่สามารถสตรีมสื่อวีดีโอได้ (คุณสามารถติดตั้ง VLC เพื่อดูวีดีโอ) ติดตั้ง ยกเลิก @@ -13,7 +13,7 @@ ดาวน์โหลดไฟล์สตรีม ค้นหา ตั้งค่า - หรือคุณหมายถึง \"%1$s\"\? + หรือคุณหมายถึง \"%1$s\"? แชร์ด้วย ใช้เครื่องเล่นวีดิโอภายนอก ใช้เครื่องเล่นเสียงภายนอก @@ -42,7 +42,7 @@ แสดงความละเอียดที่สูงขึ้น เฉพาะบางอุปกรณ์ที่รองรับการเล่นวิดีโอ 2K/4K เปิดด้วย Kodi - ไม่พบแอป Kore จะติดตั้งหรือไม่\? + ไม่พบแอป Kore จะติดตั้งหรือไม่? แสดงตัวเลือก \"เปิดด้วย Kodi\" แสดงตัวเลือกในการเล่นวิดีโอผ่าน Kodi media center เสียง @@ -51,7 +51,7 @@ ธีม สว่าง มืด - สีดำ + ดำ จำขนาดและตำแหน่งของป๊อปอัพ จำขนาดและตำแหน่งสุดท้ายของป๊อปอัพ ใช้การข้ามที่ไม่แม่นยำ @@ -121,14 +121,14 @@ ส่งออกประวัติการดู ช่องที่ได้บอกรับและเพลย์ลิสต์ ล้างประวัติการดู ลบประวัติของวีดีโอที่เคยเล่น - ลบประวัติการดูทั้งหมดหรือไม่\? + ลบประวัติการดูทั้งหมดหรือไม่? ล้างประวัติการค้นหา ลบประวัติของคำที่เคยค้นหา - ลบประวัติการค้นหาทั้งหมดหรือไม่\? + ลบประวัติการค้นหาทั้งหมดหรือไม่? ลบประวัติการค้นหาแล้ว เกิดข้อผิดพลาด พื้นที่เก็บข้อมูลภายนอกไม่พร้อมใช้งาน - การดาวน์โหลดไปยังการ์ดความจำภายนอกยังไม่สามารถทำได้ รีเซ็ตตำแหน่งโฟลเดอร์ดาวน์โหลดหรือไม่\? + การดาวน์โหลดไปยังการ์ดความจำภายนอกยังไม่สามารถทำได้ รีเซ็ตตำแหน่งโฟลเดอร์ดาวน์โหลดหรือไม่? ข้อผิดพลาดของเครือข่าย ไม่สามารถโหลดรูปขนาดย่อทั้งหมด ไม่สามารถแยกวิเคราะห์เว็บไซต์ @@ -149,7 +149,7 @@ ไม่มีสตรีมให้ดาวน์โหลด เรียกคืนการวางตำแหน่งแท็บเป็นค่าเดิม เนื่องจากพบข้อผิดพลาดในการอ่านการวางตำแหน่งแท็บที่บันทึกไว้ คืนค่าเริ่มต้น - คุณต้องการคืนค่าเริ่มต้นหรือไม่\? + คุณต้องการคืนค่าเริ่มต้นหรือไม่? รายงานข้อผิดพลาดผ่านทาง e-mail ข้อมูล: เกิดอะไรขึ้น: @@ -188,8 +188,7 @@ โปรดรอ… คัดลอกไปที่คลิปบอร์ดแล้ว โปรดเลือกโฟลเดอร์ดาวน์โหลดที่พร้อมใช้งาน - การอนุญาตนี้เป็นสิ่งจำเป็นเพื่อ -\nเปิดในโหมดป๊อปอัป + การอนุญาตนี้เป็นสิ่งจำเป็นเพื่อ \nเปิดในโหมดป๊อปอัป ลบ 1 รายการแล้ว ดาวน์โหลด อักขระที่อนุญาตในชื่อไฟล์ @@ -211,14 +210,13 @@ เว็บไซต์ เยี่ยมชมเว็บไซต์ NewPipe เพื่อดูข้อมูลและข่าวสารเพิ่มเติม นโยบายความเป็นส่วนตัวของ NewPipe - โครงการ NewPipe คำนึงถึงความเป็นส่วนตัวของคุณอย่างจริงจัง ดังนั้นแอปจะไม่เก็บรวบรวมข้อมูลใดๆ โดยไม่ได้รับความยินยอมจากคุณ -\nนโยบายความเป็นส่วนตัวของ NewPipe มีการอธิบายในรายละเอียดเกี่ยวกับข้อมูลที่จะถูกส่งออกไปและเก็บไว้เมื่อคุณรายงานความผิดพลาดของแอป + โครงการ NewPipe คำนึงถึงความเป็นส่วนตัวของคุณอย่างจริงจัง ดังนั้นแอปจะไม่เก็บรวบรวมข้อมูลใดๆ โดยไม่ได้รับความยินยอมจากคุณ \nนโยบายความเป็นส่วนตัวของ NewPipe มีการอธิบายในรายละเอียดเกี่ยวกับข้อมูลที่จะถูกส่งออกไปและเก็บไว้เมื่อคุณรายงานความผิดพลาดของแอป อ่านนโยบายความเป็นส่วนตัว ใบอนุญาตของ NewPipe อ่านใบอนุญาต ประวัติ ประวัติ - คุณต้องการลบรายการนี้ออกจากประวัติการค้นหาหรือไม่\? + คุณต้องการลบรายการนี้ออกจากประวัติการค้นหาหรือไม่? เล่นครั้งล่าสุด เล่นมากที่สุด เนื้อหาของหน้าหลัก @@ -234,7 +232,7 @@ ไม่มีไฟล์ ZIP ที่ถูกต้อง คำเตือน: ไม่สามารถนำเข้าไฟล์ทั้งหมดได้ สิ่งนี้จะแทนที่การตั้งค่าปัจจุบันของคุณ - คุณยังต้องการนำเข้าการตั้งค่าด้วยหรือไม่\? + คุณยังต้องการนำเข้าการตั้งค่าด้วยหรือไม่? ไม่สามารถโหลดความคิดเห็นได้ มาแรง 50 อันดับแรก @@ -261,7 +259,7 @@ ตั้งเป็นรูปขนาดย่อของเพลย์ลิสต์ เก็บเพลย์ลิสต์ เอาที่คั่นหน้าออก - ลบเพลย์ลิสต์นี้หรือไม่\? + ลบเพลย์ลิสต์นี้หรือไม่? สร้างเพลย์ลิสต์แล้ว เพิ่มลงในเพลย์ลิสต์แล้ว เปลี่ยนภาพย่อของเพลย์ลิสต์แล้ว @@ -270,7 +268,7 @@ เติม ขยาย สร้างขึ้นโดยอัตโนมัติ - คำบรรยายภาพ + คำบรรยาย ปรับเปลี่ยนขนาดตัวอักษร สีของข้อความหรือพื้นหลังของคำอธิบายภาพ (จำเป็นตองปิดและเปิดแอปใหม่เพื่อให้การเปลี่ยนแปลงมีผล) การตรวจสอบการรั่วไหลของหน่วยความจำอาจทำให้แอปจะไม่ตอบสนองเมื่อมีการดึงข้อมูลจากหน่วยความจำ นำเข้า @@ -282,20 +280,9 @@ การส่งออกก่อนหน้านี้ ไม่สามารถนำเข้าการสมัครรับข้อมูล ไม่สามารถส่งออกการสมัครรับข้อมูล - นำเข้ารายการช่องที่บอกรับใน YouTube โดยการดาวน์โหลดไฟล์การส่งออก: -\n -\n1. ไปที่ URL นี้: %1$s -\n2. เข้าสู่ระบบเมื่อระบบถาม -\n3. การดาวน์โหลดควรเริ่มต้น (นั่นคือไฟล์ที่ส่งออก) - นำเข้าโปรไฟล์ SoundCloud โดยการพิมพ์ URL หรือรหัสไอดีผู้ใช้ของคุณ: -\n -\n1. เปิดใช้งาน \"โหมดเดสก์ท็อป\" ในเว็บเบราว์เซอร์ (เว็บไซต์ไม่สามารถใช้ได้สำหรับอุปกรณ์มือถือ) -\n2. ไปที่ URL นี้: %1$s -\n3. เข้าสู่ระบบเมื่อระบบถาม -\n4. คัดลอก URL ของโปรไฟล์ที่คุณถูกเปลี่ยนเส้นทางไป - โปรดทราบว่าการดำเนินการนี้อาจใช้งานข้อมูลมือถือที่มีค่าใช้จ่าย -\n -\nคุณต้องการที่จะทำต่อไปหรือไม่\? + นำเข้ารายการช่องที่บอกรับใน YouTube โดยการดาวน์โหลดไฟล์การส่งออก: \n \n1. ไปที่ URL นี้: %1$s \n2. เข้าสู่ระบบเมื่อระบบถาม \n3. การดาวน์โหลดควรเริ่มต้น (นั่นคือไฟล์ที่ส่งออก) + นำเข้าโปรไฟล์ SoundCloud โดยการพิมพ์ URL หรือรหัสไอดีผู้ใช้ของคุณ: \n \n1. เปิดใช้งาน \"โหมดเดสก์ท็อป\" ในเว็บเบราว์เซอร์ (เว็บไซต์ไม่สามารถใช้ได้สำหรับอุปกรณ์มือถือ) \n2. ไปที่ URL นี้: %1$s \n3. เข้าสู่ระบบเมื่อระบบถาม \n4. คัดลอก URL ของโปรไฟล์ที่คุณถูกเปลี่ยนเส้นทางไป + โปรดทราบว่าการดำเนินการนี้อาจใช้งานข้อมูลมือถือที่มีค่าใช้จ่าย \n \nคุณต้องการที่จะทำต่อไปหรือไม่? การควบคุมความเร็วในการเล่น จังหวะ เสียงสูงต่ำ @@ -303,8 +290,7 @@ กรอไปข้างหน้าระหว่างความเงียบ ทีละ รีเซ็ต - เพื่อให้สอดคล้องกับระเบียบข้อบังคับว่าด้วยการป้องกันข้อมูลทั่วไปของยุโรป (GDPR) เราขอแนะนำให้คุณอ่านนโยบายความเป็นส่วนตัวของ NewPipe อย่างระมัดระวังและถี่ถ้วน -\nคุณต้องยอมรับข้อตกลงเพื่ออนุญาตให้ส่งรายงานข้อผิดพลาดถึงเรา + เพื่อให้สอดคล้องกับระเบียบข้อบังคับว่าด้วยการป้องกันข้อมูลทั่วไปของยุโรป (GDPR) เราขอแนะนำให้คุณอ่านนโยบายความเป็นส่วนตัวของ NewPipe อย่างระมัดระวังและถี่ถ้วน \nคุณต้องยอมรับข้อตกลงเพื่ออนุญาตให้ส่งรายงานข้อผิดพลาดถึงเรา ยอมรับ ปฏิเสธ ไม่จำกัด @@ -367,7 +353,7 @@ ตัดหน้าปกวิดีโอที่แสดงในการแจ้งเตือนจากอัตราส่วน 16:9 เป็น 1:1 เครื่องเล่นวิดีโอแครช ปุ่มคำสั่งที่สอง - โหมดกลางคืน + ธีมมืด เลือกเสียงต้นฉบับโดยไม่คำนึงถึงภาษาที่ใช้ ปิดเพื่อซ่อนคำอธิบายของวิดีโอและข้อมูลเพิ่มเติมอื่นๆ ชอบเสียงต้นฉบับมากกว่า @@ -452,4 +438,7 @@ เปิดใช้งาน \"โหมดจำกัด\" ของ YouTube YouTube มี \"โหมดจำกัด\" ที่สามารถซ่อนเนื้อหาที่ไม่เหมาะสมได้ วิดีโอนี้มีข้อจำกัดด้านอายุ\n\nหากต้องการรับชม โปรดเปิดใช้งาน \"%1$s\" ในตั้งค่า + อัตโนมัติ (ตามธีมของอุปกรณ์) + คุณสามารถเลือกธีมมืดที่ต้องการได้ด้านล่าง + โหมดแท็บเล็ต diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index d41b317e8..f1e665cda 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -2,9 +2,7 @@ Maliwanag Madilim - Ang video na ito ay may paghihigpit sa edad. -\n -\nDahil sa mga bagong polisiya ng Youtube, hindi maaring ma-access ng NewPipe ang mga video streams nito, kaya hindi ito maipapalabas. + Ang video na ito ay may paghihigpit sa edad. \n \nDahil sa mga bagong polisiya ng Youtube, hindi maaring ma-access ng NewPipe ang mga video streams nito, kaya hindi ito maipapalabas. Di-mabago ang subscription Patayin upang maitago ang mga puna I-tanda bilang napanood na @@ -12,7 +10,7 @@ I-download I-download ang stream file Ayos ng App - Ibig mo bang sabihin \"%1$s\"\? + Ibig mo bang sabihin \"%1$s\"? Ipinapakita ang mga resulta para sa: %s Buksan sa Pindutin ang magnifiying glass upang magsimula. @@ -61,9 +59,7 @@ Hindi mai-karga ang mga puna Naka-pin na puna Patayin upang itago ang paglalarawan ng video at ang karagdagang kaalaman nito - Ang video na ito ay may paghihigpit sa edad. -\n -\nBuksan ang \"%1$s\" sa ayos ng app kung gusto mong makita ito. + Ang video na ito ay may paghihigpit sa edad. \n \nBuksan ang \"%1$s\" sa ayos ng app kung gusto mong makita ito. Mga Artista Nakalutang - \ No newline at end of file + diff --git a/app/src/main/res/values-tok/strings.xml b/app/src/main/res/values-tok/strings.xml index 8b6fef40b..e0f113a04 100644 --- a/app/src/main/res/values-tok/strings.xml +++ b/app/src/main/res/values-tok/strings.xml @@ -1,7 +1,7 @@ ni li kama lon lon tenpo %1$s - sina jo ala e ilo pi lukin e sitelen tawa. sina wile kama jo e ilo VLC anu seme\? + sina jo ala e ilo pi lukin e sitelen tawa. sina wile kama jo e ilo VLC anu seme? o kama jo. o weka. pona. @@ -25,7 +25,7 @@ sina jo ala e ilo pi lukin e sitelen tawa. (sina wile lukin la, sina ken kama jo e ilo VLC). o lukin sitelen ante - sina wile toki e \"%1$s\" anu seme\? + sina wile toki e \"%1$s\" anu seme? mi lawa la sina wile toki e: %s o pana e ni tawa jan ni li pana e sitelen tawa la, o toki tawa mi @@ -41,7 +41,7 @@ poki lipu kalama lon ilo sina poki lipu kalama lon ilo sina li lon ma ni o oko e pona lukin pi sitelen tawa pi pona mute mute - sina wile kama jo e ilo Kole (Kore) anu seme\? + sina wile kama jo e ilo Kole (Kore) anu seme? sin pimeja kalama diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 40fe3d0f8..d2719b864 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -10,7 +10,7 @@ İndir Ara Ayarlar - Bunu mu demek istediniz: \"%1$s\"\? + Bunu mu demek istediniz: \"%1$s\"? Şununla paylaş Dış video oynatıcı kullan Dış ses oynatıcı kullan @@ -22,7 +22,7 @@ Ses dosyaları için indirme klasörünü seç Varsayılan çözünürlük Kodi ile oynat - Eksik Kore uygulaması yüklensin mi\? + Eksik Kore uygulaması yüklensin mi? \"Kodi ile oynat\" seçeneğini göster Kodi ortam merkezi üzerinden video oynatmak için bir seçenek göster Varsayılan ses biçimi @@ -88,8 +88,7 @@ Devre dışı Yorumunuz (İngilizce): Ayrıntılar: - Bu izin, açılır pencere kipinde -\naçmak için gereklidir + Bu izin, açılır pencere kipinde \naçmak için gereklidir reCAPTCHA formu reCAPTCHA formu istendi Arka plan @@ -152,7 +151,7 @@ Video yok Geçmiş Geçmiş - Bu ögeyi arama geçmişinden silmek istiyor musunuz\? + Bu ögeyi arama geçmişinden silmek istiyor musunuz? \"Basılı tutarak kuyruğa ekle\" ipucunu göster Video \"Ayrıntılar:\" sayfasında arka plan ya da açılır pencere düğmesine basıldığında ipucu göster Tümünü Oynat @@ -225,7 +224,7 @@ Oynatma listesi küçük resmi olarak ayarla Oynatma listesini yer imlerine ekle Yer imini kaldır - Bu oynatma listesi silinsin mi\? + Bu oynatma listesi silinsin mi? Oynatma listesi oluşturuldu Oynatma listesine eklendi Oynatma listesinin küçük resmi değiştirildi. @@ -257,25 +256,10 @@ Önceki dışa aktarım Abonelikler içe aktarılamadı Abonelikler dışa aktarılamadı - Google Takeout\'tan YouTube aboneliklerini içe aktar: -\n -\n1. Şu adrese gidin: %1$s -\n2. Sorulduğunda hesabınıza giriş yapın -\n3. \"Tüm veriler dahil\"e ve sonrasında \"Hiçbirini seçme\"ye tıklayın, ardından yalnızca \"abonelikler\"i seçin ve \"Tamam\"a tıklayın -\n4. \"Sonraki adım\"a ve ardından \"Dışa aktar\"a tıklayın -\n5. Göründüğünde \"İndir\" düğmesini tıklayın -\n6. Aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve indirilen .zip dosyasını seçin -\n7. [.zip içe aktarma işlemi başarısız olursa] .csv dosyasını çıkarın (genellikle \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve çıkarılan csv dosyasını seçin - URL\'yi veya ID\'nizi yazarak SoundCloud profilini içe aktarın: -\n -\n1. Web tarayıcısında \"masaüstü kipi\" etkinleştirin (site, mobil aygıtlar için uygun değildir) -\n2. Şu adrese gidin: %1$s -\n3. Sorulduğunda giriş yapın -\n4. Yönlendirildiğiniz profil URL\'sini kopyalayın. + Google Takeout\'tan YouTube aboneliklerini içe aktar: \n \n1. Şu adrese gidin: %1$s \n2. Sorulduğunda hesabınıza giriş yapın \n3. \"Tüm veriler dahil\"e ve sonrasında \"Hiçbirini seçme\"ye tıklayın, ardından yalnızca \"abonelikler\"i seçin ve \"Tamam\"a tıklayın \n4. \"Sonraki adım\"a ve ardından \"Dışa aktar\"a tıklayın \n5. Göründüğünde \"İndir\" düğmesini tıklayın \n6. Aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve indirilen .zip dosyasını seçin \n7. [.zip içe aktarma işlemi başarısız olursa] .csv dosyasını çıkarın (genellikle \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), aşağıdaki DOSYAYI İÇE AKTAR düğmesini tıklayın ve çıkarılan csv dosyasını seçin + URL\'yi veya ID\'nizi yazarak SoundCloud profilini içe aktarın: \n \n1. Web tarayıcısında \"masaüstü kipi\" etkinleştirin (site, mobil aygıtlar için uygun değildir) \n2. Şu adrese gidin: %1$s \n3. Sorulduğunda giriş yapın \n4. Yönlendirildiğiniz profil URL\'sini kopyalayın. kimliginiz, soundcloud.com/kimliginiz - Bu sürecin ağa yük olabileceğini unutmayın. -\n -\nSürdürmek istiyor musunuz\? + Bu sürecin ağa yük olabileceğini unutmayın. \n \nSürdürmek istiyor musunuz? Resim önbelleği temizlendi Önbelleğe alınmış meta verileri silin Önbelleğe alınmış tüm web sayfası verilerini kaldır @@ -291,11 +275,11 @@ Oynatıcı alt yazı metin ölçeğini ve arka plan biçimini değiştirin. Etkili olması için uygulamayı yeniden başlatma gerektirir İzleme geçmişini temizle Oynatılan akışların geçmişini ve kalınan oynatım konumlarını siler - İzleme geçmişinin tamamı silinsin mi\? + İzleme geçmişinin tamamı silinsin mi? İzleme geçmişi silindi Arama geçmişini temizle Aramada kullanılan anahtar kelimelerin geçmişini siler - Tüm arama geçmişi silinsin mi\? + Tüm arama geçmişi silinsin mi? Arama geçmişi silindi 1 öge silindi. NewPipe, telif müsaadeli özgür yazılımdır: İstediğiniz gibi kullanabilir, öğrenebilir, paylaşabilir ve geliştirebilirsiniz. Özellikle, Özgür Yazılım Vakfı tarafından yayımlanan GNU Genel Kamu Lisansı 3. sürümü veya (isterseniz) daha sonraki sürümleri koşulları altında yeniden dağıtabilir ve/veya değiştirebilirsiniz. @@ -303,8 +287,7 @@ NewPipe\'ın Gizlilik İlkesi NewPipe projesi, gizliliğinizi çok önemsiyor. Bu nedenle, uygulama izniniz olmadan herhangi bir veri toplamaz.\nNewPipe\'ın gizlilik ilkesi, çökme raporu gönderdiğinizde hangi verilerin gönderildiğini ve saklandığını ayrıntılı olarak açıklar. Gizlilik ilkesini oku - Avrupa Genel Veri Koruma Yönetmeliğine (GDPR) uymak için, dikkatinizi NewPipe\'ın gizlilik ilkesine çekiyoruz. Lütfen dikkatlice okuyun. -\nBize hata bildirimini göndermek için kabul etmelisiniz. + Avrupa Genel Veri Koruma Yönetmeliğine (GDPR) uymak için, dikkatinizi NewPipe\'ın gizlilik ilkesine çekiyoruz. Lütfen dikkatlice okuyun. \nBize hata bildirimini göndermek için kabul etmelisiniz. Kabul et Reddet Sınır yok @@ -328,10 +311,10 @@ Uygulama güncelleme bildirimi Yeni NewPipe sürümleri için bildirimler Dış depolama kullanılamıyor - Dış SD karta indirilemiyor. İndirme klasörü konumu sıfırlansın mı\? + Dış SD karta indirilemiyor. İndirme klasörü konumu sıfırlansın mı? Kayıtlı sekmeler okunamadı, bu nedenle öntanımlılar kullanılıyor Öntanımlıları geri yükle - Öntanımlıları geri yüklemek istiyor musunuz\? + Öntanımlıları geri yüklemek istiyor musunuz? Abone sayısı yok Ana sayfada hangi sekmeler gösterilir Güncellemeler @@ -389,19 +372,18 @@ Aygıt üzerinde yer yok İlerleme kaybedildi, çünkü dosya silinmiş Bağlantı zaman aşımı - İndirme geçmişinizi temizlemek veya indirilen tüm dosyaları silmek istiyor musunuz\? + İndirme geçmişinizi temizlemek veya indirilen tüm dosyaları silmek istiyor musunuz? İndirme kuyruğunu sınırla Aynı anda yalnızca bir indirme yürütülecek İndirmeleri başlat İndirmeleri duraklat Nereye indirileceğini sor - Her indirmede nereye kaydedileceği sorulacak. -\nDış SD karta indirmek istiyorsanız sistem klasör seçiciyi (SAF) etkinleştirin + Her indirmede nereye kaydedileceği sorulacak. \nDış SD karta indirmek istiyorsanız sistem klasör seçiciyi (SAF) etkinleştirin Sistem klasör seçiciyi (SAF) kullan \'Depolama Erişimi Çerçevesi\' dış SD karta indirmeyi sağlar Oynatım konumlarını sil Tüm oynatım konumlarını siler - Tüm oynatım konumları silinsin mi\? + Tüm oynatım konumları silinsin mi? Hizmeti değiştir, şu anda seçili olan: %s video @@ -473,7 +455,7 @@ %d öge seçildi Boş grup adı - Bu grubu silmek istiyor musunuz\? + Bu grubu silmek istiyor musunuz? Yeni Akış Akış güncelleme eşiği @@ -483,28 +465,14 @@ Bazı servislerde kullanılabilir, genellikle daha hızlıdır ancak kısıtlı sayıda öge ve eksik bilgi (örn. süre, öge türü, canlı durumu olmaksızın) getirilebilir Hızlı kipi etkinleştir Hızlı kipi devre dışı bırak - Akışın çok yavaş yüklendiğini mi düşünüyorsunuz\? Öyleyse, hızlı yüklemeyi etkinleştirin (ayarlardan değiştirebilir veya aşağıdaki düğmeye dokunabilirsiniz). -\n -\nNewPipe iki akış yükleme yordamı sunar: -\n• Tüm abonelik kanalını edinme, bu yavaş ancak tamdır. -\n• Adanmış hizmet son noktası kullanır, bu hızlıdır ancak genellikle tam değildir. -\n -\nİkisinin arasındaki fark, hızlı olanın genellikle ögenin süresi veya türü (canlı ve sıradan videoları ayrımsayamaz) gibi bazı bilgilerden yoksunluğu ve daha az öge getirmesidir. -\n -\nYouTube, RSS akışıyla bu hızlı yöntemi sunan servislerden biridir. -\n -\nSeçim, sizin neyi yeğlediğinize kalmış: hız veya kusursuz bilgi. - Bu içerik henüz NewPipe tarafından desteklenmiyor. -\n -\nUmarım gelecekteki bir sürümde desteklenir. + Akışın çok yavaş yüklendiğini mi düşünüyorsunuz? Öyleyse, hızlı yüklemeyi etkinleştirin (ayarlardan değiştirebilir veya aşağıdaki düğmeye dokunabilirsiniz). \n \nNewPipe iki akış yükleme yordamı sunar: \n• Tüm abonelik kanalını edinme, bu yavaş ancak tamdır. \n• Adanmış hizmet son noktası kullanır, bu hızlıdır ancak genellikle tam değildir. \n \nİkisinin arasındaki fark, hızlı olanın genellikle ögenin süresi veya türü (canlı ve sıradan videoları ayrımsayamaz) gibi bazı bilgilerden yoksunluğu ve daha az öge getirmesidir. \n \nYouTube, RSS akışıyla bu hızlı yöntemi sunan servislerden biridir. \n \nSeçim, sizin neyi yeğlediğinize kalmış: hız veya kusursuz bilgi. + Bu içerik henüz NewPipe tarafından desteklenmiyor. \n \nUmarım gelecekteki bir sürümde desteklenir. ∞ video 100+ video Sanatçılar Albümler Şarkılar - Bu video yaş kısıtlıdır. -\n -\nGörmek istiyorsanız ayarlarda \"%1$s\" seçeneğini açın. + Bu video yaş kısıtlıdır. \n \nGörmek istiyorsanız ayarlarda \"%1$s\" seçeneğini açın. Oynatma listesine eklenmeden önce ve sonra izlenen yayınlar kaldırılacaktır. \nEmin misiniz? Evet ve kısmen izlenmiş videolar İzlenen yayınları kaldır? @@ -527,7 +495,7 @@ Yalnızca Wi-Fi Oynatmayı kendiliğinden başlat — %s Oynatma kuyruğu - URL tanınamadı. Başka bir uygulamayla açılsın mı\? + URL tanınamadı. Başka bir uygulamayla açılsın mı? Otomatik kuyruğa alış Etkin oynatıcının kuyruğu değiştirilecek Bir oynatıcıdan diğerine geçmek kuyruğunuzu değiştirebilir @@ -577,8 +545,7 @@ Bu içerik özeldir, bu nedenle NewPipe tarafından oynatılamaz ve indirilemez. Bu SoundCloud Go+ parçasıdır, en azından sizin ülkenizde, bu nedenle NewPipe tarafından oynatılamaz ve indirilemez. Bu içerik ülkenizde kullanılamaz. - Bu video yaş kısıtlıdır. -\nYouTube\'un yeni yaş kısıtlı videolar ilkesi gereği, NewPipe böylesi videoların akışına erişemez ve bu nedenle oynatamaz. + Bu video yaş kısıtlıdır. \nYouTube\'un yeni yaş kısıtlı videolar ilkesi gereği, NewPipe böylesi videoların akışına erişemez ve bu nedenle oynatamaz. Öne çıkan Radyo Çöz @@ -608,9 +575,7 @@ Web sitesini aç Hesap sonlandırıldı Hızlı besleme kipi bununla ilgili daha çok bilgi sağlamıyor. - Yazarın hesabı sonlandırılmış. -\nNewPipe, bu beslemeyi gelecekte yükleyemeyecek. -\nBu kanalın aboneliğinden çıkmak ister misiniz\? + Yazarın hesabı sonlandırılmış. \nNewPipe, bu beslemeyi gelecekte yükleyemeyecek. \nBu kanalın aboneliğinden çıkmak ister misiniz? \'%s\' için besleme yüklenemedi. Besleme yüklenirken hata \'Depolama Erişimi Çerçevesi\' yalnızca Android 10\'dan başlayarak desteklenmektedir @@ -652,10 +617,8 @@ \"Oynatıcıyı çöktür\"ü göster Hata bildirimi oluştur Hata balonu göster - Bu eyleme uygun dosya yönetici yok. -\nLütfen dosya yönetici kurun veya indirme ayarlarında \'%s\' devre dışı bırakın - Bu eyleme uygun dosya yönetici bulunamadı. -\nLütfen Depolama Erişimi Çerçevesi uyumlu dosya yönetici kurun + Bu eyleme uygun dosya yönetici yok. \nLütfen dosya yönetici kurun veya indirme ayarlarında \'%s\' devre dışı bırakın + Bu eyleme uygun dosya yönetici bulunamadı. \nLütfen Depolama Erişimi Çerçevesi uyumlu dosya yönetici kurun Hata raporları için bildirimler Oynatıcı kullanırken çöktürme seçeneği gösterir Oynatıcıyı çökert @@ -681,7 +644,7 @@ Aboneliklerden yeni akışlarla ilgili bildirim gönder Denetleme sıklığı Herhangi bir ağ - İndirilen tüm dosyalar diskten silinsin mi\? + İndirilen tüm dosyalar diskten silinsin mi? , Tümünü değiştir Yüzde @@ -712,8 +675,8 @@ Donanımsal ortam düğmesi olaylarını yoksay Örneğin, fiziksel düğmeleri bozuk bir kulaklık kullanıyorsanız kullanışlıdır Kopyaları kaldır - Kopyalar kaldırılsın mı\? - Bu oynatma listesindeki tüm yinelenen akışları kaldırmak istiyor musunuz\? + Kopyalar kaldırılsın mı? + Bu oynatma listesindeki tüm yinelenen akışları kaldırmak istiyor musunuz? Aşağıdaki akışları göster Akışları göster/gizle Tamamen izlendi @@ -746,9 +709,7 @@ Ortam tünelleme öntanımlı olarak devre dışı bırakılmıştır çünkü aygıt modelinizin desteği bilinmemektedir. Çözücü ilklendirme sorunlarınız varsa bu seçeneği etkinleştirin, eğer birincil çözücülerin ilklendirmesi başarısızsa düşük öncelikli çözücülere dönülür. Bu, birincil çözücüler kullanılırkenki başarımdan daha kötü sonuçlanabilir Her zaman ExoPlayer\'ın video çıktısı yüzey ayar çözümünü kullan - Bu çözüm, bir yüzey değişimi yaşandığında yüzeyi doğrudan kodlayıcıya ayarlamaktansa video kodlayıcısını serbest bırakır ve yeniden örneklendirir. Bu sorunu olan bazı aygıtlarda ExoPlayer tarafından halihazırda kullanılır, bu ayar yalnızca Android 6 ve üstünde etkilidir -\n -\nBu ayarı etkinleştirmek, geçerli video oynatıcısını değiştirirken veya tam ekrana geçerkenki oynatma hatalarını önleyebilir + Bu çözüm, bir yüzey değişimi yaşandığında yüzeyi doğrudan kodlayıcıya ayarlamaktansa video kodlayıcısını serbest bırakır ve yeniden örneklendirir. Bu sorunu olan bazı aygıtlarda ExoPlayer tarafından halihazırda kullanılır, bu ayar yalnızca Android 6 ve üstünde etkilidir \n \nBu ayarı etkinleştirmek, geçerli video oynatıcısını değiştirirken veya tam ekrana geçerkenki oynatma hatalarını önleyebilir Progresif içeriklerdeki yükleme aralığı boyutunu değiştir (şu anda %s). Daha düşük değer ilk yüklemeyi hızlandırabilir Sol hareket işlemi Parmağınızı ekranın sağ yarısında kaydırırken ne yapılacağını seçin @@ -760,8 +721,7 @@ Kanal sayfalarında hangi sekmelerin gösterileceği Adres Listesiyle Paylaş Başlıklarla Paylaş - %1$s -\n%2$s + %1$s \n%2$s Kanal sekmeleri Shorts Üst Veri Yükleniyor… @@ -807,13 +767,10 @@ Yedekle ve geri yükle Ayarları sıfırla Tüm ayarları öntanımlı değerlerine sıfırlayın - Tüm ayarları sıfırlamak, tercih edilen tüm ayarlarınızı kaldırır ve uygulamayı yeniden başlatır. -\n -\nDevam etmek istediğinizden emin misiniz? + Tüm ayarları sıfırlamak, tercih edilen tüm ayarlarınızı kaldırır ve uygulamayı yeniden başlatır. \n \nDevam etmek istediğinizden emin misiniz? Evet Hayır - NewPipe zaman zaman yeni sürümleri kendiliğinden denetleyebilir ve kullanılabilir olduklarında sizi bilgilendirebilir. -\nBunu etkinleştirmek istiyor musunuz? + NewPipe zaman zaman yeni sürümleri kendiliğinden denetleyebilir ve kullanılabilir olduklarında sizi bilgilendirebilir. \nBunu etkinleştirmek istiyor musunuz? İçe aktarılmakta olan dışa aktarımdaki ayarlar, NewPipe 0.27.0\'dan itibaren kullanımdan kaldırılan güvenlik açığı olan bir biçim kullanmaktadır. İçe aktarılmakta olan dışa aktarımın güvenilir bir kaynaktan alındığından emin olun ve gelecekte yalnızca NewPipe 0.27.0 veya daha yeni sürümlerden alınan dışa aktarımları kullanmayı tercih edin. Bu güvenlik açığı bulunan biçimdeki ayarları içe aktarma desteği yakında tamamen kaldırılacak ve ardından NewPipe\'ın eski sürümleri artık yeni sürümlerden dışa aktarılan ayarların içe aktarımını yapamayacaktır. ikincil Oynatma Listeleri diff --git a/app/src/main/res/values-tt/strings.xml b/app/src/main/res/values-tt/strings.xml index a482de21e..db90f3fcd 100644 --- a/app/src/main/res/values-tt/strings.xml +++ b/app/src/main/res/values-tt/strings.xml @@ -49,4 +49,4 @@ [Билгесез] Барысын да уйнату Һәрвакыт - \ No newline at end of file + diff --git a/app/src/main/res/values-tzm/strings.xml b/app/src/main/res/values-tzm/strings.xml index 48a3ca921..461a95615 100644 --- a/app/src/main/res/values-tzm/strings.xml +++ b/app/src/main/res/values-tzm/strings.xml @@ -69,7 +69,7 @@ Sty yat n tbadut Tasna n Tbadut Tasna n ukiyusk - Is nit txsed ad tkksed aferdis-a seg umezruy n urezzu\? + Is nit txsed ad tkksed aferdis-a seg umezruy n urezzu? Ẓeṛ g GitHub %s uvidyu @@ -84,9 +84,9 @@ Mel g GitHub Ittwakkes umzruy n wannay. Ittwakkes umezruy n urezzu. - Kkes amzruy n urezzu maṛṛa\? + Kkes amzruy n urezzu maṛṛa? Sfeḍ amzruy n urezzu - Kkes amzruy n wannay maṛṛa\? + Kkes amzruy n wannay maṛṛa? Tineɣmisin i tleqqimt tamaynut n NewPipe Γer maṛṛa Ittwakkes ufaylu @@ -141,7 +141,7 @@ Ssemres ameɣri n imsli abeṛṛani La-ittekkes imsli d kra n tɣariwin Asenṭeḍ ameɣri n uvidyu abeṛṛani - Txsed ad tarad \"%1$s\"\? + Txsed ad tarad \"%1$s\"? Asgum n yiḍ Ṛẓem s Tirubba n tbadut diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index fa2f77084..1d26073c1 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -1,7 +1,7 @@ Опубліковано %1$s - Програвач потокового відео не знайдений. Встановити VLC\? + Програвач потокового відео не знайдений. Встановити VLC? Встановити Скасувати Відкрити в браузері @@ -9,7 +9,7 @@ Завантажити Пошук Налаштування - Ви мали на увазі: «%1$s»\? + Ви мали на увазі: «%1$s»? Поширити через Зовнішній відеопрогравач Зовнішній аудіопрогравач @@ -21,7 +21,7 @@ Завантажені аудіофайли зберігаються тут Типова роздільність Програти в Kodi - Установити відсутній застосунок Kore\? + Установити відсутній застосунок Kore? Показати опцію «Відтворити у Kodi» Показати опцію відтворення відео в Kodi Аудіо @@ -137,8 +137,7 @@ Аудіопотоки не знайдено Немає підписників Немає відео - Цей дозвіл потрібен для перегляду -\nу віконному режимі + Цей дозвіл потрібен для перегляду \nу віконному режимі Завантажити Допустимі символи в назвах файлів Недопустимі символи замінюватимуться цим значенням @@ -180,11 +179,13 @@ %s підписник %s підписники %s підписників + %s підписників %s відео %s відео %s відео + %s відео Створити Відхилити @@ -200,6 +201,7 @@ %s перегляд %s перегляди %s переглядів + %s переглядів Перевірка reCAPTCHA Запит перевірки reCAPTCHA @@ -210,7 +212,7 @@ Ліцензія NewPipe Ознайомитися з ліцензією Історія - Видалити цей елемент з історії пошуку\? + Видалити цей елемент з історії пошуку? Відтворювалося останнім Відтворювалося найбільше Вміст на головній сторінці @@ -238,7 +240,7 @@ Призначити ескізом добірки Додати добірку до закладок Видалити закладку - Видалити цю добірку\? + Видалити цю добірку? Добірку створено Додано в добірку Ескіз добірки змінено. @@ -269,25 +271,10 @@ Попереднє експортування Не вдалося імпортувати підписки Не вдалося експортувати підписки - Імпортуйте підписки YouTube за допомогою Google Takeout: -\n -\n1. Перейдіть за посиланням: %1$s -\n2. Авторизуйтесь, якщо буде потрібно -\n3. Позначте пункт «YouTube і YouTube Music», потім виберіть тип «підписки» -\n4. Натисніть «Наступний крок» і «Експортувати дані» -\n5. Натисніть кнопку «Завантажити», коли вона з\'явиться -\n6. Натисніть на ІМПОРТУВАТИ ФАЙЛ нижче і виберіть завантажений zip-файл -\n7. [Якщо не вдалося імпортувати zip] Видобудьте файл .csv (зазвичай у розділі «YouTube і YouTube Music/Підписки/subscriptions.csv»), натисніть ІМПОРТУВАТИ ФАЙЛ нижче та виберіть видобутий файл csv - Імпортуйте профіль SoundCloud, вписавши або URL, або ваш ID: -\n -\n1. Увімкніть режим «Версія для ПК» у браузері (сайт не підтримується мобільними пристроями) -\n2. Перейдіть за цим посиланням: %1$s -\n3. За запитом увійдіть до облікового запису -\n4. Скопіюйте URL профілю, до якого ви будете переспрямовані. + Імпортуйте підписки YouTube за допомогою Google Takeout: \n \n1. Перейдіть за посиланням: %1$s \n2. Авторизуйтесь, якщо буде потрібно \n3. Позначте пункт «YouTube і YouTube Music», потім виберіть тип «підписки» \n4. Натисніть «Наступний крок» і «Експортувати дані» \n5. Натисніть кнопку «Завантажити», коли вона з\'явиться \n6. Натисніть на ІМПОРТУВАТИ ФАЙЛ нижче і виберіть завантажений zip-файл \n7. [Якщо не вдалося імпортувати zip] Видобудьте файл .csv (зазвичай у розділі «YouTube і YouTube Music/Підписки/subscriptions.csv»), натисніть ІМПОРТУВАТИ ФАЙЛ нижче та виберіть видобутий файл csv + Імпортуйте профіль SoundCloud, вписавши або URL, або ваш ID: \n \n1. Увімкніть режим «Версія для ПК» у браузері (сайт не підтримується мобільними пристроями) \n2. Перейдіть за цим посиланням: %1$s \n3. За запитом увійдіть до облікового запису \n4. Скопіюйте URL профілю, до якого ви будете переспрямовані. вашID, soundcloud.com/yourid - Майте на увазі: ця операція може потребувати багато трафіку. -\n -\nБажаєте продовжити\? + Майте на увазі: ця операція може потребувати багато трафіку. \n \nБажаєте продовжити? Кеш зображень стерто Стерти кеш метаданих Видалити всі кешовані дані вебсторінок @@ -303,20 +290,19 @@ Змінити масштаб тексту субтитрів програвача та стилі тла. Потрібен перезапуск, щоб застосувати зміни Очистити історію переглядів Видаляє історію відтворень і позицій відтворення - Видалити всю історію переглядів\? + Видалити всю історію переглядів? Історію переглядів видалено Очистити історію пошуку Видаляє історію пошукових запитів - Видалити всю історію пошуку\? + Видалити всю історію пошуку? Історію пошуку видалено Видалено 1 елемент. NewPipe — це copyleft libre програмне забезпечення: ви можете вільно використовувати, вивчати, поширювати та вдосконалювати його. Зокрема, ви можете розповсюджувати та/або змінювати його на умовах GNU General Public License, опублікованої Free Software Foundation, версії 3 або (на ваш вибір) будь-якої пізнішої версії. - Імпортувати разом з налаштуваннями\? + Імпортувати разом з налаштуваннями? Політика конфіденційності NewPipe Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає жодних даних без вашої згоди. \nПолітика приватності NewPipe докладно описує, які дані надсилаються і зберігаються у звіті про збій. Ознайомитися з політикою конфіденційності - З метою дотримання Загального регламенту про захист даних ЄС (General Data Protection Regulation, GDPR) ми звертаємо вашу увагу на політику приватності NewPipe. Будь ласка, прочитайте уважно. -\nВи маєте прийняти її, аби надіслати нам звіт про помилку. + З метою дотримання Загального регламенту про захист даних ЄС (General Data Protection Regulation, GDPR) ми звертаємо вашу увагу на політику приватності NewPipe. Будь ласка, прочитайте уважно. \nВи маєте прийняти її, аби надіслати нам звіт про помилку. Прийняти Відхилити Без обмежень @@ -345,7 +331,7 @@ Сповіщення про нові версії NewPipe Зовнішнє сховище недоступне Відновити типові налаштування - Відновити типові значення\? + Відновити типові значення? Кількість підписників недоступна Конференції Оновлення @@ -378,7 +364,7 @@ Максимум спроб Найбільша кількість спроб перед скасуванням завантаження Переривати завантаження на небезлімітних з\'єднаннях - Завантаження до зовнішньої SD-карти неможливе. Скинути розташування теки для завантажень\? + Завантаження до зовнішньої SD-карти неможливе. Скинути розташування теки для завантажень? Помилка зчитування збережених вкладок. Використовуються типові вкладки Вкладки, показані на головній сторінці Показувати сповіщення з пропозицією оновити застосунок за наявності нової версії @@ -397,19 +383,18 @@ На пристрої не залишилося вільного простору Прогрес втрачено через видалення файлу Час очікування з\'єднання вичерпано - Очистити історію завантажень чи завантажені файли\? + Очистити історію завантажень чи завантажені файли? Обмежити чергу завантажень Одночасно виконувати лише одне завантаження Почати завантаження Призупинити завантаження Запитувати, куди завантажувати - Вас питатиме, куди зберігати кожне завантаження. -\nУвімкніть системний вибір теки (SAF), якщо бажаєте завантажувати на зовнішню SD-картку + Вас питатиме, куди зберігати кожне завантаження. \nУвімкніть системний вибір теки (SAF), якщо бажаєте завантажувати на зовнішню SD-картку Використовувати системний вибір теки (SAF) Фреймворк доступу до сховища (SAF) дозволяє завантажувати на зовнішню SD-картку Видалити позиції відтворення Видаляє всі позиції відтворення - Видалити всі позиції відтворення\? + Видалити всі позиції відтворення? Перемкнути службу, наразі обрано: Типовий кіоск Немає переглядів @@ -417,12 +402,14 @@ %s глядач %s глядача %s глядачів + %s глядачів Ніхто не слухає %s слухач %s слухача %s слухачів + %s слухачів Швидке перемотування Екземпляри PeerTube @@ -445,48 +432,40 @@ Після завершення натисніть «Готово» Готово Нова - Бажаєте видалити цю групу\? + Бажаєте видалити цю групу? Підписки не вибрані Групи каналів %d день %d дні %d днів + %d днів %d година %d години %d годин + %d годин %d хвилина %d хвилини %d хвилин + %d хвилин %d секунда %d секунди %d секунд + %d секунд Вимкнути звук Увімкнути звук Локальне Відео Не вдалося перевірити сервер - NewPipe ще не підтримує цей вміст. -\n -\nМожливо, підтримка з\'явиться в наступних версіях. - Якщо оновлення підписок здається вам занадто повільним, спробуйте увімкнути швидкий режим (змінити можна в налаштуваннях або кнопкою внизу). -\n -\nNewPipe дозволяє оновлювати підписки різними способами: -\n• Отримання каналу цілком, повільно, але з повною інформацією. -\n• Оновлення через RSS-канал, швидко, але інформація не повна. -\n -\nЗа швидкого оновлення втрачається тривалість елемента і його тип (не можна визначити, трансляція це або звичайне відео), а також елементи каналу. -\n -\nYouTube є прикладом такої служби, яка дозволяє виконувати швидке оновлення по RSS. -\n -\nВибір за вами: швидкість або точність. + NewPipe ще не підтримує цей вміст. \n \nМожливо, підтримка з\'явиться в наступних версіях. + Якщо оновлення підписок здається вам занадто повільним, спробуйте увімкнути швидкий режим (змінити можна в налаштуваннях або кнопкою внизу). \n \nNewPipe дозволяє оновлювати підписки різними способами: \n• Отримання каналу цілком, повільно, але з повною інформацією. \n• Оновлення через RSS-канал, швидко, але інформація не повна. \n \nЗа швидкого оновлення втрачається тривалість елемента і його тип (не можна визначити, трансляція це або звичайне відео), а також елементи каналу. \n \nYouTube є прикладом такої служби, яка дозволяє виконувати швидке оновлення по RSS. \n \nВибір за вами: швидкість або точність. Звичайний режим Швидкий режим Доступно для деяких служб, швидке, але може повертати не весь вміст каналу і часто неповну інформацію (тривалість, тип елемента, статус трансляції) @@ -518,9 +497,7 @@ Виконавці Альбоми Пісні - Це відео з віковим обмеженням. -\n -\nЩоб побачити його ввімкніть «%1$s» в налаштуваннях. + Це відео з віковим обмеженням. \n \nЩоб побачити його ввімкніть «%1$s» в налаштуваннях. Ескіз аватара каналу Оригінальні тексти сервісів будуть видимі в потокових елементах Увімкнути \"Обмежений режим\" YouTube @@ -564,7 +541,7 @@ Повʼязані елементи Коментарі Налаштувати повідомлення про відтворюваний наразі потік - Не розпізнано URL. Відкрити через інший застосунок\? + Не розпізнано URL. Відкрити через інший застосунок? Автоматична черга Показувати метадані Показувати описи @@ -588,8 +565,7 @@ Очистити реп\'яшки (cookies) reCAPTCHA Сповіщення про перебіг відеогешування Сповіщення про відеохешування - Це відео має вікові обмеження. -\nЗгідно з новою політикою YouTube щодо відео з віковими обмеженнями NewPipe не може мати доступ до жодного потоку цього відео і, таким чином, не має можливості відтворити його. + Це відео має вікові обмеження. \nЗгідно з новою політикою YouTube щодо відео з віковими обмеженнями NewPipe не може мати доступ до жодного потоку цього відео і, таким чином, не має можливості відтворити його. Показувати вміст, який, можливо, не підходить для дітей, бо має вікове обмеження (наприклад, 18+) Вимкніть, щоб приховати поля метаданих (автор потоку, вміст потоку або пошуковий запит) Вимкніть, щоб приховати опис відео та додаткові відомості @@ -624,9 +600,7 @@ Тепер можна виділяти текст в описі. Зауважте, що сторінка може мигати і посилання можуть не працювати в режимі виділення. Неможливо завантажити стрічку для «%s». Помилка завантаження стрічки - Обліковий запис автора припинено. -\nNewPipe не зможе завантажити цей канал у майбутньому. -\nВідписатися від цього каналу\? + Обліковий запис автора припинено. \nNewPipe не зможе завантажити цей канал у майбутньому. \nВідписатися від цього каналу? Вимкнути Увімкнути Режим планшета @@ -670,10 +644,8 @@ Сповіщення для звітів про помилки Сталася помилка NewPipe, торкніться, щоб звітувати Сталася помилка. Перегляньте сповіщення - Для цієї дії не знайдено відповідного файлового менеджера. -\nУстановіть файловий менеджер або спробуйте вимкнути «%s» у налаштуваннях завантажень - Для цієї дії не знайдено відповідного файлового менеджера. -\nУстановіть файловий менеджер, сумісний зі Storage Access Framework + Для цієї дії не знайдено відповідного файлового менеджера. \nУстановіть файловий менеджер або спробуйте вимкнути «%s» у налаштуваннях завантажень + Для цієї дії не знайдено відповідного файлового менеджера. \nУстановіть файловий менеджер, сумісний зі Storage Access Framework Показати панель помилок Створити сповіщення про помилку Закріплений коментар @@ -693,7 +665,7 @@ Сповіщати про нові трансляції з підписок Сповіщення вимкнено Будь-яка мережа - Видалити всі завантажені файли з диска\? + Видалити всі завантажені файли з диска? Перемкнути всі Сповіщати Сповіщення програвача @@ -729,8 +701,8 @@ Ігнорувати події апаратних медіакнопок Корисно, наприклад, якщо ви використовуєте гарнітуру зі зламаними фізичними кнопками Вилучити дублікати - Вилучити дублікати\? - Бажаєте вилучити всі повторювані трансляції в цій добірці\? + Вилучити дублікати? + Бажаєте вилучити всі повторювані трансляції в цій добірці? Показати/сховати трансляції Незабаром Показати такі трансляції @@ -762,9 +734,7 @@ описова У цій трансляції вже має бути звукова доріжка Увімкніть цю опцію, якщо у вас є проблеми з ініціалізацією декодерів, які повертаються до декодерів нижчого пріоритету, якщо не вдається ініціалізувати первинні декодери. Це може призвести до погіршення якості відтворення порівняно з використанням первинних декодерів - Цей обхідний шлях вивільняє і повторно встановлює відеокодеки, коли відбувається зміна поверхні, замість того, щоб налаштовувати поверхню на кодек безпосередньо. Це налаштування вже використовується ExoPlayer на деяких пристроях з цією проблемою, але воно працює лише на Android 6 і новіших версіях -\n -\nУвімкнення цієї опції може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу до повноекранного режиму + Цей обхідний шлях вивільняє і повторно встановлює відеокодеки, коли відбувається зміна поверхні, замість того, щоб налаштовувати поверхню на кодек безпосередньо. Це налаштування вже використовується ExoPlayer на деяких пристроях з цією проблемою, але воно працює лише на Android 6 і новіших версіях \n \nУвімкнення цієї опції може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу до повноекранного режиму Перемістити селектор головних вкладок униз Розміщення головних вкладок Тунелювання медіа типово було вимкнено на вашому пристрої, оскільки ваша модель його не підтримує. @@ -809,8 +779,7 @@ Мініатюри Поділитися списком URL-адрес Поділитися з назвами - %1$s -\n%2$s + %1$s \n%2$s Поділитися добіркою - %1$s: %2$s Показати більше @@ -825,14 +794,11 @@ Недостатньо вільного простору на пристрої Скинути налаштування Резервна копія та відновлення - NewPipe може час від часу автоматично перевіряти наявність нових версій і сповіщати вас про їх появу. -\nХочете увімкнути цю функцію? + NewPipe може час від часу автоматично перевіряти наявність нових версій і сповіщати вас про їх появу. \nХочете увімкнути цю функцію? Так Ні Скинути всі налаштування до усталених значень - Скидання всіх налаштувань призведе до скидання всіх вибраних вами налаштувань і перезапуску застосунку. -\n -\nВи впевнені, що хочете продовжити? + Скидання всіх налаштувань призведе до скидання всіх вибраних вами налаштувань і перезапуску застосунку. \n \nВи впевнені, що хочете продовжити? Параметри експорту, який імпортується, використовують вразливий формат, який не підтримується з NewPipe 0.27.0. Переконайтеся, що експорт, який імпортується, походить із надійного джерела, і в майбутньому віддайте перевагу використанню лише експорту, отриманого з NewPipe 0.27.0 або новішої версії. Підтримку імпорту налаштувань у цьому вразливому форматі незабаром буде повністю припинено, і тоді старі версії NewPipe більше не зможуть імпортувати налаштування експорту з нових версій. вторинний Поділитися як тимчасовим списком відтворення YouTube diff --git a/app/src/main/res/values-und/strings.xml b/app/src/main/res/values-und/strings.xml index 0bd3bf442..88ad68e7c 100644 --- a/app/src/main/res/values-und/strings.xml +++ b/app/src/main/res/values-und/strings.xml @@ -133,4 +133,4 @@ سبندھت نگ کوئی نےیجے تصویر دی کیش ہٹائی گئی اے - \ 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 6c596b64c..d8e1001e9 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -265,23 +265,10 @@ پچھلی بر آمد رکنیتوں کو در آمد نہیں کیا جا سکا رکنیتوں بر آمد نہیں کر سکا - برآمد فائل کو ڈاؤن لوڈ کرکے YouTube کی رکنیت کو درآمد کریں: -\n -\n1. اس URL پر جائیں: -\n%1$s -\n2. جب پوچھا جائے تو لاگ ان کریں -\n3. ڈاؤن لوڈ شروع ہونا چاہئے (یہ برآمد فائل ہے) - ۔URL یا آپ کی ID ٹائپ کرکے ایک SoundCloud پروفائل درآمد کریں: -\n -\n1. ویب براؤزر میں \"ڈیسک ٹاپ موڈ\" کو فعال کریں (یہ سائٹ موبائل آلات کے لئے دستیاب نہیں ہے) -\n2. اس URL پر جائیں: -\n%1$s -\n3. جب پوچھا جائے تو لاگ ان کریں -\n4. پروفائل URL کاپی کریں جہاں تک آپ کی رہنمائی کی گئی تھی۔ + برآمد فائل کو ڈاؤن لوڈ کرکے YouTube کی رکنیت کو درآمد کریں: \n \n1. اس URL پر جائیں: \n%1$s \n2. جب پوچھا جائے تو لاگ ان کریں \n3. ڈاؤن لوڈ شروع ہونا چاہئے (یہ برآمد فائل ہے) + ۔URL یا آپ کی ID ٹائپ کرکے ایک SoundCloud پروفائل درآمد کریں: \n \n1. ویب براؤزر میں \"ڈیسک ٹاپ موڈ\" کو فعال کریں (یہ سائٹ موبائل آلات کے لئے دستیاب نہیں ہے) \n2. اس URL پر جائیں: \n%1$s \n3. جب پوچھا جائے تو لاگ ان کریں \n4. پروفائل URL کاپی کریں جہاں تک آپ کی رہنمائی کی گئی تھی۔ آپ کی آئی ڈی، soundcloud.com/yourid - اس بات کو ذہن میں رکھیں کہ اس عملیہ کا نیٹ ورک مہنگا ہو سکتا ہے۔ -\n -\nکیا آپ جاری رکھنا چاہتے ہیں ؟ + اس بات کو ذہن میں رکھیں کہ اس عملیہ کا نیٹ ورک مہنگا ہو سکتا ہے۔ \n \nکیا آپ جاری رکھنا چاہتے ہیں ؟ پلے بیک رفتار کنٹرول ٹیمپو موٹی آواز @@ -301,8 +288,7 @@ نیو پائپ کی رازداری کی پالیسی نیو پائپ منصوبہ آپ کی رازداری کو بہت سنجیدگی سے لیتا ہے. لہذا، ایپلی کیشن آپ کی رضامندی کے بغیر کسی بھی ڈیٹا کو جمع نہیں کرتا./nنیو پائپ کی رازداری پالیسی تفصیل سے وضاحت کرتی ہے کہ آپ کے کریش رپورٹ بھیجنے پر کیا ڈیٹا بھیجا جاتا ہے اور ذخیرہ کیا جاتا ہے ۔ رازداری کی پالیسی پڑھیں - یورپی جنرل ڈیٹا پروٹیکشن ریگولیشن (جی ڈی پی آر) کی تعمیل کرنے کیلئے، ہم آپ کی توجہ نیو پائپ کی رازداری کی پالیسی کی طرف مبذول کراتے ہیں۔ برائے مہربانی اسے غور سے پڑھیں۔ -\nہمیں بگ رپورٹ بھیجنے کے لیے آپ کو اسے قبول کرنا ضروری ہے۔ + یورپی جنرل ڈیٹا پروٹیکشن ریگولیشن (جی ڈی پی آر) کی تعمیل کرنے کیلئے، ہم آپ کی توجہ نیو پائپ کی رازداری کی پالیسی کی طرف مبذول کراتے ہیں۔ برائے مہربانی اسے غور سے پڑھیں۔ \nہمیں بگ رپورٹ بھیجنے کے لیے آپ کو اسے قبول کرنا ضروری ہے۔ قبول رد لا محدود @@ -398,8 +384,7 @@ ڈاؤن لوڈ کہاں کریں، پوچھیں ہر ڈاؤن لوڈ کو کہاں محفوظ کرنا ہے آپ سے پوچھا جائے گا SAF استعمال کریں - اسٹوریج ایکسیس فریم ورک ایک بیرونی SD کارڈ میں ڈاؤن لوڈ کی اجازت دیتا ہے۔ -\nنوٹ: کچھ آلات مطابقت نہیں رکھتے ہیں + اسٹوریج ایکسیس فریم ورک ایک بیرونی SD کارڈ میں ڈاؤن لوڈ کی اجازت دیتا ہے۔ \nنوٹ: کچھ آلات مطابقت نہیں رکھتے ہیں پلے بیک پوزیشن حذف کریں تمام پلے بیک پوزیشن حذف کی گئی تمام پلے بیک پوزیشنس حذف کریں؟ @@ -452,9 +437,7 @@ البم گانے ویڈٰو - اس ویڈیو پر عمر کی پابندی ہے۔ -\n -\nاگر آپ اسے دیکھنا چاہتے ہیں تو ترتیبات میں \"%1$s\" کو آن کریں۔ + اس ویڈیو پر عمر کی پابندی ہے۔ \n \nاگر آپ اسے دیکھنا چاہتے ہیں تو ترتیبات میں \"%1$s\" کو آن کریں۔ یوٹیوب ایک \"پابندی والا وضع\" فراہم کرتا ہے جو امکانی طور پر نازیبا مواد کو چھپاتا ہے یوٹیوب کا \"پابندی والا وضع\" چالو کریں وہ مواد دکھائیں جو بچوں کے لیے ممکنہ طور پر نا مناسب ہیں کیوں کہ اس میں عمر کی حد ہے (جیسے 18+) @@ -522,8 +505,7 @@ غیر خاموش خاموش کارروائی ہو رہی ہے… کچھ وقت لگ سکتا ہے - یہ ویڈیو اٹھارہ سال سے بڑے لوگوں کے لیے ہے۔ -\nیو ٹیوب کی نئی پالیسیوں کی وجہ سے نیوپائپ ان ویڈیوز تک رسائی حاصل نہیں کر سکتا لہٰذا اس ویڈیو کو چلانے سے قاصر ہے۔ + یہ ویڈیو اٹھارہ سال سے بڑے لوگوں کے لیے ہے۔ \nیو ٹیوب کی نئی پالیسیوں کی وجہ سے نیوپائپ ان ویڈیوز تک رسائی حاصل نہیں کر سکتا لہٰذا اس ویڈیو کو چلانے سے قاصر ہے۔ اصل آڈیو کو ترجیح دیں زبان سے قطع نظر اصل آڈیو ٹریک منتخب کریں وضاحتی آڈیو کو ترجیح دیں @@ -545,7 +527,7 @@ منی پلیئر میں ویڈیوز شروع نہ کریں، بلکہ اگر آٹو روٹیشن لاک ہے تو براہ راست فل اسکرین موڈ کا رخ کریں۔ آپ اب بھی فل اسکرین سے باہر نکل کر منی پلیئر تک رسائی حاصل کرسکتے ہیں۔ سبسکرپشن کے لئے نئی اسٹریمز کے بارے میں اطلاعات ری کیپچا چیلینج - ترتیب کے لیے عنوان۔ ترتیب کی تفصیل یہاں محفوظ ہے: https://hosted.weblate.org/translate/newpipe/strings/en/\?checksum=b23a75618764df0f + ترتیب کے لیے عنوان۔ ترتیب کی تفصیل یہاں محفوظ ہے: https://hosted.weblate.org/translate/newpipe/strings/en/?checksum=b23a75618764df0f اگر دستیاب ہو تو بصارت سے محروم افراد کے لئے تفصیل کے ساتھ آڈیو ٹریک منتخب کریں بائیں اشارے کی کارروائی مستقل تھمب نیل کو ان سیٹ کریں diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 1d1600425..1b7f633c6 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -2,7 +2,7 @@ Nhấn vào kính lúp để bắt đầu. Đăng vào %1$s - Không tìm thấy trình phát trực tuyến. Cài đặt VLC\? + Không tìm thấy trình phát trực tuyến. Cài đặt VLC? Cài đặt Hủy Mở trong trình duyệt @@ -11,7 +11,7 @@ Tải xuống Tìm kiếm Cài đặt - Ý bạn là \"%1$s\"\? + Ý bạn là \"%1$s\"? Chia sẻ với Sử dụng trình phát video bên ngoài Loại bỏ âm thanh ở một số độ phân giải @@ -28,7 +28,7 @@ Hiện độ phân giải cao hơn Chỉ một số thiết bị có thể phát video 2K/4K Phát với Kodi - Cài đặt ứng dụng Kore bị thiếu\? + Cài đặt ứng dụng Kore bị thiếu? Hiển thị tùy chọn \"Phát với Kodi\" Hiển thị tùy chọn phát video qua trung tâm truyền thông Kodi Âm thanh @@ -95,8 +95,7 @@ Vui lòng chờ… Đã sao chép vào khay nhớ tạm Vui lòng xác định thư mục tải xuống sau trong cài đặt - Sự cho phép này là cần thiết để -\nmở trong chế độ bật lên + Sự cho phép này là cần thiết để \nmở trong chế độ bật lên reCAPTCHA Yêu cầu reCAPTCHA Về NewPipe @@ -164,11 +163,11 @@ Xuất lịch sử, đăng ký, danh sách phát và các cài đặt Xóa lịch sử xem Xóa lịch sử các luồng đã phát và các vị trí phát lại - Xóa toàn bộ lịch sử xem\? + Xóa toàn bộ lịch sử xem? Đã xoá lịch sử xem Xóa lịch sử tìm kiếm Xóa lịch sử tìm kiếm mà bạn đã ghi - Xóa toàn bộ lịch sử tìm kiếm\? + Xóa toàn bộ lịch sử tìm kiếm? Đã xóa lịch sử tìm kiếm Không thể phát luồng này Đã xảy ra lỗi trình phát không thể khôi phục @@ -212,8 +211,7 @@ Trang web Ghé thăm Trang web NewPipe để biết thêm thông tin và tin tức. Chính sách Quyền riêng tư của NewPipe - NewPipe rất coi trọng quyền riêng tư của bạn. Do đó, ứng dụng không thu thập bất kỳ dữ liệu nào mà không có sự đồng ý của bạn. -\nChính sách bảo mật của NewPipe giải thích chi tiết dữ liệu nào được gửi và lưu trữ khi bạn gửi báo cáo sự cố. + NewPipe rất coi trọng quyền riêng tư của bạn. Do đó, ứng dụng không thu thập bất kỳ dữ liệu nào mà không có sự đồng ý của bạn. \nChính sách bảo mật của NewPipe giải thích chi tiết dữ liệu nào được gửi và lưu trữ khi bạn gửi báo cáo sự cố. Đọc chính sách quyền riêng tư Lịch sử Lịch sử @@ -258,7 +256,7 @@ Đặt làm hình thu nhỏ của danh sách phát Đánh dấu danh sách phát Loại bỏ đánh dấu - Xóa danh sách phát này\? + Xóa danh sách phát này? Đã tạo danh sách phát Đã thêm danh sách phát Hình thu nhỏ của danh sách phát đã thay đổi. @@ -281,24 +279,9 @@ Xuất trước Không thể nhập kênh đăng ký Không thể xuất kênh đăng ký - Nhập danh sách đăng ký YouTube từ Google Takeout: -\n -\n1. Vào URL này: %1$s -\n2. Đăng nhập khi được yêu cầu -\n3. Nhấn chọn \"Bao gồm tất cả dữ liệu trên YouTube\", sau đó nhấn \"Bỏ chọn tất cả\", sau đó chỉ chọn mục \"đăng ký\" rồi nhấn OK -\n4. Nhấn nút \"Bước tiếp theo\" rồi nhấn \"Tạo tệp xuất\" -\n5. Nhấn nút \"Tải xuống\" khi nó xuất hiện -\n6. Từ file zip mới tải về, trích xuất file .json ra (thường nằm ở đường dẫn \"YouTube và YouTube Music/đăng ký/subscriptions.json\") rồi nhập vào đây. -\n7. [Nếu nhập file .zip không thành công] Hãy giải nén tệp .csv (thường nó được để dưới phần \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), nhấn vào nút NHẬP TỆP ở phía bên dưới rồi chọn tệp csv đã được giải nén - Để nhập hồ sơ SoundCloud bằng cách nhập URL hoặc ID của bạn, hãy làm các bước như sau: -\n -\n1. Bật \"chế độ máy tính\" trong trình duyệt web (trang web không khả dụng cho thiết bị di động) -\n2. Truy cập URL này: %1$s -\n3. Đăng nhập khi được hỏi -\n4. Sao chép URL tiểu sử mà bạn đã được chuyển hướng đến. - Hãy nhớ rằng hoạt động này có thể khiến bạn bị mất kênh bạn đã đăng ký trước đó. -\n -\nBạn có muốn tiếp tục không\? + Nhập danh sách đăng ký YouTube từ Google Takeout: \n \n1. Vào URL này: %1$s \n2. Đăng nhập khi được yêu cầu \n3. Nhấn chọn \"Bao gồm tất cả dữ liệu trên YouTube\", sau đó nhấn \"Bỏ chọn tất cả\", sau đó chỉ chọn mục \"đăng ký\" rồi nhấn OK \n4. Nhấn nút \"Bước tiếp theo\" rồi nhấn \"Tạo tệp xuất\" \n5. Nhấn nút \"Tải xuống\" khi nó xuất hiện \n6. Từ file zip mới tải về, trích xuất file .json ra (thường nằm ở đường dẫn \"YouTube và YouTube Music/đăng ký/subscriptions.json\") rồi nhập vào đây. \n7. [Nếu nhập file .zip không thành công] Hãy giải nén tệp .csv (thường nó được để dưới phần \"YouTube and YouTube Music/subscriptions/subscriptions.csv\"), nhấn vào nút NHẬP TỆP ở phía bên dưới rồi chọn tệp csv đã được giải nén + Để nhập hồ sơ SoundCloud bằng cách nhập URL hoặc ID của bạn, hãy làm các bước như sau: \n \n1. Bật \"chế độ máy tính\" trong trình duyệt web (trang web không khả dụng cho thiết bị di động) \n2. Truy cập URL này: %1$s \n3. Đăng nhập khi được hỏi \n4. Sao chép URL tiểu sử mà bạn đã được chuyển hướng đến. + Hãy nhớ rằng hoạt động này có thể khiến bạn bị mất kênh bạn đã đăng ký trước đó. \n \nBạn có muốn tiếp tục không? Điều khiển tốc độ phát lại Tốc độ Độ cao @@ -306,8 +289,7 @@ Chuyển nhanh qua khoảng lặng Bước Đặt lại - Để tuân thủ Quy định bảo vệ dữ liệu chung của châu Âu (GDPR), chúng tôi sẽ thu hút sự chú ý của bạn đến chính sách bảo mật của NewPipe. Vui lòng đọc kỹ. -\nBạn phải chấp nhận nó để gửi cho chúng tôi báo cáo lỗi. + Để tuân thủ Quy định bảo vệ dữ liệu chung của châu Âu (GDPR), chúng tôi sẽ thu hút sự chú ý của bạn đến chính sách bảo mật của NewPipe. Vui lòng đọc kỹ. \nBạn phải chấp nhận nó để gửi cho chúng tôi báo cáo lỗi. Chấp nhận Từ chối Không giới hạn @@ -325,10 +307,10 @@ Thông báo cập nhật ứng dụng Thông báo phiên bản NewPipe mới Bộ nhớ ngoài không khả dụng - Không thể tải vào thẻ SD ngoài. Đặt lại vị trí tải về\? + Không thể tải vào thẻ SD ngoài. Đặt lại vị trí tải về? Không thể đọc tab đã lưu, sử dụng tab mặc định Khôi phục về mặc định - Bạn có muốn khôi phục về mặc định\? + Bạn có muốn khôi phục về mặc định? Số người đăng ký không khả dụng Chọn các tab để hiện trên trang chủ Top 50 phổ biến @@ -388,17 +370,16 @@ Không đủ dung lượng trên máy Quá trình tải bị hủy, vì tập tin đã bị xoá Kết nối hết thời gian - Bạn muốn xóa lịch sử tải về hay xóa tất cả những file đã tải về\? + Bạn muốn xóa lịch sử tải về hay xóa tất cả những file đã tải về? Giới hạn hàng chờ tải xuống Chỉ một lần tải mỗi lượt Bắt đầu tải xuống Tạm dừng tải xuống Hỏi nơi thư mục để tải xuống - Bạn sẽ được hỏi nơi lưu vào mỗi lần tải xuống. -\nHãy bật trình chọn thư mục của hệ thống (SAF) nếu bạn muốn tải xuống vào một cái thẻ nhớ + Bạn sẽ được hỏi nơi lưu vào mỗi lần tải xuống. \nHãy bật trình chọn thư mục của hệ thống (SAF) nếu bạn muốn tải xuống vào một cái thẻ nhớ Xóa vị trí phát Xóa tất cả vị trí phát - Xóa tất cả vị trí phát\? + Xóa tất cả vị trí phát? Nhóm kênh Chọn một thực thể Thực thể đã tồn tại @@ -450,9 +431,7 @@ Album Bài hát Các video - Video này bị giới hạn độ tuổi. -\n -\nBật \"%1$s\" trong cài đặt nếu bạn muốn xem video này. + Video này bị giới hạn độ tuổi. \n \nBật \"%1$s\" trong cài đặt nếu bạn muốn xem video này. Bật chế độ hạn chế YouTube Chỉ URL HTTPS được hỗ trợ Chọn thực thể PeerTube ưa thích @@ -464,20 +443,8 @@ Bởi %s Được tạo bởi %s Ảnh đại diện của kênh - NewPipe chưa hỗ trợ loại nội dung này. -\n -\nCó thể nó sẽ được hỗ trợ bởi một phiên bản mới hơn trong tương lai. - Bạn có nghĩ rằng tải nguồn cấp dữ liệu quá chậm? Nếu vậy, hãy thử bật tải nhanh (bạn có thể thay đổi nó này trong cài đặt hoặc bằng cách nhấn nút bên dưới). -\n -\nNewPipe cung cấp hai chiến lược tải nguồn cấp dữ liệu: -\n• Tìm nạp toàn bộ kênh đăng ký, tuy chậm nhưng đầy đủ. -\n• Sử dụng điểm cuối dịch vụ chuyên dụng, nhanh nhưng thường không hoàn thiện. -\n -\nSự khác biệt giữa hai loại này là cái nào nhanh thường thiếu một số thông tin, chẳng hạn như thời lượng hoặc loại mục (không thể phân biệt giữa các video trực tiếp và bình thường) và nó có thể trả về ít mục hơn. -\n -\nYouTube là một ví dụ về dịch vụ cung cấp phương pháp nhanh này với nguồn cấp RSS. -\n -\nVì vậy, sự lựa chọn tập trung vào những gì bạn thích: tốc độ hoặc thông tin chính xác. + NewPipe chưa hỗ trợ loại nội dung này. \n \nCó thể nó sẽ được hỗ trợ bởi một phiên bản mới hơn trong tương lai. + Bạn có nghĩ rằng tải nguồn cấp dữ liệu quá chậm? Nếu vậy, hãy thử bật tải nhanh (bạn có thể thay đổi nó này trong cài đặt hoặc bằng cách nhấn nút bên dưới). \n \nNewPipe cung cấp hai chiến lược tải nguồn cấp dữ liệu: \n• Tìm nạp toàn bộ kênh đăng ký, tuy chậm nhưng đầy đủ. \n• Sử dụng điểm cuối dịch vụ chuyên dụng, nhanh nhưng thường không hoàn thiện. \n \nSự khác biệt giữa hai loại này là cái nào nhanh thường thiếu một số thông tin, chẳng hạn như thời lượng hoặc loại mục (không thể phân biệt giữa các video trực tiếp và bình thường) và nó có thể trả về ít mục hơn. \n \nYouTube là một ví dụ về dịch vụ cung cấp phương pháp nhanh này với nguồn cấp RSS. \n \nVì vậy, sự lựa chọn tập trung vào những gì bạn thích: tốc độ hoặc thông tin chính xác. Tìm nạp từ nguồn cấp dữ liệu chuyên dụng khi có sẵn Bật chế độ nhanh Tắt chế độ nhanh @@ -487,7 +454,7 @@ Ngưỡng cập nhật nguồn cấp dữ liệu Nguồn cấp dữ liệu Tạo mới - Bạn có muốn xóa nhóm này\? + Bạn có muốn xóa nhóm này? Tên nhóm trống Đã chọn %d @@ -570,8 +537,7 @@ Đây là bản nhạc SoundCloud Go+, ít nhất là ở quốc gia của bạn, vì vậy NewPipe không thể phát trực tuyến hoặc tải xuống bản nhạc này. Nội dung này không có sẵn ở quốc gia của bạn. Làm văng ứng dụng - Video này bị giới hạn độ tuổi. -\nDo chính sách mới của YouTube với các video bị giới hạn độ tuổi, NewPipe không thể truy cập bất kỳ luồng video nào của nó và do đó không thể phát nó. + Video này bị giới hạn độ tuổi. \nDo chính sách mới của YouTube với các video bị giới hạn độ tuổi, NewPipe không thể truy cập bất kỳ luồng video nào của nó và do đó không thể phát nó. Chủ đề đêm Nổi bật Hiện chi tiết kênh @@ -599,9 +565,7 @@ Bây giờ bạn có thể chọn văn bản trong mô tả. Lưu ý rằng trang có thể nhấp nháy và các liên kết có thể không nhấn vào được trong khi ở chế độ chọn. Tài khoản đã bị chấm dứt Chế độ nạp nhanh không cung cấp thêm thông tin về điều này. - Tài khoản của tác giả đã bị chấm dứt. -\nNewPipe sẽ không thể tải nguồn cấp dữ liệu này trong tương lai. -\nBạn có muốn hủy đăng ký khỏi kênh này không\? + Tài khoản của tác giả đã bị chấm dứt. \nNewPipe sẽ không thể tải nguồn cấp dữ liệu này trong tương lai. \nBạn có muốn hủy đăng ký khỏi kênh này không? Không thể tải nguồn cấp dữ liệu cho \'%s\'. Lỗi tải nguồn cấp dữ liệu \'Khung truy cập lưu trữ\' chỉ được hỗ trợ từ Android 10 trở lên @@ -641,10 +605,8 @@ Đang kiểm tra cập nhật… Mục nguồn cấp dữ liệu mới Làm sập trình phát - Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. -\nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework - Không tìm thấy trình quản lý tệp nào thích hợp cho hành động này. -\nVui lòng cài đặt một trình quản lý tệp hoặc thử tắt \'%s\' trong thiết đặt tải xuống + Không tìm thấy ứng dụng quản lý tệp phù hợp nào để thực hiện hành động. \nVui lòng cài đặt ứng dụng quản lý tệp tương thích với Storage Access Framework + Không tìm thấy trình quản lý tệp nào thích hợp cho hành động này. \nVui lòng cài đặt một trình quản lý tệp hoặc thử tắt \'%s\' trong thiết đặt tải xuống LeakCanary không khả dụng Mặc định ExoPlayer Bình luận được ghim @@ -663,7 +625,7 @@ Thời gian kiểm tra Yêu cầu kết nối mạng Bất kỳ loại mạng nào (có thể tính phí) - Xóa tất cả các tệp đã tải xuống khỏi bộ nhớ\? + Xóa tất cả các tệp đã tải xuống khỏi bộ nhớ? Thông báo bị tắt Được thông báo Bạn hiện đã đăng ký kênh này @@ -696,7 +658,7 @@ Bỏ qua nhận nút phương tiện vật lý Loại bỏ các bản trùng lặp Loại bỏ các bản trùng lặp? - Bạn có muốn loại bỏ mọi luồng trùng lặp trong danh sách phát này\? + Bạn có muốn loại bỏ mọi luồng trùng lặp trong danh sách phát này? Hiện/Ẩn luồng phát Hiển thị các luồng phát sau Đã xem đầy đủ @@ -705,9 +667,7 @@ Thay đổi kích thước khoảng thời gian tải trên nội dung lũy tiến (hiện tại là %s). Giá trị thấp hơn có thể tăng tốc độ tải ban đầu của chúng Một bản âm thanh đã có sẵn trong luồng này Sử dụng tính năng bộ giải mã dự phòng của ExoPlayer - Giải pháp thay thế này giải phóng và khởi tạo lại codec video khi xảy ra thay đổi bề mặt, thay vì cài đặt trực tiếp bề mặt vào codec. Đã được ExoPlayer sử dụng trên một số thiết bị gặp sự cố này, cài đặt này chỉ ảnh hưởng đến Android 6 trở lên -\n -\nBật tùy chọn này có thể ngăn lỗi phát lại khi chuyển đổi trình phát video hiện tại hoặc chuyển sang chế độ toàn màn hình + Giải pháp thay thế này giải phóng và khởi tạo lại codec video khi xảy ra thay đổi bề mặt, thay vì cài đặt trực tiếp bề mặt vào codec. Đã được ExoPlayer sử dụng trên một số thiết bị gặp sự cố này, cài đặt này chỉ ảnh hưởng đến Android 6 trở lên \n \nBật tùy chọn này có thể ngăn lỗi phát lại khi chuyển đổi trình phát video hiện tại hoặc chuyển sang chế độ toàn màn hình Bật tùy chọn này nếu bạn gặp sự cố khởi tạo bộ giải mã, vấn đề này sẽ quay trở lại bộ giải mã có mức độ ưu tiên thấp hơn nếu quá trình khởi tạo bộ giải mã chính thất bại. Điều này có thể dẫn đến hiệu suất phát lại kém hơn so với khi sử dụng bộ giải mã chính Luôn dùng biện pháp thay thế cho bề mặt đầu ra video cho ExoPlayer nguyên gốc @@ -765,8 +725,7 @@ \? Chia sẻ danh sách URL Chia sẻ với Tiêu đề - %1$s -\n%2$s + %1$s \n%2$s Video ngắn Chất lượng thấp Không tải ảnh @@ -788,16 +747,15 @@ Không đủ dung lượng trống trên thiết bị Sao lưu và khôi phục - Đặt lại cài đặt - Đặt lại tất cả cài đặt về giá trị mặc định + Đặt lại cài đặt + Đặt lại tất cả cài đặt về giá trị mặc định Việc đặt lại tất cả cài đặt sẽ loại bỏ tất cả các cài đặt mà bạn đã đặt và khởi động lại ứng dụng. \n \nBạn có chắc muốn tiếp tục? Không - NewPipe có thể tự động kiểm tra các phiên bản mới theo thời gian và thông báo cho bạn khi chúng có sẵn. -\nBạn có muốn kích hoạt tính năng này không? + NewPipe có thể tự động kiểm tra các phiên bản mới theo thời gian và thông báo cho bạn khi chúng có sẵn. \nBạn có muốn kích hoạt tính năng này không? Có - Cài đặt trong xuất đang được nhập sử dụng định dạng dễ bị tấn công và không được dùng nữa kể từ NewPipe 0.27.0. Đảm bảo rằng bản xuất đang được nhập là từ một nguồn đáng tin cậy và chỉ ưu tiên sử dụng các bản xuất lấy từ NewPipe 0.27.0 hoặc mới hơn trong tương lai. Hỗ trợ nhập cài đặt ở định dạng dễ bị tấn công này sẽ sớm bị xóa hoàn toàn và khi đó các phiên bản cũ của NewPipe sẽ không thể nhập cài đặt xuất từ phiên bản mới nữa. - Tìm kiếm %1$s - Tìm kiếm %1$s (%2$s) + Cài đặt trong xuất đang được nhập sử dụng định dạng dễ bị tấn công và không được dùng nữa kể từ NewPipe 0.27.0. Đảm bảo rằng bản xuất đang được nhập là từ một nguồn đáng tin cậy và chỉ ưu tiên sử dụng các bản xuất lấy từ NewPipe 0.27.0 hoặc mới hơn trong tương lai. Hỗ trợ nhập cài đặt ở định dạng dễ bị tấn công này sẽ sớm bị xóa hoàn toàn và khi đó các phiên bản cũ của NewPipe sẽ không thể nhập cài đặt xuất từ phiên bản mới nữa. + Tìm kiếm %1$s + Tìm kiếm %1$s (%2$s) Danh sách phát %sN %sTr diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index e60c90dbb..afd113e11 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -14,10 +14,10 @@ 搜索 设置 分享给 - 视频下载路径 - 已下载的视频将存储于此 + 视频下载文件夹 + 下载的视频文件存储在这里 请选择下载视频的保存位置 - 已下载的音频将存储于此 + 下载的音频文件存储在这里 选择下载音频的储存位置 使用 Kodi 播放 主题 @@ -75,7 +75,7 @@ 暂停 删除 校验 - 确定 + 好 文件名 线程数 错误 @@ -90,9 +90,9 @@ 许可证 下载 文件名中允许的字符 - 无效字符将会被替换为该字符 + 这个值将替换无效字符 字母和数字 - 特殊字符 + 多数特殊字符 没有结果 无人订阅 @@ -142,8 +142,8 @@ App/UI 崩溃 抱歉, 这本不该发生。 使用电子邮件反馈 - 抱歉,发生了一些错误。 - 反馈 + 抱歉,出错了。 + 报告 信息: 发生了什么: 详情:\n请求:\n内容语言:\n内容国家:\n客户端语言:\n服务:\nGMT时间:\n包名:\n版本:\n操作系统版本: @@ -152,9 +152,8 @@ 播放视频,时长: 视频上传者的头像缩略图 NewPipe 正在下载 - 请稍后在设置中设定下载目录 - 使用悬浮窗模式 -\n需要该权限 + 请稍后在设置中定义一个下载文件夹 + 使用悬浮窗模式 \n需要该权限 reCAPTCHA 验证 已请求新的 reCAPTCHA 验证 在悬浮窗中播放 @@ -265,14 +264,14 @@ 缩放画面 调试 自动生成 - 内存泄漏监测可能会导致应用在堆转储时无响应 - 报告超出生命周期的错误 - 强制报告处理后的未送达的 Activity 或 Fragment 生命周期之外的 Rx 异常 + 内存泄露监测可能导致应用在堆栈转储时变得无响应 + 报告生命周期外错误 + 在处置后强制报告片段或活动外的接收异常 使用快速非精确查找 非精确查找允许播放器降低精度更快地跳转到位置。不适用 5 秒、15 秒或 25 秒跳转 自动将下一个音视频流加入队列 在(非重复)播放队列结束后通过附加相关音视频流来延续队列 - 没有该文件夹 + 没有这样的文件夹 无相似文件/内容源 文件不存在,或缺少读写文件权限 文件名不能为空 @@ -286,25 +285,10 @@ 先前的导出 无法导入订阅 无法导出订阅 - 从 Google takeout 导入 YouTube 订阅: -\n -\n1. 打开这个网址:%1$s -\n2. 登录谷歌账号 -\n3. 单击“包含所有数据”,然后单击“取消全选”,然后仅选择“订阅”并单击“确定” -\n4. 点击“下一步”,然后点击“创建导出作业” -\n5. 出现“下载”按钮后点击它 -\n6. 单击下面的导入文件并选择下载的 .zip 文件 -\n7.(如果 .zip 导入失败)解压 .csv文件(通常在“YouTube和YouTube Music/subscriptions/subscriptions.csv”下),点击下方的导入文件,选择解压出来的 csv 文件 - 通过输入网址或你的 ID 导入 SoundCloud 配置文件: -\n -\n1. 在浏览器中启用“电脑模式“(该网站未适配移动设备); -\n2. 打开该网站:%1$s; -\n3. 登录(如果需要); -\n4. 复制得到的配置文件下载地址。 + 从 Google takeout 导入 YouTube 订阅: \n \n1. 打开这个网址:%1$s \n2. 登录谷歌账号 \n3. 单击“包含所有数据”,然后单击“取消全选”,然后仅选择“订阅”并单击“确定” \n4. 点击“下一步”,然后点击“创建导出作业” \n5. 出现“下载”按钮后点击它 \n6. 单击下面的导入文件并选择下载的 .zip 文件 \n7.(如果 .zip 导入失败)解压 .csv文件(通常在“YouTube和YouTube Music/subscriptions/subscriptions.csv”下),点击下方的导入文件,选择解压出来的 csv 文件 + 通过输入网址或你的 ID 导入 SoundCloud 配置文件: \n \n1. 在浏览器中启用“电脑模式“(该网站未适配移动设备); \n2. 打开该网站:%1$s; \n3. 登录(如果需要); \n4. 复制得到的配置文件下载地址。 你的 ID:soundcloud.com/[你的ID] - 该操作消耗大量流量, -\n -\n你想继续吗? + 该操作消耗大量流量, \n \n你想继续吗? 清空图像缓存成功 清空已缓存的元数据 清空已缓存的网页数据 @@ -329,8 +313,7 @@ NewPipe 隐私政策 NewPipe 项目非常重视您的隐私。因此,未经您的同意,本应用不会收集任何数据。 \nNewPipe 的隐私政策详细解释了发送崩溃报告时会发送和存储的数据。 阅读隐私政策 - 为了遵守欧盟的《通用数据保护条例 (GDPR)》,我们特此提醒您注意 NewPipe 的隐私政策,请您仔细阅读。 -\n您必须在同意以后才能向我们发送错误报告。 + 为了遵守欧盟的《通用数据保护条例 (GDPR)》,我们特此提醒您注意 NewPipe 的隐私政策,请您仔细阅读。 \n您必须在同意以后才能向我们发送错误报告。 接受 拒绝 无限制 @@ -346,8 +329,8 @@ 视频默认语言 应用更新通知 NewPipe 新版本的通知 - 外置存储不可用 - 无法下载到外部 SD 卡,修改下载文件夹位置? + 外部存储不可用 + 无法下载到外部 SD 卡。重置下载文件夹位置? 读取已保存标签时发生错误,因此使用默认标签 恢复默认 是否恢复默认值? @@ -369,9 +352,9 @@ 后期处理失败 停止 最大重试次数 - 取消下载前的最多重试次数 - 切换到按流量计费的网络后中断下载 - 切换至移动数据时可能有用,虽然部分下载无法被暂停 + 取消下载前的最多尝试几次 + 在按流量计费网络上中断 + 切换到手机流量时有用,尽管一些下载无法被暂停 事件 会议大会 显示评论 @@ -393,15 +376,14 @@ 进度丢失,文件已被删除 连接超时 是否清空下载记录或删除所有下载的文件? - 限制下载并行任务数 - 同一时间内只允许进行一个下载任务 + 限制下载队列 + 并行下载数为 1 开始下载 暂停下载 - 总是询问下载位置 - 系统将询问您将每次下载的保存位置。 -\n如果要下载到外部 SD 卡,请启用系统文件夹选择器 (SAF) - 使用系统文件夹选择器 (SAF) - 存储访问框架(SAF)允许下载文件到外部 SD 卡 + 询问下载到哪里 + 应用会询问在哪里保存每个下载。\n如果想下载到外部 SD 卡,请启用系统文件夹选择器(SAF) + 使用系统文件夹选择器(SAF) + “存储访问框架”允许下载到外部 SD 卡 删除播放痕迹历史 删除所有播放痕迹历史 是否删除全部播放痕迹历史? @@ -474,28 +456,14 @@ 仅在某些服务中可用,通常速度更快,但返回的视频数量可能有限,而且信息通常不完整(如无视频时长、类型,无直播状态) 启用快速模式 停用快速模式 - 您是否觉得 feed 加载太慢?如果是这样,请尝试启用快速加载(可在设置中修改,也可使用下面的按钮修改) -\n -\nNewPipe 提供两种 feed 加载策略: -\n•获取整个订阅频道,很慢但是很完整。 -\n•使用专用的服务端点,比较快但通常不完整 -\n -\n两者之间的区别在于,后者通常缺少一些信息,如视频的持续时间或类型(无法区分直播视频和普通视频),并且可能返回更少的视频条目。 -\n -\nYouTube 是一个通过其 RSS feed 提供这种快速方法的服务示例。 -\n -\n因此,选择哪种方式取决于您的偏好:加载速度还是信息准确。 - NewPipe 尚不支持该内容。 -\n -\n也许未来版本会支持它。 + 您是否觉得 feed 加载太慢?如果是这样,请尝试启用快速加载(可在设置中修改,也可使用下面的按钮修改) \n \nNewPipe 提供两种 feed 加载策略: \n•获取整个订阅频道,很慢但是很完整。 \n•使用专用的服务端点,比较快但通常不完整 \n \n两者之间的区别在于,后者通常缺少一些信息,如视频的持续时间或类型(无法区分直播视频和普通视频),并且可能返回更少的视频条目。 \n \nYouTube 是一个通过其 RSS feed 提供这种快速方法的服务示例。 \n \n因此,选择哪种方式取决于您的偏好:加载速度还是信息准确。 + NewPipe 尚不支持该内容。 \n \n也许未来版本会支持它。 ∞ 部视频 100+ 部视频 艺术家 专辑 歌曲 - 该视频有年龄限制! -\n -\n如果您想要观看,请在设置中启用“%1$s”。 + 该视频有年龄限制! \n \n如果您想要观看,请在设置中启用“%1$s”。 由 %s 由 %s 创建 频道的头像缩略图 @@ -503,8 +471,8 @@ 已经看过且在之后被加入播放列表的视频将被删除。 \n您确定吗? 移除看过的视频? 移除看过的视频 - 来自服务的原始文本将在串流项目中可见 - 在项目上显示原始时间 + 在串流项目中可以看到服务的原始文本 + 显示项目的原始距今时间 启用 YouTube“受限模式” 仅显示未分组订阅 播放列表页 @@ -518,7 +486,7 @@ 仅 Wi-Fi 连接 自动开始播放 — %s 播放队列 - 无法识别此 URL。是否用其他应用打开\? + 无法识别此 URL。是否用其他应用打开? 自动加入播放队列 当前播放队列将被替换 从一个播放器切换到另一个播放器可能替换你的队列 @@ -536,7 +504,7 @@ 第一操作按钮 将通知中视频缩略图的长宽比从 16:9 裁剪到 1:1 裁剪缩略图至 1:1 比例 - 显示内存泄漏 + 显示内存泄露 已加入播放队列 加入队列 清空与本地存储的 reCAPTCHA 验证码有关的 cookie @@ -561,15 +529,14 @@ 评论 显示视频描述和其他信息 打开方式 - 设备上没有应用可以打开 + 设备上没有应用可以打开这个 让应用崩溃 此内容仅对已付费的用户可用,因此 NewPipe 无法流式传输或下载该内容。 该视频仅供 YouTube Music Premium 会员使用,NewPipe 无法流式传输或下载该视频。 此内容是私有的,因此 NewPipe 无法流式传输或下载该内容。 这是 SoundCloud Go +曲目,至少在你所在的国家/地区是这样,因此 NewPipe 无法流式传输或下载它。 此内容在你所在的国家/地区不可用。 - 这个视频有年龄限制。 -\n由于 YouTube 针对此类视频的新政策,NewPipe 无法访问其任何视频流,因此无法播放该视频。 + 这个视频有年龄限制。 \n由于 YouTube 针对此类视频的新政策,NewPipe 无法访问其任何视频流,因此无法播放该视频。 处理 电台 精选 @@ -599,13 +566,11 @@ 打开网站 账号被终止 快速 Feed 模式不提供关于这个的更多信息。 - 作者账号已被终止。 -\nNewPipe 今后将无法加载此 Feed。 -\n你要退订此频道吗? + 作者账号已被终止。 \nNewPipe 今后将无法加载此 Feed。 \n你要退订此频道吗? 无法加载“%s”的 Feed。 加载 Feed 时出错 - 仅 Android 10 及以上版本支持“存储访问框架” - 你会被问到在哪里保存每个下载 + 从 Android 10 起只支持“存储访问框架” + 会询问每个下载保存到哪里 尚未设置下载文件夹,现在选择默认下载文件夹 平板模式 关 @@ -636,15 +601,14 @@ 检查更新 新订阅源条目 显示\"使播放器崩溃\" - 在使用播放器时显示一个崩溃选项 + 使用播放器时显示崩溃选项 使播放器崩溃 错误报告通知 提示报告错误的通知 发生错误,详见通知 - 显示错误警示SnackBar - 创建一条错误通知 - 找不到适合此操作的文件管理器。 -\n请安装一文件管理器或尝试在下载设置中禁用“%s” + 显示错误提示栏 + 创建错误通知 + 找不到适合此操作的文件管理器。 \n请安装一文件管理器或尝试在下载设置中禁用“%s” 找不到适合此操作的文件管理器。 \n请安装兼容存储访问框架(SAF)的文件管理器 NewPipe 遇到了一个错误,点击此处报告此错误 置顶评论 @@ -666,7 +630,7 @@ 被订阅的新串流的通知 正在加载串流详情… - 检查新串流 + 运行新串流检查 任何网络 清除所有下载的文件? 获取通知 @@ -776,8 +740,7 @@ 缩略图 只包含视频网址 分享时带视频标题 - %1$s -\n%2$s + %1$s \n%2$s 分享播放列表 - %1$s: %2$s @@ -790,12 +753,9 @@ 备份和恢复 重置设置 将所有设置重置为默认值 - 重置所有设置会取消你所有的偏好设置并重启应用。 -\n -\n你确定想要继续吗? + 重置所有设置会取消你所有的偏好设置并重启应用。 \n \n你确定想要继续吗? 否 - NewPipe 可以自动时不时地检查新版本并在新版本可用时通知你。 -\n你想开启该功能吗? + NewPipe 可以自动时不时地检查新版本并在新版本可用时通知你。 \n你想开启该功能吗? 是 正导入的导出文件中的设置使用了有漏洞的格式,该格式已从 NewPipe 0.27.0 版本起被弃用。请确保导入的导出文件来自可信来源,今后最好只使用从 NewPipe 0.27.0 或更新版本获取的导出文件。不久后将完全不支持导入这一有漏洞格式的设置,到时旧版 NewPipe 再不能导入来自新版应用的设置导出文件。 第二 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 7b2ba5bb1..8ddca22cf 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -88,8 +88,7 @@ App/界面閃退 經過:\n請求:\n內容語言:\n內容國家:\nApp 語言:\n服務:\nGMT 時間:\n封裝:\n版本:\nOS 版本: reCAPTCHA 考驗 - 以浮面模式開啟 -\n有呢個權限至得 + 以浮面模式開啟 \n有呢個權限至得 要完成 reCAPTCHA 考驗 某啲影片可能會冇聲 幕後播 @@ -194,11 +193,8 @@ 認唔出呢個 URL。要唔要用另一個 app 開? YouTube 提供嘅「嚴格篩選模式」可以過濾潛在嘅成人內容 有年齡限制 (例如 18+/兒童不宜)嘅內容都照顯示 - 呢部影片有年齡限制。 -\n -\n如果你想睇,請喺設定度開啟「%1$s」。 - 呢部影片有年齡限制。 -\n鑑於 YouTube 就年齡限制影片嘅新政策,NewPipe 存取唔到條片嘅任何影像串流,所以播放唔到。 + 呢部影片有年齡限制。 \n \n如果你想睇,請喺設定度開啟「%1$s」。 + 呢部影片有年齡限制。 \n鑑於 YouTube 就年齡限制影片嘅新政策,NewPipe 存取唔到條片嘅任何影像串流,所以播放唔到。 [未知] 匯出資料庫 抹走咗 reCAPTCHA Cookie @@ -243,9 +239,7 @@ 匯入檔案 匯出緊… 先前嘅匯出 - 請注意:呢項操作可能相當消耗網絡數據。 -\n -\n你係咪要繼續? + 請注意:呢項操作可能相當消耗網絡數據。 \n \n你係咪要繼續? 幾時都唔使 自動 低畫質 (細格啲) @@ -315,8 +309,7 @@ 刪除咗 1 個項目。 執執佢 搞掂 - NewPipe 專案非常著重你嘅私隱。因此,呢個 app 未得你同意係唔會收集任何資料。 -\nNewPipe 嘅私隱政策會詳述,當你傳送彈 app 報告嗰陣,有咩資料會傳送同保存。 + NewPipe 專案非常著重你嘅私隱。因此,呢個 app 未得你同意係唔會收集任何資料。 \nNewPipe 嘅私隱政策會詳述,當你傳送彈 app 報告嗰陣,有咩資料會傳送同保存。 最近播放 最常播放 頭條新嘢 @@ -348,8 +341,7 @@ 匯入緊… 無聲嘅時候快轉 重設 - 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請你注意 NewPipe 嘅私隱政策。請仔細閱讀。 -\n你必須接受,先可以傳送錯誤報告畀我哋。 + 為符合歐盟嘅《通用數據保障條例》(GDPR) 規範,我哋謹請你注意 NewPipe 嘅私隱政策。請仔細閱讀。 \n你必須接受,先可以傳送錯誤報告畀我哋。 拒絕 用流動數據嘅時候限制解像度 更新 @@ -483,13 +475,9 @@ 由 %s 建立 出自 %s 章節 - NewPipe 仲未支援到呢樣。 -\n -\n希望未來會喺日後嘅版本支援啦。 - 搵唔到合適嘅檔案總管進行呢個動作。 -\n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」 - 搵唔到合適嘅檔案總管進行呢個動作。 -\n請安裝一個與儲存空間存取框架兼容嘅檔案管理程式 + NewPipe 仲未支援到呢樣。 \n \n希望未來會喺日後嘅版本支援啦。 + 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個檔案管理程式,又或者試下喺下載設定度停用「%s」 + 搵唔到合適嘅檔案總管進行呢個動作。 \n請安裝一個與儲存空間存取框架兼容嘅檔案管理程式 呢部內容限區,喺你所在國家未有提供。 呢首 (至少喺你所在國家而言) 係 SoundCloud Go+ 單曲,因此 NewPipe 未能串流或下載。 呢部內容係私人嘢,因此 NewPipe 未能串流或下載。 @@ -552,8 +540,7 @@ 轉咗播放清單縮圖。 報告週期完結後嘅錯誤 每次下載都會問你要儲存去邊 - 每次下載都會問你要儲存去邊。 -\n如果你想儲存落外置 SD 卡入面,請啟用系統資料夾揀選器 (SAF) + 每次下載都會問你要儲存去邊。 \n如果你想儲存落外置 SD 卡入面,請啟用系統資料夾揀選器 (SAF) 用系統資料夾揀選器 (SAF) 加入去播放清單之前或之後睇過嘅影片都會剷走個囉喎。 \n你肯定?剷走咗冇得掹個囉喎! 「儲存空間存取框架」係畀你下載落外置 SD 卡嗰度 @@ -623,9 +610,7 @@ 未知格式 未知畫質 下載工具暫未支援嘅串流,就無謂擺出嚟喇 - 著作者嘅帳戶已經被終止。 -\nNewPipe 日後唔會載入到呢個摘要。 -\n你要唔要取消訂閱呢個頻道? + 著作者嘅帳戶已經被終止。 \nNewPipe 日後唔會載入到呢個摘要。 \n你要唔要取消訂閱呢個頻道? 某啲服務有提供,通常會快趣好多,但項目數量可能有限同埋資訊欠奉 (例如片長、項目類型、直播狀態) 剷走播放到邊個位 係咪要全部剷走晒之前啲片嘅播放位置嘅紀錄? @@ -647,12 +632,7 @@ 載入播放間隔大細 互動頁面 預設嘅互動站(Kiosk) - 輸入 URL 或者你嘅 ID 去匯入 SoundCloud 個人檔案: -\n -\n一、喺網頁瀏覽器啟用「桌面版模式」(個網唔支援手機版) -\n二、去呢個網址:%1$s -\n三、叫你登入就去馬 -\n四、複製佢彈返畀你去個人檔案嗰版個 URL。 + 輸入 URL 或者你嘅 ID 去匯入 SoundCloud 個人檔案: \n \n一、喺網頁瀏覽器啟用「桌面版模式」(個網唔支援手機版) \n二、去呢個網址:%1$s \n三、叫你登入就去馬 \n四、複製佢彈返畀你去個人檔案嗰版個 URL。 你個 ID、soundcloud.com/你個id 揀選互動站 顯示返項目原本話時隔幾耐 @@ -664,26 +644,8 @@ 淨係顯示未成谷嘅訂閱 服務原本嘅字會騷返喺串流項目上面 若果播片嘅時候窒下窒下或者黑畫面,就停用多媒體隧道啦。 - 點樣用 Google 匯出嚟匯入 YouTube 訂閱: -\n -\n一、去呢個網址:%1$s -\n二、叫你就登入 -\n三、撳一下「包含所有資料」,再撳一下「全部不選」,之後淨係剔返「訂閱」,然後撳「確定」 -\n四、撳一下「下一步」然後揀「建立匯出」 -\n五、個掣騷出嚟嘅時候就撳一下「下載」 -\n六、返返嚟呢度,喺下低撳「匯入檔案」,揀返下載咗嗰個 .zip 檔案 -\n七、[個 .zip 匯入唔到點算好] 將個 .csv 檔案解壓縮抽返出嚟 (通常係擺喺「YouTube and YouTube Music/subscriptions/subscriptions.csv」),喺下低撳「匯入檔案」,揀返抽出嚟個 csv 檔案 - 係咪覺得摘要「懸浮於半路太久,可否再快兩步」?可以試下啟用快速載入 (你可以喺設定度更改,又或者撳一下下低個掣)。 -\n -\nNewPipe 提供兩種載入摘要嘅方針: -\n• 攞晒成個訂閱頻道,慢得嚟志在夠完整。 -\n• 用特設嘅服務終端,快得嚟啲料爭少少。 -\n -\n兩者嘅分別在於,快趣嗰個通常都係爭咁啲料:譬如話項目嘅片長同類型 (分唔到係直播定上載),同埋攞返嚟數目可能會少啲。 -\n -\nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。 -\n -\n所以就睇你點揀:想快定要準。 + 點樣用 Google 匯出嚟匯入 YouTube 訂閱: \n \n一、去呢個網址:%1$s \n二、叫你就登入 \n三、撳一下「包含所有資料」,再撳一下「全部不選」,之後淨係剔返「訂閱」,然後撳「確定」 \n四、撳一下「下一步」然後揀「建立匯出」 \n五、個掣騷出嚟嘅時候就撳一下「下載」 \n六、返返嚟呢度,喺下低撳「匯入檔案」,揀返下載咗嗰個 .zip 檔案 \n七、[個 .zip 匯入唔到點算好] 將個 .csv 檔案解壓縮抽返出嚟 (通常係擺喺「YouTube and YouTube Music/subscriptions/subscriptions.csv」),喺下低撳「匯入檔案」,揀返抽出嚟個 csv 檔案 + 係咪覺得摘要「懸浮於半路太久,可否再快兩步」?可以試下啟用快速載入 (你可以喺設定度更改,又或者撳一下下低個掣)。 \n \nNewPipe 提供兩種載入摘要嘅方針: \n• 攞晒成個訂閱頻道,慢得嚟志在夠完整。 \n• 用特設嘅服務終端,快得嚟啲料爭少少。 \n \n兩者嘅分別在於,快趣嗰個通常都係爭咁啲料:譬如話項目嘅片長同類型 (分唔到係直播定上載),同埋攞返嚟數目可能會少啲。 \n \nYouTube 就係其中一個有用 RSS 摘要提供呢個快趣門路嘅服務。 \n \n所以就睇你點揀:想快定要準。 去網站睇下 排序 常見問題 @@ -732,9 +694,7 @@ 配音 旁述 為外面嘅播放器揀選音軌 - 呢個解決方法係喺發生表面變動嗰陣釋放同埋重新確認視訊編解碼器,而非直接將表面設定做編解碼器。ExoPlayer 已經喺部份有問題嘅裝置上使用了呢個設定,呢個設定僅係對 Android 6 或以上嘅更新版本有效。 -\n -\n啟用呢個選項可以避免喺切換現有視訊播放程式或切換到全螢幕時出現播放錯誤 + 呢個解決方法係喺發生表面變動嗰陣釋放同埋重新確認視訊編解碼器,而非直接將表面設定做編解碼器。ExoPlayer 已經喺部份有問題嘅裝置上使用了呢個設定,呢個設定僅係對 Android 6 或以上嘅更新版本有效。 \n \n啟用呢個選項可以避免喺切換現有視訊播放程式或切換到全螢幕時出現播放錯誤 啲圖嘅畫質 影片 ? @@ -742,8 +702,7 @@ 頻道頁要騷邊啲分頁出嚟 齋分享 URL 清單 分享埋片名 - %1$s -\n%2$s + %1$s \n%2$s 頻道分頁 短片 載入緊元資料… @@ -774,7 +733,7 @@ - %1$s:%2$s 主畫面嘅分頁揀選搬落最底 無直播串流 - 揀選啲圖嘅畫質,定索性唔載入啲圖,去慳啲用數據同記憶體。更改會抹走記憶體同磁碟入面嘅影像快取 — %s + 揀選啲圖嘅畫質,定索性唔載入啲圖,去慳啲用數據同記憶體。更改會抹走記憶體同磁碟入面嘅影像快取 — %s 播放 其他選項 縮圖 @@ -792,12 +751,9 @@ 撳下面嘅掣去更改對應嘅通知動作。頭三個動作 (播放/暫停、上一個、下一個) 系統預設咗,冇得揀。 部機冇晒位 要 - NewPipe 可以周不時自動睇過有冇新版本,一出咗就通知您。 -\n您想唔想啟用呢個功能? + NewPipe 可以周不時自動睇過有冇新版本,一出咗就通知您。 \n您想唔想啟用呢個功能? 推翻所有設定 - 推翻所有設定就會全盤抹走晒您喜好過嘅設定,然後重新開過個 app 個囉噃。 -\n -\n您確定要不惜一切推倒重來? + 推翻所有設定就會全盤抹走晒您喜好過嘅設定,然後重新開過個 app 個囉噃。 \n \n您確定要不惜一切推倒重來? 備份與還原 唔使喇 顛覆所有設定,光復成預設值重新開始 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index aadddb1f3..2a2beed9c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -95,8 +95,7 @@ 請稍候… 已複製到剪貼簿 稍後請在設定中選擇下載資料夾 - 使用懸浮視窗模式 -\n需要此權限 + 使用懸浮視窗模式 \n需要此權限 reCAPTCHA 驗證 已請求 reCAPTCHA 驗證 懸浮視窗 @@ -257,15 +256,8 @@ 檔案不存在或缺少讀寫檔案的權限 從 Google Takeout 匯入您的 YouTube 訂閱: \n \n1. 移至此網址:%1$s \n2. 當被提示時登入帳號 \n3. 按一下「包含所有資料」,接著「取消選取全部」,然後僅勾選「訂閱」並按一下「確定」 \n4. 按一下「下一步」然後「建立匯出」 \n5. 在「下載」按鈕出現後按一下它 \n6. 點擊下方的「匯入檔案」並選取已下載的 zip 檔案 \n7. [若 zip 匯入失敗] 擷取 .csv 檔案 (通常位於「YouTube 與 YouTube Music/訂閱/訂閱.csv」),按一下下方的「匯入檔案」並選取擷取的 csv 檔案 您的 ID, soundcloud.com/yourid - 請記住,此操作可造成昂貴網路花費。 -\n -\n您是否希望繼續? - 透過輸入 URL 或您的 ID 來匯入 SoundCloud 個人設定檔: -\n -\n1. 在瀏覽器中啟用「桌面模式」(該網站不適用於行動裝置) -\n2. 移至此網址: %1$s -\n3. 當被提示時登入帳號 -\n4. 複製您被重新導向到的個人設定檔網址。 + 請記住,此操作可造成昂貴網路花費。 \n \n您是否希望繼續? + 透過輸入 URL 或您的 ID 來匯入 SoundCloud 個人設定檔: \n \n1. 在瀏覽器中啟用「桌面模式」(該網站不適用於行動裝置) \n2. 移至此網址: %1$s \n3. 當被提示時登入帳號 \n4. 複製您被重新導向到的個人設定檔網址。 已清除圖片快取 清除已快取的詮釋資料 移除所有已快取的網頁資料 @@ -291,11 +283,9 @@ NewPipe 是一個 Copyleft 的自由軟體:您可以隨意使用、研究、分享並改進它。在遵守由自由軟體基金會所發佈的 GNU 通用公共授權條款的狀況下,您可以自由地再散佈及/或修改它;授權條款預設使用第三版,但您也可以選擇更新的版本。 您是否要同時匯入設定? NewPipe 的隱私政策 - NewPipe 專案非常重視您的隱私。因此,未經您同意此程式不會收集任何資料。 -\nNewPipe 的隱私權政策詳細說明了當您發送錯誤回報時,什麼資料會被傳送及儲存。 + NewPipe 專案非常重視您的隱私。因此,未經您同意此程式不會收集任何資料。 \nNewPipe 的隱私權政策詳細說明了當您發送錯誤回報時,什麼資料會被傳送及儲存。 閱讀隱私政策 - 為配合歐洲通用資料保護條例 ( GDPR ) ,我們在此請您注意 NewPipe 的隱私政策。請務必仔細閱讀。 -\n您必須接受它才能向我們發送錯誤報告。 + 為配合歐洲通用資料保護條例 ( GDPR ) ,我們在此請您注意 NewPipe 的隱私政策。請務必仔細閱讀。 \n您必須接受它才能向我們發送錯誤報告。 接受 拒絕 沒有限制 @@ -387,8 +377,7 @@ 開始下載 暫停下載 詢問要下載到哪裡 - 每次下載都會詢問您要下載到哪裡。 -\n如果您想要下載到外部的 SD 記憶卡的話,請啟用系統資料夾挑選器 (SAF) + 每次下載都會詢問您要下載到哪裡。 \n如果您想要下載到外部的 SD 記憶卡的話,請啟用系統資料夾挑選器 (SAF) 使用系統資料夾挑選器 (SAF) 「儲存空間存取框架」讓您可以下載到外部的 SD 記憶卡 刪除播放位置 @@ -468,17 +457,13 @@ 啟用快速模式 停用快速模式 您覺得 feed 載入太慢了嗎?如果是的話,試著啟用快速載入 (您可以在設定中變更或按下下方的按鈕)。 \n \nNewPipe 提供兩個 feed 載入策略: \n• 擷取整個訂閱頻道,慢但是完整。 \n• 使用專用的伺服器端點,較快速但是通常不完整。 \n \n兩者之間的差別是,較快速的通常缺少部份資訊,如項目的持續時間或類型(無法區分直播影片或一般影片),而且其可能會回傳較少項目。 \n \nYouTube 是一種透過其 RSS feed 提供這種快速方式的例子。 \n \n因此,請選取您較偏好的:速度或準確的資訊。 - NewPipe 尚未支援此內容。 -\n -\n希望它會在未來的版本中支援。 + NewPipe 尚未支援此內容。 \n \n希望它會在未來的版本中支援。 ∞ 部影片 超過 100 部影片 演出者 專輯 歌曲 - 此影片設有年齡限制。 -\n -\n如果您想要觀看,請在設定中開啟「%1$s」。 + 此影片設有年齡限制。 \n \n如果您想要觀看,請在設定中開啟「%1$s」。 是的,包括已部份觀看的影片 已觀看過的串流在加入播放清單後將被移除。\n您確定嗎? 移除已觀看的串流? @@ -551,8 +536,7 @@ 此內容為私人內容,因此無法由 NewPipe 串流或下載。 這是 SoundCloud Go+ 的曲目,因此至少在您的國家無法由 NewPipe 串流或下載。 此內容在您所在的國家不可用。 - 此影片有年齡限制。 -\n因為 YouTube 新的年齡影片限制政策,NewPipe 無法存取任何這類的視訊串流,因此無法播放。 + 此影片有年齡限制。 \n因為 YouTube 新的年齡影片限制政策,NewPipe 無法存取任何這類的視訊串流,因此無法播放。 廣播 精選 解決 @@ -582,9 +566,7 @@ 開啟網站 帳號已終止 快速 feed 模式不會提供更多資訊。 - 作者的帳號已被終止。 -\nNewPipe 未來將無法載入此 feed。 -\n您想要取消訂閱此頻道嗎? + 作者的帳號已被終止。 \nNewPipe 未來將無法載入此 feed。 \n您想要取消訂閱此頻道嗎? 無法載入「%s」。 載入 feed 時發生錯誤 從 Android 10 開始僅支援「儲存空間存取框架」 @@ -712,9 +694,7 @@ 無論語言都選取原始音訊軌道 管理一些 ExoPlayer 設定。這些變更需要重新啟動播放程式才會生效 若您有解碼器初始化的問題,請啟用此選項,若主要的解碼器初始化失敗,其將會汰退至較低優先度的解碼器。這可能會導致播放效能比使用主要解碼器時差 - 此解決方法是在發生表面變動時釋放並重新確認視訊編解碼器,而非直接將表面設定為編解碼器。ExoPlayer 已在部份有問題的裝置上使用了此設定,此設定僅對 Android 6 或更新版本有效。 -\n -\n啟用此選項可以避免在切換目前視訊播放程式或切換到全螢幕時出現播放錯誤 + 此解決方法是在發生表面變動時釋放並重新確認視訊編解碼器,而非直接將表面設定為編解碼器。ExoPlayer 已在部份有問題的裝置上使用了此設定,此設定僅對 Android 6 或更新版本有效。 \n \n啟用此選項可以避免在切換目前視訊播放程式或切換到全螢幕時出現播放錯誤 將主分頁選擇器移動至底部 主分頁位置 %1$s %2$s @@ -760,8 +740,7 @@ 選擇影像品質以及是否載入影像,以減少資料與記憶體使用。變更會清除記憶體中與磁碟上的影像快取 — %s 分享網址清單 分享標題 - %1$s -\n%2$s + %1$s \n%2$s 分享播放清單 - %1$s:%2$s @@ -774,13 +753,10 @@ 備份與還原 重設設定 將所有設定重設為預設值 - 重設所有設定將會放棄您的所有偏好設定並重新啟動應用程式。 -\n -\n您確定您想要繼續嗎? + 重設所有設定將會放棄您的所有偏好設定並重新啟動應用程式。 \n \n您確定您想要繼續嗎? 是 否 - NewPipe 可以隨時自動檢查新版本,並在新版本可用時通知您。 -\n您想要啟用此功能嗎? + NewPipe 可以隨時自動檢查新版本,並在新版本可用時通知您。 \n您想要啟用此功能嗎? 匯入的匯出中的設定使用自 NewPipe 0.27.0 起已廢棄的脆弱格式。請確定匯入的匯出是來自可信賴的來源,並在未來只使用從 NewPipe 0.27.0 或更新版本取得的匯出。對於匯入此脆弱格式設定的支援即將完全移除,屆時舊版本的 NewPipe 將無法再匯入新版本匯出的設定。 次要 分享為 YouTube 臨時播放清單 diff --git a/fastlane/metadata/android/ar/changelogs/1015.txt b/fastlane/metadata/android/ar/changelogs/1015.txt new file mode 100644 index 000000000..a6406368b --- /dev/null +++ b/fastlane/metadata/android/ar/changelogs/1015.txt @@ -0,0 +1 @@ +هذا إصدار إصلاح عاجل يعمل على إصلاح البث المباشر لموقع media.ccc.de. قرصنة سعيدة! diff --git a/fastlane/metadata/android/gl/changelogs/1015.txt b/fastlane/metadata/android/gl/changelogs/1015.txt new file mode 100644 index 000000000..f81fe081b --- /dev/null +++ b/fastlane/metadata/android/gl/changelogs/1015.txt @@ -0,0 +1 @@ +Esta é unha versión de corrección rápida que arranxa as emisións en directo en media.ccc.de. Bo hacking! diff --git a/fastlane/metadata/android/it/changelogs/1007.txt b/fastlane/metadata/android/it/changelogs/1007.txt index 3b5044d15..27d6d0aca 100644 --- a/fastlane/metadata/android/it/changelogs/1007.txt +++ b/fastlane/metadata/android/it/changelogs/1007.txt @@ -8,4 +8,4 @@ Risolti vari bug introdotti nella 0.28.1: Altri miglioramenti: • [YouTube] Riavvolgimento dirette fino a 4 ore • Non caricare il video delle dirette riprodotte in background -• Nuova UI per "Rimuovi visti" \ No newline at end of file +• Nuova UI per "Rimuovi visti" diff --git a/fastlane/metadata/android/pt-PT/changelogs/1015.txt b/fastlane/metadata/android/pt-PT/changelogs/1015.txt new file mode 100644 index 000000000..e5d33d25a --- /dev/null +++ b/fastlane/metadata/android/pt-PT/changelogs/1015.txt @@ -0,0 +1 @@ +Este é um hotfix que corrige transmissões ao vivo de media.ccc.de. Feliz Hacking! diff --git a/fastlane/metadata/android/pt/changelogs/1015.txt b/fastlane/metadata/android/pt/changelogs/1015.txt new file mode 100644 index 000000000..e5d33d25a --- /dev/null +++ b/fastlane/metadata/android/pt/changelogs/1015.txt @@ -0,0 +1 @@ +Este é um hotfix que corrige transmissões ao vivo de media.ccc.de. Feliz Hacking! diff --git a/shared/src/commonMain/composeResources/values-ace/strings.xml b/shared/src/commonMain/composeResources/values-ace/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ace/strings.xml +++ b/shared/src/commonMain/composeResources/values-ace/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-af/strings.xml b/shared/src/commonMain/composeResources/values-af/strings.xml index a6c7aa77b..d45802262 100644 --- a/shared/src/commonMain/composeResources/values-af/strings.xml +++ b/shared/src/commonMain/composeResources/values-af/strings.xml @@ -34,9 +34,9 @@ Of jy Ideas het vir; vertaling, ontwerp veranderinge, kode netjies maak, of groot kode veranderinge - hulp word altyd waardeer. Hoe meer gedoen word, hoe beter raak dit! Bekyk op GitHub NewPipe word ontwikkel deur vrywilligers wat hul vrye tyd gebruik om die beste verbruikers ondervinding te bring. Gee terug om die ontwikkelaars te help om NewPipe nog beter te maak terwyl hulle n koffie geniet. - Die NewPipe projek is erenstig oor privaatheid. As gevolg daarvan sal die toepassing nie enige data versamel of stoor sonder jou toestemming nie.\nNewPipe se privaatheids beleid verduidelik in detail watter data deur gestuur en gestoor word wanneer jy n "crash report" stuur. + Die NewPipe projek is erenstig oor privaatheid. As gevolg daarvan sal die toepassing nie enige data versamel of stoor sonder jou toestemming nie.\nNewPipe se privaatheids beleid verduidelik in detail watter data deur gestuur en gestoor word wanneer jy n crash report stuur. NewPipe Se Lisensie - NewPipe is n kopielinks sagteware: Jy mag dit gebruik, bestudeer, uitdeel en verbeter net soos jy lus kry. Meer spesifiek mag jy dit uitdeel en/ of verander onder die voorwardes van die GNU "General Public License" soos dit gepubliseer is deur die "Free Software Foundation", of weergawe 3 van die lisensie of enige latere weergawe. + NewPipe is n kopielinks sagteware: Jy mag dit gebruik, bestudeer, uitdeel en verbeter net soos jy lus kry. Meer spesifiek mag jy dit uitdeel en/ of verander onder die voorwardes van die GNU General Public License soos dit gepubliseer is deur die Free Software Foundation, of weergawe 3 van die lisensie of enige latere weergawe. Foute Herstel Tema Lig @@ -48,7 +48,7 @@ "Hierdie opsie is slegs beskikbaar wanneer %1$s gekies word as Tema" Jy kan jou gunstelling nag tema hieronder kies Wys \\"Hou vas om in die tou te plaas\\" wenk - Wys wenk wanner die agtergrond gedruk word of die "popup" knoppie in n video \\"Details:\\" + Wys wenk wanner die agtergrond gedruk word of die popup knoppie in n video \\"Details:\\" Tabletmodus Lysaansigmodus Onderskrifte diff --git a/shared/src/commonMain/composeResources/values-ar-rLY/strings.xml b/shared/src/commonMain/composeResources/values-ar-rLY/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ar-rLY/strings.xml +++ b/shared/src/commonMain/composeResources/values-ar-rLY/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ar/strings.xml b/shared/src/commonMain/composeResources/values-ar/strings.xml index efd495357..23e691223 100644 --- a/shared/src/commonMain/composeResources/values-ar/strings.xml +++ b/shared/src/commonMain/composeResources/values-ar/strings.xml @@ -16,7 +16,7 @@ الموقع الإلكتروني قم بزيارة موقع NewPipe الإلكتروني لمزيد من المعلومات والأخبار. سياسة خصوصية NewPipe - يأخذ مشروع NewPipe خصوصيتك بأهمية بالغة. لذا، لا يجمع التطبيق أي بيانات دون موافقتك.\nتوضح سياسة خصوصية NewPipe بالتفصيل البيانات التي يتم إرسالها وتخزينها عند إرسال تقرير عطل. + يهتم مشروع NewPipe بخصوصيتك، لذلك لا يجمع التطبيق أي بيانات دون موافقتك.\nتوضح سياسة الخصوصية الخاصة بـ NewPipe بالتفصيل البيانات التي يتم إرسالها وحفظها عند إرسال تقرير عن تعطل التطبيق. اقرأ سياسة الخصوصية ترخيص NewPipe NewPipe هو برنامج مفتوح المصدر مرخص بموجب حقوق النشر: يمكنك استخدامه ودراسته ومشاركته وتحسينه كما تشاء. وبالتحديد، يمكنك إعادة توزيعه و/أو تعديله وفقًا لشروط رخصة GNU العمومية العامة كما نشرتها مؤسسة البرمجيات الحرة، سواء الإصدار 3 من الرخصة، أو (حسب اختيارك) أي إصدار لاحق. @@ -58,4 +58,93 @@ القائمة الشبكة البطاقة + إظهار تلميح الضغط المطوّل للإضافة إلى قائمة الانتظار + إظهار تلميح عند الضغط على الخلفية أو زر النافذة المنبثقة في تفاصيل الفيديو: + يعمل + متوقف + الدقة الافتراضية + دقة النافذة المنبثقة الافتراضية + تقييد الدقة عند استخدام بيانات الجوال + إظهار الدقات الأعلى + يمكن لبعض الأجهزة فقط تشغيل فيديوهات بدقة 2K/4K + تنسيق الفيديو الافتراضي + تنسيق الصوت الافتراضي + تفضيل الصوت الأصلي + ‪اختيار المسار الصوتي الأصلي بغض النظر عن اللغة + تفضيل الصوت الوصفي + اختيار مسار صوتي يحتوي على أوصاف للمكفوفين وضعاف البصر إذا كان متاحًا + أفضل دقة + بدون حد + المشغل + استخدام مشغل فيديو خارجي + ‎يزيل الصوت عند بعض الدقات + استخدام مشغل صوت خارجي + إظهار خيار التشغيل باستخدام Kodi + إظهار خيار لتشغيل فيديو عبر مركز وسائط Kodi + معاينة مصغّرة لشريط التقدّم + جودة عالية (أكبر) + جودة منخفضة (أصغر) + عدم الإظهار + السلوك + إجراء 'الفتح' المفضّل + الإجراء الافتراضي عند فتح المحتوى — %1$s + إظهار المعلومات + مشغل الفيديو + مشغل الخلفية + مشغل النافذة المنبثقة + تنزيل + إضافة إلى قائمة التشغيل + السؤال دائمًا + التصغير عند تبديل التطبيق + ‎الإجراء عند الانتقال إلى تطبيق آخر من مشغل الفيديو الرئيسي — %1$s + لا شيء + التصغير إلى مشغل الخلفية + التصغير إلى مشغل النافذة المنبثقة + بدء تشغيل الفيديو في وضع ملء الشاشة + لا تبدأ تشغيل الفيديوهات في المشغّل المصغّر، بل انتقل مباشرةً إلى وضع ملء الشاشة إذا كان تدوير الشاشة التلقائي مقفلًا. يمكنك الوصول إلى المشغّل المصغّر عند الخروج من وضع ملء الشاشة + التشغيل التلقائي + بدء التشغيل تلقائيًا — %1$s + دائمًا + عبر Wi-Fi فقط + أبدًا + إضافة المقطع التالي إلى قائمة التشغيل تلقائيًا + استئناف التشغيل + متابعة التشغيل بعد الانقطاعات (مثل المكالمات الهاتفية) + إجراء الإيماءة لليسار + اختر الإيماءة للنصف الأيسر من شاشة المشغّل + إجراء الإيماءة لليمين + ‎اختر الإيماءة للنصف الأيمن من شاشة المشغّل + السطوع + مستوي الصوت + لا شيء + تذكر خصائص النافذة المنبثقة + تذكّر آخر حجم وموضع للنافذة المنبثقة + استخدام التنقّل السريع غير الدقيق + يتيح التنقّل غير الدقيق للمشغّل الانتقال إلى المواضع بسرعة أكبر وبدقة أقل. لا يعمل التنقّل بمقدار 5 أو 15 أو 25 ثانية مع هذا + مدة التنقّل للتقديم السريع/الإرجاع + ‎بسبب قيود ExoPlayer، تم تعيين مدة التنقّل إلى %1$d ثانية + اطلب التأكيد قبل مسح قائمة الانتظار + قد يؤدي التبديل من مشغّل إلى آخر إلى استبدال قائمة الانتظار الخاصة بك + تجاهل أحداث أزرار الوسائط العتادية + مفيد، على سبيل المثال، إذا كنت تستخدم سماعة رأس بأزرار فعلية معطلة + + %1$d ثانية + %1$d ثانية + %1$d ثانية + %1$d ثواني + %1$d ثانية + %1$d ثانية + + إعدادات ExoPlayer + إدارة بعض إعدادات ExoPlayer. تتطلب هذه التغييرات إعادة تشغيل المشغّل لتطبيقها + حجم فترة تحميل التشغيل + تغيير حجم أجزاء التحميل للمحتوى الذي يُحمَّل تدريجيًا (الحالي: %1$s). قد تساعد القيمة الأقل على تسريع بدء التحميل + الإعداد الافتراضي لـ ExoPlayer + استخدام ميزة الرجوع إلى وحدة فك ترميز بديلة في ExoPlayer + فعّل هذا الخيار إذا واجهت مشكلات في تهيئة وحدة فك الترميز. عند فشل تهيئة وحدات فك الترميز الأساسية، سيستخدم التطبيق وحدات بديلة أقل أولوية، وقد يؤدي ذلك إلى أداء أضعف أثناء التشغيل + تعطيل تمرير الوسائط النفقي + عطّل تمرير الوسائط النفقي إذا واجهت شاشة سوداء أو تقطيعًا أثناء تشغيل الفيديو. + تم تعطيل تمرير الوسائط النفقي افتراضيًا على جهازك لأن طراز جهازك معروف بعدم دعمه لهذه الميزة. + استخدام حل بديل لإعداد سطح إخراج الفيديو في ExoPlayer دائمًا + يعيد هذا الحل البديل تهيئة برامج ترميز الفيديو عند تغيير سطح العرض، بدلًا من تعيين السطح مباشرةً لبرنامج الترميز. يستخدم ExoPlayer هذا الحل بالفعل على بعض الأجهزة التي تواجه هذه المشكلة، ولا يؤثر هذا الإعداد إلا في Android 6 والإصدارات الأحدث\n\nقد يساعد تفعيل هذا الخيار على منع أخطاء التشغيل عند التبديل بين مشغلات الفيديو أو الانتقال إلى وضع ملء الشاشة diff --git a/shared/src/commonMain/composeResources/values-as/strings.xml b/shared/src/commonMain/composeResources/values-as/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-as/strings.xml +++ b/shared/src/commonMain/composeResources/values-as/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ast/strings.xml b/shared/src/commonMain/composeResources/values-ast/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ast/strings.xml +++ b/shared/src/commonMain/composeResources/values-ast/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-az/strings.xml b/shared/src/commonMain/composeResources/values-az/strings.xml index 6187929f6..6440907e2 100644 --- a/shared/src/commonMain/composeResources/values-az/strings.xml +++ b/shared/src/commonMain/composeResources/values-az/strings.xml @@ -86,7 +86,7 @@ Aşağı keyfiyyət (daha kiçik) Göstərməyin Davranış - "Açıq" fəaliyyətə üstünlük verilir + Açıq fəaliyyətə üstünlük verilir Məzmunu açarkən standart hərəkət — %1$s Məlumat göstər Video oynadıcı @@ -145,4 +145,20 @@ Media girişi cihazınızda standart olaraq qeyri-aktiv edilib, çünki cihazınızın modelinin bunu dəstəkləmədiyi məlumdur. Həmişə ExoPlayer-in video çıxış səthi tənzimləməsin istifadə et Bu həll yolu səthi kodlayıcıya birbaşa tənzimləmək əvəzinə, səth dəyişikliyi olarsa video kodlayıcıları buraxır və yenidən işlədir. Artıq ExoPlayer vasitəsilə bu problemli bəzi cihazlarda istifadə olunur, bu tənzimləmənin təsiri yalnız Android 6 və daha yüksəkdə var. \n \nBu seçimi işlətmə cari video oynadıcı dəyişəndə və ya tam ekrana keçəndə oynatma xətaların düzəldə bilər + Oynadıcını çökdür Göstər + Bağışlayın, nəsə səhv oldu. + LeakCanary + Tətbiq çökdü + Yaddaş sızma monitorinqi yığın boşaltma zamanı tətbiqin cavab verməməsinə səbəb ola bilər + Yaddaş sızmalarını göstər + Yeni yayımları yoxlamanı işə sal + Oynadıcını istifadə edərkən çökdürmə seçimini göstərir + Elementlərdə orijinal, əvvəlki vaxtı göstər + Xəta bildirişi yarat + LeakCanary mövcud deyil + Xidmətlərdən orijinal mətnlər yayım elementlərində görünəcək + Yaşam dövrəsi xaricindəki xətaları bildir + Utilizasiyadan sonra fraqment və ya fəaliyyətin yaşam dövründən kənarda, çatdırıla bilməyən Rx istisnaları barədə məlumat verməsinə məcbur et + Xəta balonu göstər + Məlumat Ver diff --git a/shared/src/commonMain/composeResources/values-b+uz+Latn/strings.xml b/shared/src/commonMain/composeResources/values-b+uz+Latn/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-b+uz+Latn/strings.xml +++ b/shared/src/commonMain/composeResources/values-b+uz+Latn/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-bar/strings.xml b/shared/src/commonMain/composeResources/values-bar/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-bar/strings.xml +++ b/shared/src/commonMain/composeResources/values-bar/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ber/strings.xml b/shared/src/commonMain/composeResources/values-ber/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ber/strings.xml +++ b/shared/src/commonMain/composeResources/values-ber/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-bm/strings.xml b/shared/src/commonMain/composeResources/values-bm/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-bm/strings.xml +++ b/shared/src/commonMain/composeResources/values-bm/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-bn-rIN/strings.xml b/shared/src/commonMain/composeResources/values-bn-rIN/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-bn-rIN/strings.xml +++ b/shared/src/commonMain/composeResources/values-bn-rIN/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-bn/strings.xml b/shared/src/commonMain/composeResources/values-bn/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-bn/strings.xml +++ b/shared/src/commonMain/composeResources/values-bn/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-br/strings.xml b/shared/src/commonMain/composeResources/values-br/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-br/strings.xml +++ b/shared/src/commonMain/composeResources/values-br/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-bs/strings.xml b/shared/src/commonMain/composeResources/values-bs/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-bs/strings.xml +++ b/shared/src/commonMain/composeResources/values-bs/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ca/strings.xml b/shared/src/commonMain/composeResources/values-ca/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ca/strings.xml +++ b/shared/src/commonMain/composeResources/values-ca/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ckb/strings.xml b/shared/src/commonMain/composeResources/values-ckb/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ckb/strings.xml +++ b/shared/src/commonMain/composeResources/values-ckb/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-cs/strings.xml b/shared/src/commonMain/composeResources/values-cs/strings.xml index 84bbb19f7..0ea80aae4 100644 --- a/shared/src/commonMain/composeResources/values-cs/strings.xml +++ b/shared/src/commonMain/composeResources/values-cs/strings.xml @@ -64,4 +64,103 @@ Zrušit Výchozí rozlišení Výchozí rozlišení vyskakovacího okna + Omezit rozlišení při používání mobilních dat + Zobrazit vyšší rozlišení + Pouze některá zařízení dokáží přehrávat 2K/4K videa + Výchozí formát videa + Výchozí formát zvuku + Preferovat původní zvuk + Vybrat původní zvukovou stopu nezávisle na jazyce + Preferovat popisný zvuk + Vybrat zvukovou stopu s popisem pro zrakově postižené, pokud je dostupná + Nejlepší rozlišení + Bez omezení + Přehrávač + Použít externí videopřehrávač + U některých rozlišení odstraní zvuk + Použít externí audiopřehrávač + Zobrazit možnost Přehrát pomocí Kodi + Zobrazit možnost přehrání videa pomocí multimediálního centra Kodi + Náhledy na liště videa + Vysoká kvalita (větší) + Nízká kvalita (menší) + Nezobrazovat + Chování + Preferovaná akce „otevřít“ + Výchozí akce při otevírání obsahu – %1$s + Zobrazit informace + Videopřehrávač + Přehrávač na pozadí + Vyskakovací přehrávač + Stáhnout + Přidat do playlistu + Přidat do fronty + Vždy se zeptat + Minimalizovat při přepnutí aplikace + Akce při přepnutí na jinou aplikace z hlavního videopřehrávače – %1$s + Žádná + Minimalizovat na přehrávač na pozadí + Minimalizovat na vyskakovací přehrávač + Spustit hlavní přehrávač na celé obrazovce + Nespouštět videa v mini přehrávači, ale rovnou přepnout na celoobrazovkový režim, pokud je automatické otáčení vypnuté. Minipřehrávač můžete stále otevřít opuštěním celé obrazovky + Automatické přehrávání + Automaticky spustit přehrávání – %1$s + Vždy + Pouze na Wi-Fi + Nikdy + Automaticky přidat další stream do fronty + Pokračovat v končící (neopakující se) frontě přehrávání přidáním doporučeného streamu + Pokračovat v přehrávání + Pokračovat v přehrávání po přerušení (např. telefonní hovory) + Akce levého gesta + Vyberte si gesto pro levou polovinu obrazovky přehrávače + Akce pravého gesta + Vyberte si gesto pro pravou polovinu obrazovky přehrávače + Jas + Hlasitost + Žádný + Zapamatovat si vlastnosti vyskakovacího okna + Zapamatovat si poslední velikost a pozici vyskakovacího okna + Použít rychlé nepřesné posouvání + Nepřesné posouvání umožňuje přehrávači přesouvat se na pozice rychleji se sníženou přesností. Posun o 5, 15 nebo 25 sekund není s touto možností podporován + Trvání rychlého přetočení vpřed/vzad + Z důvodu omezení funkce ExoPlayer bylo omezeno trvání posunu na %1$d sekund + Zeptat se na potvrzení před vymazáním fronty + Přepnutí z jednoho přehrávače na jiný může nahradit vaši frontu + Ignorovat hardwarová multimediální tlačítka + Užitečné například pokud používáte sluchátka s rozbitými fyzickými tlačítky + + %1$d sekunda + %1$d sekundy + %1$d sekund + %1$d sekund + + Nastavení služby ExoPlayer + Správa některých nastavení služby ExoPlayer. Tyto změny vyžadují restart + Velikost intervalu načtení přehrávání + Změnit velikost načtení intervalu u progresivního obsahu (aktuálně %1$s). Nižší hodnota může zrychlit jeho prvotní načtení + Výchozí nastavení služby ExoPlayer + Použít záložní funkci dekodéru ExoPlayer + Povolte tuto možnost, pokud máte potíže s inicializací dekodéru. Tato možnost použije dekodéry s nižší prioritou, pokud inicializace primárních dekodérů selže. Důsledkem může být horší výkon při přehrávání oproti použití primárních dekodérů + Zakázat tunelování médií + Zakažte tunelování médií, pokud máte potíže s černou obrazovkou nebo sekáním při přehrávání videa. + Tunelování médií bylo na vašem zařízení ve výchozím nastavení zakázáno, protože jej váš model zařízení nepodporuje. + Vždy používat náhradu nastavení výstupního povrchu videa služby ExoPlayer + Tato náhrada uvolňuje a znovu instancuje video kodeky při změně povrchu, namísto přímého přiřazení kodeku k povrchu. Toto nastavení, které již ExoPlayer využívá na některých zařízeních s tímto problémem, má vliv pouze na systému Android 6 a vyšších.\n\nPovolení této možnosti může zabránit chybám při přehrávání při přepnutí aktuálního přehrávače videa nebo při přepnutí do režimu celé obrazovky + LeakCanary + Monitorování úniků paměti může způsobit, že aplikace nebude odpovídat během vytváření výpisů paměti + LeakCanary není dostupný + Zobrazit úniky paměti + Hlásit chyby out-of-lifecycle + Vynutit hlášení nedoručitelných chyb Rx mimo fragment cyklu aktivity po vyhození + Zobrazit původní relativní čas u položek + Původní texty ze služeb budou viditelné u položek streamů + Zobrazit shození přehrávače + Zobrazí možnost shození během používání přehrávače + Spustit kontrolu nových streamů + Shodit aplikaci + Zobrazit chybovou hlášku + Vytvořit chybové oznámení + Omlouváme se, něco se pokazilo. + Nahlásit diff --git a/shared/src/commonMain/composeResources/values-cy/strings.xml b/shared/src/commonMain/composeResources/values-cy/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-cy/strings.xml +++ b/shared/src/commonMain/composeResources/values-cy/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-da/strings.xml b/shared/src/commonMain/composeResources/values-da/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-da/strings.xml +++ b/shared/src/commonMain/composeResources/values-da/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-de/strings.xml b/shared/src/commonMain/composeResources/values-de/strings.xml index 7c07378fe..e28a45970 100644 --- a/shared/src/commonMain/composeResources/values-de/strings.xml +++ b/shared/src/commonMain/composeResources/values-de/strings.xml @@ -145,4 +145,50 @@ Das Media-Tunneling wurde auf dem Gerät standardmäßig deaktiviert, da das Gerätemodell diese Funktion bekanntermaßen nicht unterstützt. Immer die ExoPlayer-Einstellung für die Videoausgangsoberfläche als Umgehung verwenden Dieser Workaround gibt die Video-Codecs frei und instanziiert sie neu, wenn sich die Oberfläche ändert, anstatt die Oberfläche direkt auf den Codec zu setzen. Diese Einstellung wird bereits von ExoPlayer auf einigen Geräten mit diesem Problem verwendet und hat nur Auswirkungen auf Android 6 und höher \n \nDas Aktivieren dieser Option kann Wiedergabefehler beim Wechsel des aktuellen Videoplayers oder beim Wechsel zum Vollbildmodus verhindern + Player abstürzen lassen anzeigen + Entschuldigung, etwas ist schiefgelaufen. + LeakCanary + App abstürzen lassen + Die Überwachung von Speicherlecks kann dazu führen, dass die App beim Heap-Dumping nicht mehr reagiert + Speicherlecks anzeigen + Suche nach neuen Streams ausführen + Zeigt eine Absturzoption an, wenn der Player verwendet wird + Originalzeit vor Elementen anzeigen + Eine Fehlermeldung erstellen + LeakCanary ist nicht verfügbar + Originaltexte von Diensten werden in Stream-Elementen sichtbar sein + Fehler außerhalb des Lebenszyklus melden + Meldung unzustellbarer Rx-Ausnahmen außerhalb des Lebenszyklus von Fragmenten oder Aktivitäten nach dem Entsorgen erzwingen + Fehler-Kurzmeldung anzeigen + Melden + OK + Downloadziel abfragen + Du wirst gefragt, wo jeder Download gespeichert werden soll.\nAktiviere die Systemordnerauswahl (SAF), wenn du auf eine externe SD-Karte herunterladen möchtest + Du wirst gefragt, wo jeder Download gespeichert werden soll + Systemordnerauswahl verwenden (SAF) + Das „Storage Access Framework“ ermöglicht das Herunterladen auf eine externe SD-Karte + Ab Android 10 wird nur noch „Storage Access Framework“ unterstützt + Audio-Downloadordner + Video-Downloadordner + Heruntergeladene Videodateien werden hier gespeichert + Heruntergeladene Audiodateien werden hier gespeichert + Zulässige Zeichen in Dateinamen + Buchstaben und Zahlen + Die häufigsten Sonderzeichen + Ersetzungszeichen + Ungültige Zeichen werden durch dieses Zeichen ersetzt + Maximale Wiederholungen + Maximalanzahl der Versuche, bevor das Herunterladen abgebrochen wird + Bei kostenpflichtigen Netzwerken unterbrechen + Nützlich beim Wechsel zu mobilen Daten, obwohl einige Downloads nicht unterbrochen werden können + Downloadwarteschlange begrenzen + Es wird jeweils ein Download gleichzeitig ausgeführt + Fehler + Ordner existiert nicht + Bitte gib den Downloadordner später in den Einstellungen an + Externer Speicher nicht verfügbar + Herunterladen auf externe SD-Karte nicht möglich. Speicherort des Downloadordners zurücksetzen? + Keine App auf deinem Gerät kann dies öffnen + Für diese Aktion wurde kein geeigneter Dateimanager gefunden.\nBitte installiere einen Dateimanager oder versuche, '%1$s' in den Downloadeinstellungen zu deaktivieren + Für diese Aktion wurde kein geeigneter Dateimanager gefunden.\nBitte installiere einen Storage Access Framework kompatiblen Dateimanager diff --git a/shared/src/commonMain/composeResources/values-dum/strings.xml b/shared/src/commonMain/composeResources/values-dum/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-dum/strings.xml +++ b/shared/src/commonMain/composeResources/values-dum/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-el/strings.xml b/shared/src/commonMain/composeResources/values-el/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-el/strings.xml +++ b/shared/src/commonMain/composeResources/values-el/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-en-rGB/strings.xml b/shared/src/commonMain/composeResources/values-en-rGB/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-en-rGB/strings.xml +++ b/shared/src/commonMain/composeResources/values-en-rGB/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-eo/strings.xml b/shared/src/commonMain/composeResources/values-eo/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-eo/strings.xml +++ b/shared/src/commonMain/composeResources/values-eo/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-eu/strings.xml b/shared/src/commonMain/composeResources/values-eu/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-eu/strings.xml +++ b/shared/src/commonMain/composeResources/values-eu/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-fa/strings.xml b/shared/src/commonMain/composeResources/values-fa/strings.xml index 4247041da..809ad20e8 100644 --- a/shared/src/commonMain/composeResources/values-fa/strings.xml +++ b/shared/src/commonMain/composeResources/values-fa/strings.xml @@ -30,7 +30,7 @@ اشکال‌زدایی پشتیبان و بازگردانی تاریخچه و انباره - به‌روز رسانی‌ها + به‌روز رسانی‌ها تنظیمات جست‌وجو محتوا @@ -38,4 +38,14 @@ ویدیو و صدا بارگیری ظاهر + سیاه + زمینهٔ شب + تیره + می‌توانید زمینهٔ شب دلخواهتان را در زیر بگزینید + روشن + این گزینه تنها در صورت گزینش زمینهٔ %1$s در دسترس است + خودکار (زمینهٔ افزاره) + گزینش زمینهٔ شب دلخواهتان — %1$s + زمینه + گزارش diff --git a/shared/src/commonMain/composeResources/values-fi/strings.xml b/shared/src/commonMain/composeResources/values-fi/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-fi/strings.xml +++ b/shared/src/commonMain/composeResources/values-fi/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-fil/strings.xml b/shared/src/commonMain/composeResources/values-fil/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-fil/strings.xml +++ b/shared/src/commonMain/composeResources/values-fil/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-fr/strings.xml b/shared/src/commonMain/composeResources/values-fr/strings.xml index ec65fc2dc..ee090eaaf 100644 --- a/shared/src/commonMain/composeResources/values-fr/strings.xml +++ b/shared/src/commonMain/composeResources/values-fr/strings.xml @@ -8,7 +8,7 @@ Licences Streaming libre et léger sur Android. Contribuer - Que vous ayez des idées concernant la traduction, des modifications de conception, le nettoyage du code ou des modifications techniques importantes, votre aide est toujours la bienvenue. Plus on y met du nôtre, meilleurs sont les résultats ! + Que vous ayez des idées concernant la traduction, des modifications de conception, le nettoyage du code ou des modifications techniques importantes, votre aide est toujours la bienvenue. Plus on y met du nôtre, meilleurs sont les résultats ! Consulter sur GitHub Faire un don NewPipe est développé par des bénévoles qui consacrent leur temps libre à vous offrir la meilleure expérience utilisateur possible. Contribuez à aider les développeurs à améliorer encore NewPipe tout en leur permettant de s'offrir une tasse de café. @@ -19,10 +19,10 @@ Le projet NewPipe accorde une grande importance à la protection de vos données personnelles. C'est pourquoi l'application ne collecte aucune donnée sans votre consentement.\nLa politique de confidentialité de NewPipe explique en détail quelles données sont transmises et stockées lorsque vous envoyez un rapport d'erreur. Consultez notre politique de confidentialité Licence de NewPipe - NewPipe est un logiciel libre sous licence copyleft : vous pouvez l'utiliser, l'étudier, le partager et l'améliorer à votre guise. Plus précisément, vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence publique générale GNU telle que publiée par la Free Software Foundation, soit la version 3 de la licence, soit (à votre choix) toute version ultérieure. + NewPipe est un logiciel libre sous licence copyleft : vous pouvez l'utiliser, l'étudier, le partager et l'améliorer à votre guise. Plus précisément, vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence publique générale GNU telle que publiée par la Free Software Foundation, soit la version 3 de la licence, soit (à votre choix) toute version ultérieure. Lire la licence Foire aux questions - Si vous rencontrez des difficultés avec l'application, n'hésitez pas à consulter ces réponses aux questions fréquentes ! + Si vous rencontrez des difficultés avec l'application, n'hésitez pas à consulter ces réponses aux questions fréquentes ! Consulter sur le site web Ouvrir dans le navigateur Terminé @@ -48,7 +48,7 @@ Cette option n'est disponible que si %1$s est sélectionné comme thème. Vous pouvez choisir ci-dessous votre thème nocturne préféré Afficher l'astuce « Maintenir enfoncé pour ajouter à la file d'attente » - Afficher l'astuce lorsque l'on appuie sur l'arrière-plan ou sur le bouton contextuel dans la vidéo « Détails : » + Afficher l'astuce lorsque l'on appuie sur l'arrière-plan ou sur le bouton contextuel dans la vidéo « Détails : » Mode tablette Mode d'affichage sous forme de liste Légendes diff --git a/shared/src/commonMain/composeResources/values-gl/strings.xml b/shared/src/commonMain/composeResources/values-gl/strings.xml index 3c19d32fe..f9f877787 100644 --- a/shared/src/commonMain/composeResources/values-gl/strings.xml +++ b/shared/src/commonMain/composeResources/values-gl/strings.xml @@ -18,4 +18,147 @@ O proxecto NewPipe tómase moi en serio a túa privacidade. Polo tanto, a aplicación non recompila ningún dato sen o teu consentimento.\nA política de privacidade de NewPipe explica en detalle que datos se envían e almacenan cando envías un informe de erro. Le a política de privacidade Licenza de NewPipe + Atrás + NewPipe é software libre con copyleft: podes usalo, estudalo, compartilo e melloralo como queiras. En concreto, podes redistribúilo e/ou modificalo segundo os termos da Licenza Pública Xeral de GNU, tal e como a publica a Free Software Foundation, xa sexa na versión 3 da Licenza ou (a túa elección) en calquera versión posterior. + Ler licenza + Preguntas frecuentes + Se tes dificultades para usar a aplicación, bótalle unha ollada a estas respostas a preguntas frecuentes! + Ver no sitio web + Abir no navegador + Feito + Non dispoñible + Configuración + Busca + Contido + Notificacións + Vídeo e son + Descargar + Apariencia + Historial e caché + Actualizacións + Copia de seguridade e restauración + Depurar + Tema + Claro + Escuro + Negro + Automático (tema do dispositivo) + Tema nocturno + Selecciona o teu tema nocturno favorito — %1$s + Esta opción só está dispoñible se seleccionou %1$s para Tema + Podes seleccionar o teu tema nocturno favorito a continuación + Amosar consello de Espera para engadir á cola + Amosar unha suxestión ao premer no fondo ou no botón da xanela emerxente nos detalles do vídeo: + Modo de tableta + Modo de vista de lista + Subtítulos + Modifica a escala do texto da lenda do reprodutor e os estilos do fondo. É necesario reiniciar a aplicación para que os cambios teñan efecto + Posición das lapelas principais + Mover o selector da lapela principal ao fondo + Automático + Acendido + Apagado + Listaxe + Grella + Tarxeta + Cancelar + Resolución por defecto + Resolución predeterminada da xanela emerxente + Limitar a resolución ao usar datos móbiles + Amosar resolucións máis altas + Só algúns dispositivos poden reproducir vídeos 2K/4K + Formato de vídeo predeterminado + Formato de son predeterminado + Prefiro o son orixinal + Selecciona a pista de son orixinal, independentemente do idioma + Prefiro a audiodescrición + Selecciona unha pista de son con descricións para persoas con discapacidade visual, se está dispoñible + Mellor resolución + Sen límite + Reprodutor + Usar reprodutor de vídeo externo + Elimina o son nalgunhas resolucións + Usear reprodutor de son externo + Amosar a opción Reproducir con Kodi + Amosar unha opción para reproducir un vídeo a través do centro multimedia Kodi + Vista previa en miniatura na barra de progreso + Alta calidade (máis grande) + Baixa calidade (máis pequeno) + Non amosar + Comportamento + Acción «abrir» preferida + Acción predeterminada ao abrir contido — %1$s + Amosar información + Reprodutor de vídeo + Reprodutor en segundo plano + Reprodutor emerxente + Descargar + Engadir á lista de reprodución + Poñer na cola + Preguntar sempre + Minimizar ao cambiar de aplicación + Acción ao cambiar a outra aplicación desde o reprodutor de vídeo principal — %1$s + Ningún + Minimizar ao reprodutor en segundo plano + Minimizar a un reprodutor emerxente + Iniciar o reprodutor principal en pantalla completa + Non inicies os vídeos no minirreprodutor; pasa directamente ao modo de pantalla completa se a rotación automática está bloqueada. Podes acceder ao minirreprodutor saíndo da pantalla completa + Reprodución automática + Comezar a reprodución automaticamente — %1$s + Sempre + Só na Wi-Fi + Nunca + Engadir a seguinte transmisión á cola automaticamente + Continuar a finalización da cola de reprodución (non repetitiva) engadindo unha transmisión relacionada + Retomar a reprodución + Continuar a reprodución despois das interrupcións (por exemplo, chamadas telefónicas) + Acción do xesto á esquerda + Escolle un xesto para a metade esquerda da pantalla do reprodutor + Acción do xesto á dereita + Escolle un xesto para a metade dereita da pantalla do reprodutor + Brillo + Volume + Ningún + Lembrar as propiedades da xanela emerxente + Lembrar o último tamaño e posición da ventá emerxente + Usar busca rápida e inexacta + A busca inexacta permítelle ao reprodutor desprazarse a posicións con maior rapidez, mais cunha precisión reducida. A busca de 5, 15 ou 25 segundos non funciona con esta opción + Duración do salto ao avanzar/retroceder + Debido a limitacións de ExoPlayer, a duración do salto estableceu en %1$d segundos + Solicitar confirmación antes de baleirar unha cola + Cambiar dun reprodutor a outro pode substituír a túa cola + Ignorar os eventos dos botóns multimedia de hardware (físicos) + Útil, por exemplo, se estás a usar uns auriculares con botóns físicos estragados + + %1$d segundo + %1$d segundos + + Configuración de ExoPlayer + Xestiona algunha configuración de ExoPlayer. Estes cambios requiren reiniciar o reprodutor para que teñan efecto + Tamaño do intervalo de carga da reprodución + Cambia o tamaño do intervalo de carga nos contidos progresivos (actualmente %1$s). Un valor máis baixo pode acelerar a súa carga inicial + ExoPlayer predeterminado + Utiliza a función de alternativa de decodificador de ExoPlayer + Activa esta opción se tes problemas coa inicialización do decodificador; isto permite recorrer a decodificadores de menor prioridade no caso de que falle a inicialización dos principais. Isto pode dar lugar a un rendemento de reprodución inferior ao que se obtería utilizando os decodificadores principais + Desactivar o túnel multimedia + Desactiva o «media tunneling» se experimentas unha pantalla negra ou interrupcións durante a reprodución de vídeo. + O «media tunneling» desactivouse de forma predeterminada no teu dispositivo, xa que se sabe que o modelo do teu dispositivo non o admite. + Utiliza sempre a solución alternativa de ExoPlayer para a configuración da superficie de saída de vídeo + Esta solución alternativa libera e volve instanciar os códecs de vídeo cando se produce un cambio na superficie, en lugar de asignar a superficie directamente ao códec. Esta configuración, que xa utiliza ExoPlayer nalgúns dispositivos que presentan este problema, só ten efecto en Android 6 e versións posteriores.\n\nActivar esta opción pode evitar erros de reprodución ao cambiar o reprodutor de vídeo actual ou ao pasar ao modo de pantalla completa + LeakCanary + A monitorización de fugas de memoria pode facer que a aplicación deixe de responder ao realizar un volcado da memoria dinámica (heap dump) + LeakCanary non está dispoñible + Amosar fugas de memoria + Informar de erros fóra do ciclo de vida + Forzar a notificación de excepcións Rx non entregables fóra do ciclo de vida dun fragmento ou actividade, tras a súa eliminación + Mostrar o tempo transcorrido orixinal nos elementos + Os textos orixinais dos servizos serán visibles nos elementos do fluxo + Amosa o peche inesperado do reprodutor + Mostra unha opción de peche inesperado ao usar o reprodutor + Comprobar se hai novas emisións + Falla a aplicación + Mostrar unha barra de mensaxes de erro + Crear unha notificación de erro + Desculpe, algo saíu mal. + Informe diff --git a/shared/src/commonMain/composeResources/values-gu/strings.xml b/shared/src/commonMain/composeResources/values-gu/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-gu/strings.xml +++ b/shared/src/commonMain/composeResources/values-gu/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-hu/strings.xml b/shared/src/commonMain/composeResources/values-hu/strings.xml index b98336446..70a0397ee 100644 --- a/shared/src/commonMain/composeResources/values-hu/strings.xml +++ b/shared/src/commonMain/composeResources/values-hu/strings.xml @@ -50,7 +50,7 @@ Ez a lehetőség csak akkor érhető el, ha a(z) %1$s van kiválasztva témaként Az alábbiakban kiválaszthatja kedvenc éjszakai témáját Tartsa lenyomva a sorba állításhoz tipp megjelenítése - Tipp megjelenítése a háttér vagy a felugró ablak gombjának megnyomásakor a videó \\"Részletek:\\" részében + Tipp megjelenítése a háttér vagy a felugró ablak gombjának megnyomásakor a videó „Részletek” részében: Listanézet mód A lejátszó feliratának, szövegméretének és háttérstílusainak módosítása. A módosítások érvénybe lépéséhez újra kell indítani az alkalmazást Fő lapok elhelyezkedése @@ -62,4 +62,133 @@ Rács Kártya Mégse + Alapértelmezett felbontás + Alapértelmezett felugró ablak felbontása + Felbontás korlátozása mobiladat használatakor + Magasabb felbontások megjelenítése + Csak bizonyos eszközök képesek 2K/4K felbontású videók lejátszására + Alapértelmezett videóformátum + Alapértelmezett hangformátum + Eredeti hang előnyben részesítése + Eredeti hangsáv kiválasztása a nyelvtől függetlenül + Hangos képleírás előnyben részesítése + Ha elérhető, a látássérültek számára készült hangos képleírást tartalmazó hangsáv kiválasztása + Legjobb felbontás + Nincs korlátozás + Lejátszó + Külső videólejátszó használata + Bizonyos felbontásoknál eltávolítja a hangsávot + Külső hanglejátszó használata + A „Lejátszás Kodival” lehetőség megjelenítése + Lehetőség megjelenítése a videó Kodi médialejátszóval történő lejátszására + Előnézeti bélyegképek a keresősávon + Kiváló minőségű (nagyobb méretű) + Alacsony minőségű (kisebb méretű) + Ne jelenjen meg + Viselkedés + Előnyben részesített megnyitási művelet + Tartalom megnyitásakor végrehajtandó alapértelmezett művelet — %1$s + Információ megjelenítése + Videólejátszó + Háttérlejátszó + Felugró lejátszó + Letöltés + Hozzáadás a lejátszási listához + Sorba állítás + Mindig kérdezzen rá + Minimalizálás alkalmazásváltáskor + Művelet másik alkalmazásra váltáskor a fő videólejátszóból — %1$s + Ne történjen semmi + Minimalizálás háttérlejátszóba + Minimalizálás felugró lejátszóba + Fő lejátszó indítása teljes képernyős módban + Ha az automatikus elforgatás zárolva van, a videók ne a minilejátszóban induljanak el, hanem közvetlenül teljes képernyős módban. A teljes képernyős módból kilépve továbbra is elérhető a minilejátszó + Automatikus lejátszás + Lejátszás automatikus indítása — %1$s + Mindig + Csak Wi-Fi-n + Soha + Következő közvetítés automatikus sorba állítása + A lejátszási sor végén automatikusan hozzáad egy kapcsolódó közvetítést, ha az ismétlés ki van kapcsolva + Lejátszás folytatása + Lejátszás folytatása megszakítások (pl. telefonhívások) után + Bal oldali gesztusművelet + A lejátszó képernyőjének bal felén használható gesztus kiválasztása + Jobb oldali gesztusművelet + A lejátszó képernyőjének jobb felén használható gesztus kiválasztása + Fényerő + Hangerő + Egyiksem + Felugró lejátszó beállításainak megjegyzése + A felugró lejátszó legutóbbi méretének és pozíciójának megjegyzése + Gyors, pontatlan tekerés használata + A pontatlan tekerés gyorsabb pozícióváltást tesz lehetővé a lejátszóban, kisebb pontosság mellett. Ezzel a funkcióval nem működik az 5, 15 vagy 25 másodperces előre- és visszatekerés + Előre- és visszatekerés időtartama + Az ExoPlayer korlátozásai miatt a tekerés időtartama %1$d másodpercre lett beállítva + Lejátszási sor törlése előtt megerősítés kérése + A lejátszóváltás lecserélheti a lejátszási sort + Hardveres médialejátszó-gombok eseményeinek figyelmen kívül hagyása + Hasznos például akkor, ha hibás fizikai gombokkal rendelkező fejhallgatót használ + + %1$d másodperc + %1$d másodperc + + ExoPlayer beállítások + Néhány ExoPlayer-beállítás kezelése. A módosítások érvénybe lépéséhez újra kell indítani a lejátszót + Lejátszási adatbetöltési időtartam mérete + A fokozatosan letöltött tartalmak adatbetöltési időtartamának módosítása (jelenleg: %1$s). Alacsonyabb érték esetén a tartalmak gyorsabban kezdhetnek betöltődni + ExoPlayer alapértelmezett beállítása + ExoPlayer dekóder-visszaállási funkciójának használata + Engedélyezze ezt a beállítást, ha problémák merülnek fel a dekóderek inicializálásakor. Ha az elsődleges dekóderek inicializálása sikertelen, a lejátszó alacsonyabb prioritású dekóderekre vált. Ez gyengébb lejátszási teljesítményt eredményezhet az elsődleges dekóderek használatához képest + Médiatunneling letiltása + Ha videólejátszás közben fekete képernyőt vagy akadozást tapasztal, tiltsa le a médiatunneling funkciót. + Az eszközén alapértelmezés szerint le van tiltva a médiatunneling, mert ismert, hogy ez az eszközmodell nem támogatja. + Mindig az ExoPlayer videokimeneti felületére vonatkozó beállítási kerülőmegoldás használata + Ez a kerülőmegoldás a videókodekek felszabadításával és újbóli inicializálásával kezeli a videómegjelenítő felület változásait, ahelyett, hogy közvetlenül a kodekhez rendelné az új felületet. Az ExoPlayer bizonyos, ilyen problémákkal érintett eszközökön már eleve alkalmazza ezt a megoldást. Ez a beállítás csak Android 6 vagy újabb verzió esetén van hatással a működésre\n\nA beállítás bekapcsolása segíthet megelőzni a lejátszási hibákat az aktuális videólejátszó váltásakor vagy teljes képernyős módra váltáskor + Lejátszó összeomlásának megjelenítése + Sajnáljuk, hiba történt. + LeakCanary + Alkalmazás összeomlasztása + A memóriaszivárgás figyelése a heap kiírásakor az alkalmazás lefagyását okozhatja + Memóriaszivárgások megjelenítése + Új közvetítések keresése + Lejátszás közben megjelenít egy összeomlási lehetőséget + Elemek eredeti közzétételi idejének megjelenítése + Hibaértesítés létrehozása + A LeakCanary nem érhető el + A szolgáltatásokból származó eredeti szövegek megjelennek a hírfolyam elemeiben + Életcikluson kívüli hibák jelentése + Az eldobás után, a fragmentum vagy az aktivitás életciklusán kívül kézbesíthetetlen Rx-kivételek jelentésének kényszerítése + Hibaüzenet megjelenítése értesítősávban + Jelentés + Rendben + Kérdezzen rá, hol tölthető le + Minden letöltésnél meg kell adnia, hová szeretné menteni a fájlt.\nEngedélyezze a rendszer mappaválasztóját (SAF), ha külső SD-kártyára szeretne letölteni + Minden letöltésnél meg kell adnia, hová szeretné menteni a letöltött fájlt + Rendszer mappaválasztójának használata (SAF) + A „Storage Access Framework” (SAF) lehetővé teszi a letöltést külső SD-kártyára + Az Android 10-es verziójától kezdve csak a „Storage Access Framework” (SAF) támogatott + Videóletöltési mappa + A letöltött videófájlok tárolási helye + Hangletöltési mappa + A letöltött hangfájlok tárolási helye + Fájlnevekben engedélyezett karakterek + Betűk és számjegyek + A legtöbb speciális karakter + Helyettesítő karakter + Az érvénytelen karaktereket ez az érték helyettesíti + Újrapróbálkozások maximális száma + A letöltés megszakítása előtt megkísérelhető próbálkozások maximális száma + Letöltés megszakítása forgalomkorlátos hálózatokon + Hasznos lehet mobilinternetre váltáskor, bár egyes letöltések nem szüneteltethetők + Letöltési sor korlátozása + Egyszerre csak egy letöltés futhat + Hiba + Nincs ilyen mappa + Később állítson be egy letöltési mappát a beállításokban + A külső tárhely nem érhető el + Nem lehet letölteni a külső SD-kártyára. Visszaállítja a letöltési mappa helyét? + Az eszközén nincs olyan alkalmazás, amely meg tudná nyitni ezt + Nem található a művelethez megfelelő fájlkezelő.\nTelepítsen egy fájlkezelő alkalmazást, vagy próbálja meg kikapcsolni a „%1$s” beállítást a letöltési beállításokban + Nem található a művelethez megfelelő fájlkezelő.\nTelepítsen egy, a Storage Access Framework (SAF) rendszerrel kompatibilis fájlkezelő alkalmazást diff --git a/shared/src/commonMain/composeResources/values-hy/strings.xml b/shared/src/commonMain/composeResources/values-hy/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-hy/strings.xml +++ b/shared/src/commonMain/composeResources/values-hy/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ia/strings.xml b/shared/src/commonMain/composeResources/values-ia/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ia/strings.xml +++ b/shared/src/commonMain/composeResources/values-ia/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-in/strings.xml b/shared/src/commonMain/composeResources/values-in/strings.xml index 22b6ce7e2..63eb7ebb9 100644 --- a/shared/src/commonMain/composeResources/values-in/strings.xml +++ b/shared/src/commonMain/composeResources/values-in/strings.xml @@ -18,48 +18,146 @@ Selesai Tidak tersedia Streaming ringan Libre di Android. - Baik Anda memiliki ide tentang; terjemahan, pengubahan desain, pembersihan kode, atau pengubahan kode yang besar—bantuan selalu diterima. Semakin banyak yang dilakukan, semakin banyak hasilnya! + Apapun ide tentang; terjemahan, pengubahan desain, pembersihan kode, atau pengubahan kode yang besar—bantuan selalu diterima. Semakin banyak yang dilakukan, semakin baik hasilnya! NewPipe dikembangkan oleh para sukarelawan yang meluangkan waktu luang mereka untuk memberikan Anda pengalaman pengguna terbaik. Berikan dukungan untuk membantu para pengembang membuat NewPipe menjadi lebih baik lagi sementara mereka menikmati secangkir kopi. Berikan Lihat di situs web - Proyek NewPipe sangat mementingkan privasi Anda. Oleh karena itu, aplikasi ini tidak mengumpulkan data apapun tanpa persetujuan Anda.\nKebijakan privasi NewPipe menjelaskan secara detail data apa yang dikirim dan disimpan saat Anda mengirim laporan kerusakan. + Proyek NewPipe sangat mementingkan privasi Anda. Oleh karena itu, aplikasi ini tidak mengumpulkan data apapun tanpa persetujuan Anda.\nKebijakan privasi NewPipe menjelaskan secara rinci data apa saja yang dikirim dan disimpan saat Anda mengirim laporan kerusakan. Baca kebijakan privasi Baca lisensi Jika Anda mengalami kesulitan menggunakan aplikasi, pastikan untuk memeriksa jawaban atas pertanyaan umum ini! Aplikasi ini adalah perangkat lunak bebas copyleft: Anda dapat menggunakan, mempelajari, membagikan, dan memperbaikinya sesuka hati. Secara khusus, Anda dapat mendistribusikan dan/atau memodifikasinya berdasarkan ketentuan Lisensi Publik Umum GNU sebagaimana diterbitkan oleh Free Software Foundation, baik versi 3 dari Lisensi, atau (sesuai pilihan Anda) versi apapun yang lebih baru. Pengaturan - Telusur + Telusuri Konten Notifikasi - Audio dan Video - Unduh + Video dan audio + Unduhan Penampilan - Riwayat & Cache + Riwayat dan cache Pembaruan - Cadangkan dan Pulihkan + Cadangkan dan pulihkan Debug - Otomatis (sesuai perangkat) + Otomatis (tema perangkat) Terang Gelap Hitam Tema - Tema gelap + Tema malam Pilih tema malam favorit anda — %1$s Opsi ini hanya tersedia jika %1$s dipilih untuk tema Anda bisa memilih tema malam favorit Anda di bawah ini - Tampilkan tip \\"Tahan menambahkan ke antrian\\" - Tampilkan tip saat menekan tombol latar belakang atau tombol pop-up di video \\"Detail:\\" + Tampilkan tip Tahan untuk mengantrekan + Tampilkan tip saat menekan tombol latar belakang atau popup di Rincian video: Mode tablet Mode tampilan daftar Teks - Ubah skala teks keterangan pemutar dan gaya latar belakang. Dibutuhkan mulai ulang aplikasi agar perubahan berlaku. + Ubah skala teks keterangan pemutar dan gaya latar belakang. Membutuhkan mulai ulang aplikasi agar dapat diterapkan Posisi tab utama Pindahkan tab utama ke bagian bawah Otomatis Hidup - Nonaktif + Mati Daftar Kisi Kartu Batal + Resolusi bawaan + Resolusi popup bawaan + Batasi resolusi saat menggunakan data seluler + Tampilkan resolusi yang lebih tinggi + Hanya beberapa perangkat yang dapat memutar video 2K/4K + Format video bawaan + Format audio bawaan + Lebih suka audio asli + Pilih trek audio asli apapun bahasanya + Lebih suka audio deskriptif + Pilih trek audio dengan deskripsi untuk penyandang tunanetra jika tersedia + Resolusi terbaik + Tidak ada batasan + Pemutar + Menghapus audio pada beberapa resolusi + Gunakan pemutar video eksternal + Gunakan pemutar audio eksternal + Tampilkan opsi Putar dengan Kodi + Tampilkan opsi untuk memutar video melalui pusat media Kodi + Pratinjau thumbnail bilah laju + Kualitas tinggi (lebih besar) + Kualitas rendah (lebih kecil) + Jangan tampilkan + Perilaku + Tindakan 'buka' yang disukai + Tindakan bawaan saat membuka konten — %1$s + Tampilkan info + Pemutar video + Pemutar latar belakang + Pemutar popup + Unduh + Tambahkan ke daftar putar + Antrekan + Selalu tanyakan + Minimalkan saat beralih aplikasi + Tindakan saat beralih ke aplikasi lain dari pemutar video utama — %1$s + Tidak ada + Minimalkan ke pemutar latar belakang + Minimalkan ke pemutar popup + Mulai pemutar utama dalam layar penuh + Jangan memulai video di pemutar mini, tetapi langsung beralih ke mode layar penuh, jika rotasi otomatis terkunci. Anda masih dapat mengakses pemutar mini dengan keluar dari layar penuh + Putar otomatis + Mulai pemutaran secara otomatis — %1$s + Selalu + Hanya di Wi-Fi + Tidak pernah + Antrekan otomatis aliran berikutnya + Lanjutkan antrean pemutaran yang berakhir (tanpa pengulangan) dengan menambahkan aliran yang terkait + Lanjutkan pemutaran + Lanjutkan pemutaran setelah gangguan (misalnya panggilan telepon) + Tindakan gestur kiri + Tindakan gestur kanan + Pilih gestur untuk bagian kiri layar pemutar + Pilih gestur untuk bagian kanan layar pemutar + Kecerahan + Volume + Tidak ada + Ingat properti popup + Ingat ukuran dan posisi terakhir popup + Gunakan pencarian cepat yang tidak tepat + Pencarian tidak tepat memungkinkan pemutar untuk mencari posisi dengan lebih cepat, namun dengan presisi yang berkurang. Mencari selama 5, 15, atau 25 detik tidak akan berhasil + Durasi pencarian maju/mundur cepat + Karena keterbatasan ExoPlayer, durasi pencarian disetel ke %1$d detik + Minta konfirmasi sebelum menghapus antrean + Beralih dari satu pemutar ke yang lain mungkin menggantikan antrean Anda + Abaikan peristiwa tombol media pada perangkat keras + Berguna, misalnya, jika Anda menggunakan headset dengan tombol fisik yang rusak + + %1$d detik + + Pengaturan ExoPlayer + Kelola beberapa pengaturan ExoPlayer. Perubahan ini memerlukan mulai ulang pemutar agar dapat diterapkan + Ukuran interval pemuatan pemutaran + Ganti ukuran interval pemuatan pada konten progresif (saat ini %1$s). Nilai yang lebih rendah dapat mempercepat pemuatan awalnya + Bawaan ExoPlayer + Gunakan fitur fallback dekoder ExoPlayer + Hidupkan opsi ini jika Anda mengalami masalah inisialisasi dekoder, yang akan dikembalikan ke dekoder dengan prioritas lebih rendah jika inisialisasi dekoder utama gagal. Hal ini dapat menyebabkan kinerja pemutaran yang buruk dibandingkan saat menggunakan dekoder utama + Matikan penerowongan/tunneling media + Matikan penerowongan/tunneling media jika Anda mengalami layar hitam atau tersendat saat memutar video. + Penerowongan/tunneling media dimatikan secara bawaan di perangkat Anda karena model perangkat Anda diketahui tidak mendukungnya. + Selalu gunakan solusi pengaturan permukaan keluaran video ExoPlayer + Solusi ini merilis dan membuat ulang instansi codec video ketika terjadi perubahan permukaan, alih-alih menyetel permukaan ke codec secara langsung. Sudah digunakan oleh ExoPlayer pada beberapa perangkat yang mengalami masalah ini, pengaturan ini hanya berpengaruh pada Android 6 dan lebih tinggi\n\nMenghidupkan opsi ini dapat mencegah kesalahan pemutaran saat mengganti pemutar video saat ini atau beralih ke layar penuh + LeakCanary + Pemantauan kebocoran memori dapat menyebabkan aplikasi menjadi tidak responsif saat heap dumping + LeakCanary tidak tersedia + Tampilkan kebocoran memori + Laporkan kesalahan di luar siklus hidup + Paksa pelaporan pengecualian Rx yang tidak dapat dikirimkan di luar siklus hidup fragmen atau aktivitas setelah pembuangan + Tampilkan “waktu yang lalu” asli pada item + Teks asli dari layanan akan terlihat di item aliran + Tampilkan Hancurkan pemutarnya + Menampilkan opsi hancurkan saat menggunakan pemutar + Jalankan pemeriksaan untuk aliran baru + Hancurkan aplikasinya + Tampilkan snackbar kesalahan + Buat notifikasi kesalahan + Maaf, terjadi kesalahan. + Laporkan diff --git a/shared/src/commonMain/composeResources/values-jv/strings.xml b/shared/src/commonMain/composeResources/values-jv/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-jv/strings.xml +++ b/shared/src/commonMain/composeResources/values-jv/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ka/strings.xml b/shared/src/commonMain/composeResources/values-ka/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ka/strings.xml +++ b/shared/src/commonMain/composeResources/values-ka/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-kab/strings.xml b/shared/src/commonMain/composeResources/values-kab/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-kab/strings.xml +++ b/shared/src/commonMain/composeResources/values-kab/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-kk/strings.xml b/shared/src/commonMain/composeResources/values-kk/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-kk/strings.xml +++ b/shared/src/commonMain/composeResources/values-kk/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-kmr/strings.xml b/shared/src/commonMain/composeResources/values-kmr/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-kmr/strings.xml +++ b/shared/src/commonMain/composeResources/values-kmr/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-kn/strings.xml b/shared/src/commonMain/composeResources/values-kn/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-kn/strings.xml +++ b/shared/src/commonMain/composeResources/values-kn/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ko/strings.xml b/shared/src/commonMain/composeResources/values-ko/strings.xml index 9969b9db3..526188a9b 100644 --- a/shared/src/commonMain/composeResources/values-ko/strings.xml +++ b/shared/src/commonMain/composeResources/values-ko/strings.xml @@ -61,7 +61,7 @@ 이 옵션은 %1$s 테마를 선택해야 이용할 수 있습니다 아래에서 선호하는 야간 테마를 선택할 수 있습니다 길게 눌러 대기열에 추가 팁 표시 - 비디오 "세부사항:"에서 배경 또는 팝업 버튼을 누를 때 팁 표시 + 비디오 세부사항:에서 배경 또는 팝업 버튼을 누를 때 팁 표시 기본 해상도 기본 팝업 해상도 모바일 데이터 사용 시 해상도 제한 @@ -79,7 +79,7 @@ 외장 동영상 플레이어 사용 일부 해상도에서 오디오가 제거됩니다 외장 오디오 플레이어 사용 - "Kodi로 재생" 옵션 표시 + Kodi로 재생 옵션 표시 비디오를 Kodi 미디어 센터를 사용해 재생하는 옵션을 표시합니다 탐색막대 썸네일 미리보기 고품질 (크게) diff --git a/shared/src/commonMain/composeResources/values-ku/strings.xml b/shared/src/commonMain/composeResources/values-ku/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ku/strings.xml +++ b/shared/src/commonMain/composeResources/values-ku/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-lmo/strings.xml b/shared/src/commonMain/composeResources/values-lmo/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-lmo/strings.xml +++ b/shared/src/commonMain/composeResources/values-lmo/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-lt/strings.xml b/shared/src/commonMain/composeResources/values-lt/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-lt/strings.xml +++ b/shared/src/commonMain/composeResources/values-lt/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-mk/strings.xml b/shared/src/commonMain/composeResources/values-mk/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-mk/strings.xml +++ b/shared/src/commonMain/composeResources/values-mk/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ml/strings.xml b/shared/src/commonMain/composeResources/values-ml/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ml/strings.xml +++ b/shared/src/commonMain/composeResources/values-ml/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-mn/strings.xml b/shared/src/commonMain/composeResources/values-mn/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-mn/strings.xml +++ b/shared/src/commonMain/composeResources/values-mn/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-mr/strings.xml b/shared/src/commonMain/composeResources/values-mr/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-mr/strings.xml +++ b/shared/src/commonMain/composeResources/values-mr/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ms/strings.xml b/shared/src/commonMain/composeResources/values-ms/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ms/strings.xml +++ b/shared/src/commonMain/composeResources/values-ms/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-my/strings.xml b/shared/src/commonMain/composeResources/values-my/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-my/strings.xml +++ b/shared/src/commonMain/composeResources/values-my/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-nap/strings.xml b/shared/src/commonMain/composeResources/values-nap/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-nap/strings.xml +++ b/shared/src/commonMain/composeResources/values-nap/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-nb-rNO/strings.xml b/shared/src/commonMain/composeResources/values-nb-rNO/strings.xml index 8ebaabb1f..20d41ac4e 100644 --- a/shared/src/commonMain/composeResources/values-nb-rNO/strings.xml +++ b/shared/src/commonMain/composeResources/values-nb-rNO/strings.xml @@ -81,7 +81,7 @@ Lav kvalitet (mindre) Ikke vis Oppførsel - Foretrekt "åpne"-handling + Foretrekt åpne-handling Standard handling når innhold åpnes — %1$s Vis info Videoavspiller diff --git a/shared/src/commonMain/composeResources/values-ne/strings.xml b/shared/src/commonMain/composeResources/values-ne/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ne/strings.xml +++ b/shared/src/commonMain/composeResources/values-ne/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-nl-rBE/strings.xml b/shared/src/commonMain/composeResources/values-nl-rBE/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-nl-rBE/strings.xml +++ b/shared/src/commonMain/composeResources/values-nl-rBE/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-nn/strings.xml b/shared/src/commonMain/composeResources/values-nn/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-nn/strings.xml +++ b/shared/src/commonMain/composeResources/values-nn/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-nqo/strings.xml b/shared/src/commonMain/composeResources/values-nqo/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-nqo/strings.xml +++ b/shared/src/commonMain/composeResources/values-nqo/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-oc/strings.xml b/shared/src/commonMain/composeResources/values-oc/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-oc/strings.xml +++ b/shared/src/commonMain/composeResources/values-oc/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-or/strings.xml b/shared/src/commonMain/composeResources/values-or/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-or/strings.xml +++ b/shared/src/commonMain/composeResources/values-or/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-pa-rPK/strings.xml b/shared/src/commonMain/composeResources/values-pa-rPK/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-pa-rPK/strings.xml +++ b/shared/src/commonMain/composeResources/values-pa-rPK/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-pl/strings.xml b/shared/src/commonMain/composeResources/values-pl/strings.xml index 93f2c1d86..c6a4809e3 100644 --- a/shared/src/commonMain/composeResources/values-pl/strings.xml +++ b/shared/src/commonMain/composeResources/values-pl/strings.xml @@ -147,4 +147,50 @@ Tunelowanie multimediów zostało domyślnie wyłączone na Twoim urządzeniu, ponieważ wiadomo, że model Twojego urządzenia go nie obsługuje Zawsze używaj obejścia ustawienia powierzchni wyjścia wideo ExoPlayera To obejście zwalnia i ponownie tworzy instancje kodeków wideo, gdy nastąpi zmiana powierzchni, zamiast bezpośrednio ustawiać powierzchnię dla kodeka. Używane już przez ExoPlayera na niektórych urządzeniach z tym problemem, ustawienie to ma wpływ tylko na Androida 6 i nowsze. \n \nWłączenie tej opcji może zapobiec błędom odtwarzania podczas przełączania obecnego odtwarzacza wideo lub przechodzenia na pełny ekran + Pokazuj Zepsuj odtwarzacz + Niestety, coś poszło nie tak + LeakCanary + Zepsuj aplikację + Monitorowanie wycieków pamięci może powodować niestabilność aplikacji podczas zrzutu pamięci + Pokaż wycieki pamięci + Uruchom sprawdzenie nowych strumieni + Pokazuje opcję psucia podczas korzystania z odtwarzacza + Pokazuj oryginalny czas na pozycjach + Utwórz powiadomienie o błędzie + LeakCanary jest niedostępne + Oryginalne teksty z usług będą widoczne w strumieniowanych pozycjach + Zgłaszaj błędy spoza cyklu życia + Wymuś raportowanie niedostarczonych wyjątków Rx poza cyklem życia fragmentu lub aktywności po usunięciu + Pokaż snackbar z błędem + Zgłoś + OK + Pytaj, gdzie pobrać + Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik. \nWłącz systemowy selektor folderów (SAF), jeśli chcesz pobierać pliki na kartę pamięci + Zostaniesz zapytany(-a), gdzie zapisać każdy pobierany plik + Używaj systemowego selektora folderów (SAF) + Storage Access Framework umożliwia pobieranie na kartę pamięci + Począwszy od Androida 10 obsługiwany jest tylko Storage Access Framework + Folder pobierania wideo + Pobrane pliki wideo są przechowywane tutaj + Folder pobierania audio + Pobrane pliki audio są przechowywane tutaj + Dozwolone znaki w nazwach plików + Litery i cyfry + Większość znaków specjalnych + Znak zastępczy + Nieprawidłowe znaki są zastępowane tą wartością + Maksymalna liczba ponownych prób + Maksymalna liczba prób przed anulowaniem pobierania + Przerwij przy sieciach z ograniczonym transferem + Pomocne przy przełączaniu na dane mobilne, chociaż niektóre pobierania nie mogą być wstrzymywane + Ogranicz kolejkę pobierania + Tylko jedno pobieranie zostanie uruchomione w tym samym czasie + Błąd + Brak takiego folderu + Zdefiniuj folder zapisywania później w ustawieniach + Pamięć zewnętrzna niedostępna + Pobieranie na kartę pamięci nie jest możliwe. Zresetować lokalizację folderu zapisywania? + Na twoim urządzeniu nie ma aplikacji, która mogłaby to otworzyć + Nie znaleziono odpowiedniego menedżera plików dla tej akcji.\nZainstaluj menedżer plików lub spróbuj wyłączyć „%1$s” w ustawieniach pobierania + Nie znaleziono odpowiedniego menedżera plików dla tej akcji. \nZainstaluj menedżer plików zgodny z Storage Access Framework diff --git a/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml b/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml index a93cbf605..89491c7be 100644 --- a/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -146,4 +146,20 @@ O tunelamento de mídia foi desativado por padrão no seu dispositivo porque sabe-se que o modelo do seu dispositivo não é compatível. Sempre usar solução alternativa de configuração de superfície de saída de vídeo do ExoPlayer Esta solução alternativa libera e reinstancia codecs de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície diretamente para o codec. Já usada pelo ExoPlayer em alguns dispositivos com esse problema, essa configuração só tem efeito no Android 6 e superior\n\nAtivar esta opção pode evitar erros de reprodução ao mudar o player de vídeo atual ou mudar para tela cheia + Configurações de depuração + O monitoramento de vazamento de memória pode fazer com que o aplicativo pare de responder durante o despejo de heap + LeakCanary não está disponível + Mostrar vazamentos de memória + Relatar erros fora do ciclo de vida + Forçar relatórios de exceções Rx não entregues fora do fragmento ou do ciclo de vida da atividade após o descarte + Mostrar o tempo atrás original nos itens + Os textos originais dos serviços ficarão visíveis nos itens do stream + Mostrar Travamento no player + Mostra uma opção de travamento ao usar o player + Executar verificação de novos streams + Travar o aplicativo + Mostrar uma barra de erro + Criar uma notificação de erro + Desculpe, algo deu errado. + Reportar diff --git a/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml b/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml index 93b1a310d..dd933eed3 100644 --- a/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt-rPT/strings.xml @@ -146,4 +146,20 @@ Sempre usar solução alternativa de configuração de superfície de saída de vídeo do ExoPlayer Esta solução alternativa libera e reinstancia codecs de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície diretamente para o codec. Já usada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior\n\nAtivar esta opção pode evitar erros de reprodução ao mudar o player de vídeo atual ou mudar para ecrã cheio Reprodutor + Mostrar travamento no reprodutor + Desculpe mas algo correu mal. + Configurações de depuração + Travar a app + O monitoramento de vazamento de memória pode fazer com que a app pare de responder durante o despejo de heap + Mostrar vazamentos de memória + Executar verificação de novas transmissões + Mostra uma opção de travamento ao usar o reprodutor + Mostrar o tempo desde o original nos elementos + Criar uma notificação de erro + LeakCanary não está disponível + Os textos originais dos serviços ficarão visíveis nos elementos de transmissão + Relatar erros fora do ciclo de vida + Forçar relatórios de exceções Rx não entregues fora do fragmento ou do ciclo de vida da atividade após o descarte + Mostrar uma barra de erro + Reportar diff --git a/shared/src/commonMain/composeResources/values-pt/strings.xml b/shared/src/commonMain/composeResources/values-pt/strings.xml index 52e90ed88..642b195c0 100644 --- a/shared/src/commonMain/composeResources/values-pt/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt/strings.xml @@ -39,4 +39,127 @@ Backup e restauração Depuração Reprodutor + Mostrar travamento no reprodutor + Desculpe mas algo correu mal. + Configurações de depuração + Travar a app + O monitoramento de vazamento de memória pode fazer com que a app pare de responder durante o despejo de heap + Mostrar vazamentos de memória + Executar verificação de novas transmissões + Mostra uma opção de travamento ao usar o reprodutor + Mostrar o tempo desde o original nos elementos + Criar uma notificação de erro + LeakCanary não está disponível + Os textos originais dos serviços ficarão visíveis nos elementos de transmissão + Relatar erros fora do ciclo de vida + Forçar relatórios de exceções Rx não entregues fora do fragmento ou do ciclo de vida da atividade após o descarte + Mostrar uma barra de erro + Reportar + Pedir confirmação antes de limpar uma fila + Mostrar informações + Mostrar opção Reproduzir com Kodi + Mostrar dica ao pressionar no fundo ou botão pop-up nos pormenores do vídeo: + Reprodução automática + Ação padrão ao abrir conteúdo — %1$s + Ação 'abrir' preferida + Minimizar para reprodutor pop-up + Player em segundo plano + Lembrar das propriedades do pop-up + Modo tablet + Visualização em miniatura da barra de busca + Usar busca rápida não exata + Volume + Baixa qualidade (menor) + Mostrar resoluções mais altas + Preto + Usar recurso de fallback do decodificador do ExoPlayer + Sim + Tema noturno + Escuro + Nenhum + Continuar a encerrar a fila de reprodução (sem repetição) a anexar um fluxo relacionado + Gerir algumas configurações do ExoPlayer. Estas mudanças exigem a reinicialização do reprodutor para entrarem em vigor + Apenas alguns dispositivos podem reproduzir vídeos 2K/4K + Posição das guias principais + Usar reprodutor de áudio externo + + %1$d segundo + %1$d segundos + %1$d segundos + + Retomar reprodução + Não + Enfileirar + Adicionar à playlist + Não mostrar + Remove áudio em algumas resoluções + Alta qualidade (maior) + Pode selecionar o seu tema noturno favorito abaixo + Ative esta opção se tiver problemas de inicialização do decodificador, que retornarão para decodificadores de prioridade mais baixa se a inicialização dos decodificadores primários falhar. Isto pode resultar num desempenho de reprodução ruim do que ao usar decodificadores primários + Ação do gesto direito + Sempre usar solução alternativa de configuração de superfície de saída de vídeo do ExoPlayer + O tunelamento de média foi desativado por padrão no seu dispositivo porque sabe-se que o modelo do seu dispositivo não é compatível. + Esta solução alternativa libera e reinstancia codecs de vídeo quando ocorre uma alteração de superfície, em vez de definir a superfície diretamente para o codec. Já usada pelo ExoPlayer em alguns dispositivos com este problema, esta configuração só tem efeito no Android 6 e superior\n\nAtivar esta opção pode evitar erros de reprodução ao mudar o player de vídeo atual ou mudar para ecrã cheio + Claro + Esta opção só está disponível se %1$s estiver selecionado como Tema + Resolução padrão do pop-up + Legendas + Selecionar faixa de áudio original independentemente do idioma + A busca não exata permite ao player buscar posições mais rapidamente com precisão reduzida. Buscar por 5, 15 ou 25 segundos não funciona com isto + Descarregar + Resolução padrão + Mudar de um player para outro pode substituir a sua fila + Formato de vídeo padrão + Lembrar do último tamanho e posição do pop-up + Nenhum + Automático (tema do dispositivo) + Modifique a escala do texto da legenda do player e os estilos de fundo. Requer reinicialização da app para entrar em vigor + Sempre + Selecionar faixa de áudio com descrições para pessoas com deficiência visual, se disponível + Sem limite + Ação do gesto esquerdo + Cancelar + Preferir áudio descritivo + Iniciar reprodução automaticamente — %1$s + Player pop-up + Continuar a reproduzir após interrupções (por exemplo, ligações) + Alterar tamanho do intervalo de carregamento em conteúdos progressivos (atualmente %1$s). Um valor mais baixo pode acelerar o carregamento inicial + Preferir áudio original + Somente no Wi-Fi + Modo de visualização de lista + Iniciar reprodutor principal em ecrã cheio + Minimizar na troca da app + Duração da busca de avanço/retrocesso rápido + Lista + Ação ao mudar para outra app a partir do reprodutor de vídeo principal — %1$s + Desativa o tunelamento de média se tiver um ecrã preto ou interrupções na reprodução do vídeo. + Automático + Melhor resolução + Grade + Escolha o gesto para a metade direita do ecrã do reprodutor + Formato de áudio padrão + Mover seletor da guia principal para baixo + Exibir uma opção para reproduzir um vídeo através do centro de média Kodi + Padrão do ExoPlayer + Útil, por exemplo, se usar auscultadores com botões físicos quebrados + Cartão + Nunca + Usar player de vídeo externo + Tamanho do intervalo de carregamento de reprodução + Comportamento + Enfileirar automaticamente o próximo stream + Selecione o seu tema noturno favorito — %1$s + Não iniciar vídeos no minireprodutor, mas mudar diretamente para o modo de ecrã inteiro, se a rotação automática estiver bloqueada. Ainda pode aceder o minireprodutor a sair do ecrã inteiro + Minimizar para reprodutor em segundo plano + Mostrar dica Segure para enfileirar + Limitar resolução ao usar dados móveis + Configurações do ExoPlayer + Devido a restrições do ExoPlayer, a duração da busca foi definida para %1$d segundos + Brilho + Desativar o tunelamento de média + Ignorar eventos de botão de média de hardware + Tema + Escolha o gesto para a metade esquerda do ecrã do reprodutor + Sempre perguntar + Player de vídeo diff --git a/shared/src/commonMain/composeResources/values-ryu/strings.xml b/shared/src/commonMain/composeResources/values-ryu/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ryu/strings.xml +++ b/shared/src/commonMain/composeResources/values-ryu/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-sc/strings.xml b/shared/src/commonMain/composeResources/values-sc/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-sc/strings.xml +++ b/shared/src/commonMain/composeResources/values-sc/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-si/strings.xml b/shared/src/commonMain/composeResources/values-si/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-si/strings.xml +++ b/shared/src/commonMain/composeResources/values-si/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-sl/strings.xml b/shared/src/commonMain/composeResources/values-sl/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-sl/strings.xml +++ b/shared/src/commonMain/composeResources/values-sl/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-sq/strings.xml b/shared/src/commonMain/composeResources/values-sq/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-sq/strings.xml +++ b/shared/src/commonMain/composeResources/values-sq/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-sr/strings.xml b/shared/src/commonMain/composeResources/values-sr/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-sr/strings.xml +++ b/shared/src/commonMain/composeResources/values-sr/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-sv/strings.xml b/shared/src/commonMain/composeResources/values-sv/strings.xml index 0a0492c60..1af97cfa5 100644 --- a/shared/src/commonMain/composeResources/values-sv/strings.xml +++ b/shared/src/commonMain/composeResources/values-sv/strings.xml @@ -41,14 +41,14 @@ Avbryt Kort Tema - Ljus - Mörk + Ljust + Mörkt Svart - Automatiskt (enhetens förvalda) - Natt-tema + Automatiskt (enhetens tema) + Nattema Välj ditt favorittema för nattläge — %1$s Detta kan bara väljas om %1$s väljs som tema - Välj ditt favorittema för nattläge nedan + Välj det nattema du föredrar nedan Visa tips för \\"Håll för att köa\\" Visa tips när du trycker på bakgrunds- eller popup-knappen i videons \\"Detaljer:\\" Surfplatteläge @@ -58,8 +58,19 @@ Av Lista Rutnät - Ändra spelarens textstorlek och bakgrundsstil. Appen måste startas om innan ändringarna börjar gälla + Ändra undertexternas storlek och bakgrundsstil. Appen måste startas om innan ändringarna börjar gälla Huvudflikarnas position Flytta huvudflikarna längst ned - Auto + Automatiskt + Standardupplösning för popupfönster + Ignorera fysiska medieknappar + Fortsätt uppspelningen när kön tar slut genom att lägga till en relaterad ström, om upprepning är avstängd + Fortsätt uppspelningen efter avbrott (t.ex. telefonsamtal) + Spela upp automatiskt + Popupspelare + Sök efter nya strömmar + Minimera vid byte av app + Minimera till popupspelare + Förhandsvisning i tidslinjen + Denna lösning frigör och skapar om videokodekar när videoytan ändras, i stället för att ställa in ytan direkt i kodeken. ExoPlayer använder redan detta på vissa enheter med det här problemet, så inställningen har bara effekt på Android 6 och senare.\n\nOm du aktiverar alternativet kan det förhindra uppspelningsfel när du byter videospelare eller växlar till helskärm diff --git a/shared/src/commonMain/composeResources/values-sw/strings.xml b/shared/src/commonMain/composeResources/values-sw/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-sw/strings.xml +++ b/shared/src/commonMain/composeResources/values-sw/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ta/strings.xml b/shared/src/commonMain/composeResources/values-ta/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ta/strings.xml +++ b/shared/src/commonMain/composeResources/values-ta/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-te/strings.xml b/shared/src/commonMain/composeResources/values-te/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-te/strings.xml +++ b/shared/src/commonMain/composeResources/values-te/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-th/strings.xml b/shared/src/commonMain/composeResources/values-th/strings.xml index 21b79fa3f..061cc3cad 100644 --- a/shared/src/commonMain/composeResources/values-th/strings.xml +++ b/shared/src/commonMain/composeResources/values-th/strings.xml @@ -38,4 +38,16 @@ อัปเดต สำรองข้อมูลและกู้คืน Debug + ธีม + สว่าง + มืด + ดำ + อัตโนมัติ (ตามธีมของอุปกรณ์) + ธีมมืด + เลือกธีมมืดที่คุณชอบ — %1$s + ตัวเลือกนี้ใช้ได้เฉพาะเมื่อธีมเป็น %1$s เท่านั้น + คุณสามารถเลือกธีมมืดที่ต้องการได้ด้านล่าง + โหมดแท็บเล็ต + โหมดมุมมองรายการ + คำบรรยาย diff --git a/shared/src/commonMain/composeResources/values-ti/strings.xml b/shared/src/commonMain/composeResources/values-ti/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ti/strings.xml +++ b/shared/src/commonMain/composeResources/values-ti/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-tl/strings.xml b/shared/src/commonMain/composeResources/values-tl/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-tl/strings.xml +++ b/shared/src/commonMain/composeResources/values-tl/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-tok/strings.xml b/shared/src/commonMain/composeResources/values-tok/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-tok/strings.xml +++ b/shared/src/commonMain/composeResources/values-tok/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-tt/strings.xml b/shared/src/commonMain/composeResources/values-tt/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-tt/strings.xml +++ b/shared/src/commonMain/composeResources/values-tt/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-tzm/strings.xml b/shared/src/commonMain/composeResources/values-tzm/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-tzm/strings.xml +++ b/shared/src/commonMain/composeResources/values-tzm/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-und/strings.xml b/shared/src/commonMain/composeResources/values-und/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-und/strings.xml +++ b/shared/src/commonMain/composeResources/values-und/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-ur/strings.xml b/shared/src/commonMain/composeResources/values-ur/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-ur/strings.xml +++ b/shared/src/commonMain/composeResources/values-ur/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + diff --git a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml index 163643d46..c8990e918 100644 --- a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -144,4 +144,50 @@ 媒体隧道在你的设备上默认禁用,因为已知你的设备型号不支持它。 始终使用 ExoPlayer 的视频输出操作台设置变通解决方法 这个变通解决办法在发生操作台变化时释放并重新初始化视频编解码器,而不是直接将操作台设为编解码器。ExoPlayer 已经在一些有这个问题的设备上使用该方法,该设置仅在 Android 6 及更高版本上有效。\n\n启用该选项可在切换当前视频播放器或切换至全屏时防止播放错误 + LeakCanary + 内存泄露监测可能导致应用在堆栈转储时变得无响应 + LeakCanary 不可用 + 显示内存泄露 + 报告生命周期外错误 + 在处置后强制报告片段或活动外的接收异常 + 显示项目的原始距今时间 + 在串流项目中可以看到服务的原始文本 + 播放器显示崩溃选项 + 使用播放器时显示崩溃选项 + 运行新串流检查 + 让应用崩溃 + 显示错误提示栏 + 创建错误通知 + 抱歉,出错了。 + 报告 + 好 + 询问下载到哪里 + 应用会询问在哪里保存每个下载。\n如果想下载到外部 SD 卡,请启用系统文件夹选择器(SAF) + 会询问每个下载保存到哪里 + 使用系统文件夹选择器(SAF) + “存储访问框架”允许下载到外部 SD 卡 + 从 Android 10 起只支持“存储访问框架” + 视频下载文件夹 + 下载的视频文件存储在这里 + 音频下载文件夹 + 下载的音频文件存储在这里 + 文件名中允许的字符 + 字母和数字 + 多数特殊字符 + 替换字符 + 这个值将替换无效字符 + 最大重试次数 + 取消下载前的最多尝试几次 + 在按流量计费网络上中断 + 切换到手机流量时有用,尽管一些下载无法被暂停 + 限制下载队列 + 并行下载数为 1 + 错误 + 没有这样的文件夹 + 请稍后在设置中定义一个下载文件夹 + 外部存储不可用 + 无法下载到外部 SD 卡。重置下载文件夹位置? + 设备上没有应用可以打开这个 + 没有找到适合这个操作的文件管理器。\n请安装文件管理器或试着在下载设置中禁用“%1$s” + 没有找到适合这个操作的文件管理器。\n请安装兼容存储访问框架的文件管理器 diff --git a/shared/src/commonMain/composeResources/values-zh-rHK/strings.xml b/shared/src/commonMain/composeResources/values-zh-rHK/strings.xml index 55344e519..4a4cb755f 100644 --- a/shared/src/commonMain/composeResources/values-zh-rHK/strings.xml +++ b/shared/src/commonMain/composeResources/values-zh-rHK/strings.xml @@ -1,3 +1,3 @@ - \ No newline at end of file + From f46290f28ab44fa514bac0a9f0252fd7d2afb66f Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 20 Oct 2026 18:00:13 +0200 Subject: [PATCH 119/155] Update extractor to the latest version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 82de190e1..4b27460b0 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -74,7 +74,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "8443c91bf4276c326f7b33e30a36d88e0ab94cfe" +teamnewpipe-newpipe-extractor = "2f7d9da4ce82248637fdd3f8025086bd345f7fc2" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" # New versions require minSdk 24 From 7436ba1010493515ff1a5f5d60aacdc6168c8500 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Wed, 21 Oct 2026 05:02:52 +0200 Subject: [PATCH 120/155] Translated using Weblate (Azerbaijani) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (Portuguese) Currently translated at 84.5% (159 of 188 strings) Translated using Weblate (Czech) Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (Galician) Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (Polish) Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (German) Currently translated at 95.2% (179 of 188 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (188 of 188 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Portuguese) Currently translated at 98.5% (67 of 68 strings) Translated using Weblate (Galician) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Korean) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Swedish) Currently translated at 44.3% (70 of 158 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Spanish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Update translation files Updated by "Remove blank strings" add-on in Weblate. Update translation files Updated by "Remove blank strings" hook in Weblate. Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Portuguese) Currently translated at 98.5% (67 of 68 strings) Translated using Weblate (Haitian) Currently translated at 1.4% (11 of 778 strings) Translated using Weblate (Haitian) Currently translated at 10.7% (17 of 158 strings) Translated using Weblate (Montenegrin) Currently translated at 2.3% (18 of 778 strings) Translated using Weblate (Montenegrin) Currently translated at 12.0% (19 of 158 strings) Translated using Weblate (Lombard) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Lombard) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (ryu (generated) (ryu)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (ryu (generated) (ryu)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Toki Pona) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Toki Pona) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Undetermined) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Undetermined) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Punjabi (Pakistan)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Punjabi (Pakistan)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Arabic (Libya)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Arabic (Libya)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Berber) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Berber) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 70.2% (111 of 158 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 70.2% (111 of 158 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Acehnese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Acehnese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bambara) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bambara) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bavarian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bavarian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 22.1% (35 of 158 strings) Translated using Weblate (Kabyle) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kabyle) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Latin) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Santali) Currently translated at 1.8% (3 of 158 strings) Translated using Weblate (Santali) Currently translated at 1.8% (3 of 158 strings) Translated using Weblate (Burmese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Burmese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Assamese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Assamese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Sardinian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Sardinian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (N’Ko) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (N’Ko) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tagalog) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tagalog) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Urdu) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Urdu) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Slovenian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Slovenian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kurdish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Sinhala) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Sinhala) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Slovak) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Kannada) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kannada) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Korean) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Korean) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Albanian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Albanian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Serbian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Serbian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kazakh) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Kazakh) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Georgian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Georgian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Finnish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Finnish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Swedish) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (French) Currently translated at 37.9% (60 of 158 strings) Translated using Weblate (French) Currently translated at 37.9% (60 of 158 strings) Translated using Weblate (French) Currently translated at 37.9% (60 of 158 strings) Translated using Weblate (Somali) Currently translated at 16.4% (26 of 158 strings) Translated using Weblate (Spanish) Currently translated at 26.5% (42 of 158 strings) Translated using Weblate (Neapolitan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Neapolitan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Nepali) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Nepali) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Dutch) Currently translated at 13.9% (22 of 158 strings) Translated using Weblate (Bengali (India)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bengali (India)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Indonesian) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Interlingua) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Interlingua) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Arabic) Currently translated at 88.6% (140 of 158 strings) Translated using Weblate (Swahili) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Swahili) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Afrikaans) Currently translated at 38.6% (61 of 158 strings) Translated using Weblate (Afrikaans) Currently translated at 38.6% (61 of 158 strings) Translated using Weblate (Marathi) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Marathi) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Malay) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Malay) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Macedonian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Macedonian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Mongolian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Mongolian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Malayalam) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Malayalam) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Hebrew) Currently translated at 22.7% (36 of 158 strings) Translated using Weblate (Hindi) Currently translated at 24.6% (39 of 158 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Croatian) Currently translated at 19.6% (31 of 158 strings) Translated using Weblate (Armenian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Armenian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Icelandic) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Vietnamese) Currently translated at 13.2% (21 of 158 strings) Translated using Weblate (Vietnamese) Currently translated at 13.2% (21 of 158 strings) Translated using Weblate (Punjabi) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Welsh) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Welsh) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Catalan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Catalan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Odia) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Odia) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Occitan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Occitan) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Japanese) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Bosnian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bosnian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Breton) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Breton) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Javanese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Javanese) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Asturian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Asturian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Ukrainian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Bulgarian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Belarusian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Bengali) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Bengali) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Romanian) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Russian) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Estonian) Currently translated at 29.1% (46 of 158 strings) Translated using Weblate (Basque) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Basque) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Esperanto) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Esperanto) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Greek) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Greek) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Danish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Danish) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tamil) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tamil) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Filipino) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (German) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Persian) Currently translated at 30.3% (48 of 158 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Portuguese) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.4% (774 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Filipino) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Telugu) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Telugu) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tigrinya) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tigrinya) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Thai) Currently translated at 31.0% (49 of 158 strings) Translated using Weblate (Lithuanian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Lithuanian) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Latvian) Currently translated at 24.0% (38 of 158 strings) Translated using Weblate (Turkish) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Tatar) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Tatar) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Galician) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Gujarati) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Gujarati) Currently translated at 0.0% (0 of 158 strings) Translated using Weblate (Italian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (Italian) Currently translated at 37.3% (59 of 158 strings) Translated using Weblate (German) Currently translated at 89.8% (142 of 158 strings) Translated using Weblate (Persian) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Persian) Currently translated at 23.4% (37 of 158 strings) Translated using Weblate (Polish) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Polish) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Lombard) Currently translated at 4.8% (38 of 778 strings) Translated using Weblate (Breton) Currently translated at 12.9% (101 of 778 strings) Translated using Weblate (Breton) Currently translated at 12.9% (101 of 778 strings) Translated using Weblate (Welsh) Currently translated at 0.1% (1 of 778 strings) Translated using Weblate (Tatar) Currently translated at 6.1% (48 of 778 strings) Translated using Weblate (Mongolian) Currently translated at 5.2% (41 of 778 strings) Translated using Weblate (Burmese) Currently translated at 2.8% (22 of 778 strings) Translated using Weblate (Toki Pona) Currently translated at 5.9% (46 of 778 strings) Translated using Weblate (Toki Pona) Currently translated at 5.9% (46 of 778 strings) Translated using Weblate (ryu (generated) (ryu)) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (ryu (generated) (ryu)) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Tigrinya) Currently translated at 21.4% (167 of 778 strings) Translated using Weblate (Kannada) Currently translated at 5.5% (43 of 778 strings) Translated using Weblate (N’Ko) Currently translated at 83.9% (653 of 778 strings) Translated using Weblate (N’Ko) Currently translated at 83.9% (653 of 778 strings) Translated using Weblate (Bambara) Currently translated at 0.2% (2 of 778 strings) Translated using Weblate (Assamese) Currently translated at 11.9% (93 of 778 strings) Translated using Weblate (Assamese) Currently translated at 11.9% (93 of 778 strings) Translated using Weblate (Assamese) Currently translated at 11.9% (93 of 778 strings) Translated using Weblate (Assamese) Currently translated at 11.9% (93 of 778 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 19.0% (148 of 778 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 19.0% (148 of 778 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 19.0% (148 of 778 strings) Translated using Weblate (Norwegian Nynorsk) Currently translated at 19.0% (148 of 778 strings) Translated using Weblate (Georgian) Currently translated at 94.4% (735 of 778 strings) Translated using Weblate (Georgian) Currently translated at 94.4% (735 of 778 strings) Translated using Weblate (Georgian) Currently translated at 94.4% (735 of 778 strings) Translated using Weblate (Kazakh) Currently translated at 0.6% (5 of 778 strings) Translated using Weblate (Kazakh) Currently translated at 0.6% (5 of 778 strings) Translated using Weblate (Kazakh) Currently translated at 0.6% (5 of 778 strings) Translated using Weblate (Kazakh) Currently translated at 0.6% (5 of 778 strings) Translated using Weblate (Punjabi (Pakistan)) Currently translated at 16.0% (125 of 778 strings) Translated using Weblate (Punjabi (Pakistan)) Currently translated at 16.0% (125 of 778 strings) Translated using Weblate (Undetermined) Currently translated at 16.9% (132 of 778 strings) Translated using Weblate (Undetermined) Currently translated at 16.9% (132 of 778 strings) Translated using Weblate (Undetermined) Currently translated at 16.9% (132 of 778 strings) Translated using Weblate (Icelandic) Currently translated at 98.7% (768 of 778 strings) Translated using Weblate (Icelandic) Currently translated at 98.7% (768 of 778 strings) Translated using Weblate (Icelandic) Currently translated at 98.7% (768 of 778 strings) Translated using Weblate (Icelandic) Currently translated at 98.7% (768 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Tagalog) Currently translated at 7.7% (60 of 778 strings) Translated using Weblate (Bosnian) Currently translated at 97.5% (759 of 778 strings) Translated using Weblate (Bosnian) Currently translated at 97.5% (759 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Gujarati) Currently translated at 10.7% (84 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Bavarian) Currently translated at 3.7% (29 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Marathi) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Dutch (Middle)) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Latin) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Sinhala) Currently translated at 3.9% (31 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Kurdish (Kurmanji)) Currently translated at 61.4% (478 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Swahili) Currently translated at 4.1% (32 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Latvian) Currently translated at 97.4% (758 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Somali) Currently translated at 72.6% (565 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (Uzbek (Latin script)) Currently translated at 58.2% (453 of 778 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 99.3% (773 of 778 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 99.3% (773 of 778 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 99.3% (773 of 778 strings) Translated using Weblate (English (United Kingdom)) Currently translated at 99.3% (773 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Odia) Currently translated at 93.3% (726 of 778 strings) Translated using Weblate (Santali) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Santali) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Santali) Currently translated at 14.5% (113 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Tamazight (Central Atlas)) Currently translated at 18.2% (142 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Neapolitan) Currently translated at 4.3% (34 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Bengali) Currently translated at 72.7% (566 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Berber) Currently translated at 11.8% (92 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese (Portugal)) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Sardinian) Currently translated at 95.8% (746 of 778 strings) Translated using Weblate (Sardinian) Currently translated at 95.8% (746 of 778 strings) Translated using Weblate (Sardinian) Currently translated at 95.8% (746 of 778 strings) Translated using Weblate (Sardinian) Currently translated at 95.8% (746 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Afrikaans) Currently translated at 7.1% (56 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Bengali (India)) Currently translated at 38.5% (300 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Kurdish (Sorani)) Currently translated at 78.7% (613 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Javanese) Currently translated at 4.7% (37 of 778 strings) Translated using Weblate (Arabic (Libya)) Currently translated at 91.5% (712 of 778 strings) Translated using Weblate (Arabic (Libya)) Currently translated at 91.5% (712 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Kabyle) Currently translated at 27.5% (214 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Malayalam) Currently translated at 71.4% (556 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Acehnese) Currently translated at 1.7% (14 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Occitan) Currently translated at 6.5% (51 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Interlingua) Currently translated at 30.5% (238 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Filipino) Currently translated at 29.9% (233 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Nepali) Currently translated at 55.2% (430 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Danish) Currently translated at 97.0% (755 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Malay) Currently translated at 57.7% (449 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Belarusian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Norwegian Bokmål) Currently translated at 88.4% (688 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Estonian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Punjabi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Albanian) Currently translated at 74.9% (583 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Dutch (Belgium)) Currently translated at 72.1% (561 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Urdu) Currently translated at 65.0% (506 of 778 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Catalan) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Kurdish) Currently translated at 59.8% (466 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Macedonian) Currently translated at 75.4% (587 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Bulgarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Tamil) Currently translated at 94.0% (732 of 778 strings) Translated using Weblate (Tamil) Currently translated at 94.0% (732 of 778 strings) Translated using Weblate (Tamil) Currently translated at 94.0% (732 of 778 strings) Translated using Weblate (Tamil) Currently translated at 94.0% (732 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Telugu) Currently translated at 54.4% (424 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hindi) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Finnish) Currently translated at 92.2% (718 of 778 strings) Translated using Weblate (Croatian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Croatian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Croatian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Croatian) Currently translated at 99.8% (777 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Vietnamese) Currently translated at 98.3% (765 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Lithuanian) Currently translated at 96.9% (754 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Hebrew) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Armenian) Currently translated at 31.1% (242 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Bengali (Bangladesh)) Currently translated at 52.1% (406 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Traditional Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Asturian) Currently translated at 59.5% (463 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Persian) Currently translated at 99.2% (772 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Esperanto) Currently translated at 66.9% (521 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Slovak) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Romanian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Greek) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 93.1% (725 of 778 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 93.1% (725 of 778 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 93.1% (725 of 778 strings) Translated using Weblate (Chinese (Traditional Han script, Hong Kong)) Currently translated at 93.1% (725 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Basque) Currently translated at 97.8% (761 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Slovenian) Currently translated at 52.0% (405 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Portuguese) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Italian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Japanese) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Russian) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Serbian) Currently translated at 98.9% (770 of 778 strings) Translated using Weblate (Serbian) Currently translated at 98.9% (770 of 778 strings) Translated using Weblate (Serbian) Currently translated at 98.9% (770 of 778 strings) Translated using Weblate (Serbian) Currently translated at 98.9% (770 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Dutch) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Spanish) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (158 of 158 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Czech) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Galician) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Arabic) Currently translated at 98.5% (140 of 142 strings) Translated using Weblate (Czech) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Galician) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Galician) Currently translated at 100.0% (96 of 96 strings) Translated using Weblate (Galician) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Arabic) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Swedish) Currently translated at 2.9% (2 of 68 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (68 of 68 strings) Translated using Weblate (Indonesian) Currently translated at 78.8% (112 of 142 strings) Translated using Weblate (Galician) Currently translated at 26.0% (37 of 142 strings) Translated using Weblate (Galician) Currently translated at 99.7% (776 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Indonesian) Currently translated at 51.4% (35 of 68 strings) Translated using Weblate (Indonesian) Currently translated at 50.0% (34 of 68 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (142 of 142 strings) Translated using Weblate (Hungarian) Currently translated at 100.0% (778 of 778 strings) Added translation using Weblate (Norwegian Bokmål) Added translation using Weblate (Lombard) Added translation using Weblate (Montenegrin) Added translation using Weblate (Toki Pona) Added translation using Weblate (Undetermined) Added translation using Weblate (Dutch (Middle)) Added translation using Weblate (Punjabi (Pakistan)) Added translation using Weblate (Arabic (Libya)) Added translation using Weblate (Berber) Added translation using Weblate (Tamazight (Central Atlas)) Added translation using Weblate (Acehnese) Added translation using Weblate (Kurdish (Kurmanji)) Added translation using Weblate (Bambara) Added translation using Weblate (Bavarian) Added translation using Weblate (Bengali (Bangladesh)) Added translation using Weblate (Kabyle) Added translation using Weblate (Uzbek (Latin script)) Added translation using Weblate (Latin) Added translation using Weblate (Chinese (Simplified Han script)) Added translation using Weblate (Santali) Added translation using Weblate (Burmese) Added translation using Weblate (Sardinian) Added translation using Weblate (Haitian) Added translation using Weblate (N’Ko) Added translation using Weblate (Tagalog) Added translation using Weblate (Dutch (Belgium)) Added translation using Weblate (Kurdish (Sorani)) Added translation using Weblate (Portuguese (Portugal)) Added translation using Weblate (Urdu) Added translation using Weblate (Slovenian) Added translation using Weblate (Kurdish) Added translation using Weblate (Sinhala) Added translation using Weblate (Slovak) Added translation using Weblate (Kannada) Added translation using Weblate (Albanian) Added translation using Weblate (Kazakh) Added translation using Weblate (Georgian) Added translation using Weblate (Finnish) Added translation using Weblate (Persian) Added translation using Weblate (Swedish) Added translation using Weblate (Neapolitan) Added translation using Weblate (Nepali) Added translation using Weblate (Norwegian Nynorsk) Added translation using Weblate (Dutch) Added translation using Weblate (Bengali (India)) Added translation using Weblate (Indonesian) Added translation using Weblate (Azerbaijani) Added translation using Weblate (Interlingua) Added translation using Weblate (Swahili) Added translation using Weblate (Afrikaans) Added translation using Weblate (Marathi) Added translation using Weblate (Malay) Added translation using Weblate (Macedonian) Added translation using Weblate (Mongolian) Added translation using Weblate (Malayalam) Added translation using Weblate (Hebrew) Added translation using Weblate (Hungarian) Added translation using Weblate (Croatian) Added translation using Weblate (Armenian) Added translation using Weblate (English (United Kingdom)) Added translation using Weblate (Icelandic) Added translation using Weblate (Vietnamese) Added translation using Weblate (Portuguese) Added translation using Weblate (Czech) Added translation using Weblate (Welsh) Added translation using Weblate (Catalan) Added translation using Weblate (Odia) Added translation using Weblate (Occitan) Added translation using Weblate (Bosnian) Added translation using Weblate (Breton) Added translation using Weblate (Javanese) Added translation using Weblate (Asturian) Added translation using Weblate (Ukrainian) Added translation using Weblate (Bulgarian) Added translation using Weblate (Belarusian) Added translation using Weblate (Bengali) Added translation using Weblate (Estonian) Added translation using Weblate (Basque) Added translation using Weblate (Esperanto) Added translation using Weblate (Greek) Added translation using Weblate (Danish) Added translation using Weblate (Chinese (Traditional Han script, Hong Kong)) Added translation using Weblate (Tamil) Added translation using Weblate (Filipino) Added translation using Weblate (Telugu) Added translation using Weblate (Tigrinya) Added translation using Weblate (Thai) Added translation using Weblate (Lithuanian) Added translation using Weblate (Latvian) Added translation using Weblate (Tatar) Added translation using Weblate (Galician) Added translation using Weblate (Gujarati) Translated using Weblate (Thai) Currently translated at 34.5% (49 of 142 strings) Translated using Weblate (Thai) Currently translated at 40.8% (318 of 778 strings) Update translation files Updated by "Cleanup translation files" add-on in Weblate. Co-authored-by: /dev/urandom Co-authored-by: 01QueN10 <01quen10@users.noreply.hosted.weblate.org> Co-authored-by: 09pulse <09pulse@users.noreply.hosted.weblate.org> Co-authored-by: 2-Seol <2-seol@users.noreply.hosted.weblate.org> Co-authored-by: A Co-authored-by: AP Co-authored-by: Aarjav Parashar Co-authored-by: Aayush Gupta Co-authored-by: Abanoub Sameh Co-authored-by: Adolfo Jayme Barrientos Co-authored-by: Agnieszka C Co-authored-by: AhHyeon An Co-authored-by: Ahmad Firdaus Co-authored-by: Aidos Co-authored-by: AioiLight Co-authored-by: Aitor Salaberria Co-authored-by: Ajeje Brazorf Co-authored-by: Alex25820 Co-authored-by: Ali Demirtas Co-authored-by: Allan Nordhøy Co-authored-by: Andreas Westrell Co-authored-by: Andrij Mizyk Co-authored-by: Anonymous Co-authored-by: Anton Shestakov Co-authored-by: Antony Co-authored-by: Anxhelo Lushka Co-authored-by: Anže Končan Co-authored-by: Archi Co-authored-by: Arif Budiman Co-authored-by: AudricV Co-authored-by: Aurelian Ciocîltan Co-authored-by: Azizov Aga Co-authored-by: Azwaw Co-authored-by: Bakary Kaba Co-authored-by: Balázs Meskó Co-authored-by: Ben De Meester Co-authored-by: Benedikt Freisen Co-authored-by: BenjaminForster Co-authored-by: BennyBeat Co-authored-by: Berkay Gündüz Co-authored-by: Bert Co-authored-by: Bjorn Roesbeke Co-authored-by: Blaise Pascal Co-authored-by: Bob Co-authored-by: Bopol Co-authored-by: Bruno Gusmão Co-authored-by: Bruno Tendler Co-authored-by: ButterflyOfFire Co-authored-by: C. Rüdinger Co-authored-by: Caetano Demián Moreno Co-authored-by: Chitraarasu.k Co-authored-by: Chris Co-authored-by: Cipisek Rumcajsu Co-authored-by: Comrade KVRONV Co-authored-by: Czech Translator Co-authored-by: D D Co-authored-by: DPap Co-authored-by: Dan Co-authored-by: DanLo Co-authored-by: Danial Behzadi Co-authored-by: Daniel Co-authored-by: Daniel Rozario Co-authored-by: Daria Szatan Co-authored-by: Darko Ristovski Co-authored-by: David Kovács Co-authored-by: David Rebolo Magariños Co-authored-by: Davit Mayilyan Co-authored-by: Dayongdo Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Deleted User Co-authored-by: Digiwizkid Co-authored-by: Domokun Co-authored-by: Drugi Sapog Co-authored-by: Dual Natan Co-authored-by: Duppadaadadii Co-authored-by: ERYpTION Co-authored-by: Edward Co-authored-by: Edward Thomson Co-authored-by: Emil Tang Kristensen Co-authored-by: Emin Tufan Çetin Co-authored-by: Enol P. Co-authored-by: Femini Co-authored-by: Filip Marek Co-authored-by: Fjuro Co-authored-by: Flo P Co-authored-by: Florin Voicu Co-authored-by: Francesco Saltori Co-authored-by: Franco Co-authored-by: GET100PERCENT Co-authored-by: Ghost of Sparta Co-authored-by: GobinathAL Co-authored-by: Guillem Co-authored-by: Hakim Oubouali Co-authored-by: HardLight Co-authored-by: Hasan Co-authored-by: Heimen Stoffels Co-authored-by: HelaBasa Group (හෙළබස සමූහය) Co-authored-by: Hemanta Sharma Co-authored-by: Hoseok Seo Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Hoàng Lâm Lê Co-authored-by: Ignacy Kajdan Co-authored-by: Igor Nedoboy Co-authored-by: Igor Rückert Co-authored-by: Ihor Hordiichuk Co-authored-by: Inn Charge Co-authored-by: Isak Co-authored-by: Ivan Dekovets Co-authored-by: Ivan Krušlin Co-authored-by: IverCoder Co-authored-by: J. Lavoie Co-authored-by: JS Ahn Co-authored-by: JY3 Co-authored-by: Jalaluddin Co-authored-by: Jani Buni Co-authored-by: Jani Kinnunen Co-authored-by: Jeff Huang Co-authored-by: Jener Gomes Co-authored-by: Jerome Nav Co-authored-by: JoC Co-authored-by: Jonatan Nyberg Co-authored-by: Joseph Kim Co-authored-by: Josu Co-authored-by: Jwtiyar Nariman Co-authored-by: K. Herbert Co-authored-by: Kaantaja Co-authored-by: Karl Tammik Co-authored-by: Kartik Jivane Co-authored-by: Kiss Attila Co-authored-by: Koo Hyomin Co-authored-by: Kornelijus Tvarijanavičius Co-authored-by: Kowith Singkornkeeree Co-authored-by: Kristjan Räts Co-authored-by: Kristoffer Grundström Co-authored-by: Kuko Co-authored-by: L-M-H Co-authored-by: Languages add-on Co-authored-by: Lavin Tom K Abraham Co-authored-by: LiJu09 Co-authored-by: Lim Jia Ming Co-authored-by: Line Co-authored-by: Linerly Co-authored-by: Louis Morel Co-authored-by: Loís B Co-authored-by: M. Ll Co-authored-by: M4SK Co-authored-by: MS-PC Co-authored-by: Maciej Gamrat Co-authored-by: Maday Co-authored-by: MadderRagax Co-authored-by: Mahyuddin Co-authored-by: Manuela Silva Co-authored-by: Marco Santos Co-authored-by: Marcos Chavarría Teijeiro Co-authored-by: Marian Hanzel Co-authored-by: Mario Rossi Co-authored-by: Matej U Co-authored-by: Mathias Hamza Vedsted-Mirza Co-authored-by: Miala Co-authored-by: Michael Moroni Co-authored-by: Mickaël Binos Co-authored-by: Milan Co-authored-by: Milo Ivir Co-authored-by: MohammedSR Vevo Co-authored-by: Mostafa Ahangarha Co-authored-by: Muhammad Sharjeel <3443@users.noreply.hosted.weblate.org> Co-authored-by: Mukhamadjonov Co-authored-by: NEXI Co-authored-by: NTFSynergy Co-authored-by: Nadir Nour Co-authored-by: Naimul Kabir Co-authored-by: Napstaguy04 Co-authored-by: Nathan <02947b5yh@users.noreply.hosted.weblate.org> Co-authored-by: Ngo Lam Bao An Co-authored-by: Nico Guo <83hjpf3s@users.noreply.hosted.weblate.org> Co-authored-by: Nicu Borta Co-authored-by: Nikita Epifanov Co-authored-by: Nikoloz Co-authored-by: Nista <42772160+Nista11@users.noreply.github.com> Co-authored-by: O Passante Co-authored-by: Olexandr Nesterenko Co-authored-by: Olivia Ng Co-authored-by: Omar Macías Molina Co-authored-by: Osoitz Co-authored-by: Oymate Co-authored-by: Oğuz Ersen Co-authored-by: PPNplus Co-authored-by: Pera Petrovic Co-authored-by: Philip Goto Co-authored-by: Pluto Co-authored-by: Prajwol Pradhan Co-authored-by: Prajwol Pradhan Co-authored-by: Prasanta-Hembram Co-authored-by: Praveen0899 Co-authored-by: Prietenii Bunii Co-authored-by: Priit Jõerüüt Co-authored-by: RainSlide Co-authored-by: Random Co-authored-by: Ray Co-authored-by: Rehaz Feddit Co-authored-by: Retrial Co-authored-by: Rex_sa Co-authored-by: Ricardo Co-authored-by: Rijolo Co-authored-by: Riku Co-authored-by: Rom1 Co-authored-by: Rushikesh Panchal Co-authored-by: Ryan Co-authored-by: SC Co-authored-by: Sarfaraz Ahmed Co-authored-by: Sean Minnaert Co-authored-by: SecularSteve Co-authored-by: Sergio Marques Co-authored-by: ShareASmile Co-authored-by: Shifa Graphics Co-authored-by: Sierzh Co-authored-by: Steven Felix Co-authored-by: Subham Jena Co-authored-by: Surfoo Co-authored-by: Sveinn í Felli Co-authored-by: Sérgio Marques Co-authored-by: T1z3n Co-authored-by: THANOS SIOURDAKIS Co-authored-by: TXRdev Archive Co-authored-by: Tari Co-authored-by: Temuri Doghonadze Co-authored-by: Terry Louwers Co-authored-by: Thadah D. Denyse Co-authored-by: ThePsychoBuck Co-authored-by: Theophine Savio Theodore Co-authored-by: Thien Bui <84436@users.noreply.hosted.weblate.org> Co-authored-by: TobiGr Co-authored-by: TotalCaesar659 Co-authored-by: Translator <_translator@users.noreply.hosted.weblate.org> Co-authored-by: Trendyne Co-authored-by: Trần Lê Nhật Huy Co-authored-by: Tấn Lực Trương Co-authored-by: Vasilis K. Co-authored-by: VfBFan Co-authored-by: Ville Rantanen Co-authored-by: Vivek K J Co-authored-by: Vojtěch Šamla Co-authored-by: Vri 🌈 Co-authored-by: W L Co-authored-by: WB Co-authored-by: WaldiS Co-authored-by: Whod Co-authored-by: William Co-authored-by: Wirelessalien <121420261+WirelessAlien@users.noreply.github.com> Co-authored-by: Yago Raña Gayoso Co-authored-by: Yaron Shahrabani Co-authored-by: Yoda Co-authored-by: Zoldtukor Co-authored-by: algimantas Co-authored-by: aqwer-T Co-authored-by: atilluF <110931720+atilluF@users.noreply.github.com> Co-authored-by: bgo-eiu Co-authored-by: bomzhellino Co-authored-by: bowornsin Co-authored-by: bruh Co-authored-by: caltaojihun Co-authored-by: cat Co-authored-by: cedspam Co-authored-by: cehnemdark Co-authored-by: chr56 Co-authored-by: devl Co-authored-by: ditokp Co-authored-by: doodosod Co-authored-by: dyare darbani Co-authored-by: evfjunior Co-authored-by: ezjerry liao Co-authored-by: g Co-authored-by: gamerboy Co-authored-by: gold.ris90 Co-authored-by: gymka Co-authored-by: htet Co-authored-by: j Co-authored-by: justanidea Co-authored-by: justcontributor Co-authored-by: justcontributor Co-authored-by: kaajjo Co-authored-by: komiratsu192 Co-authored-by: kuragehime Co-authored-by: lilium Co-authored-by: martian94 Co-authored-by: minsk21 Co-authored-by: naofum Co-authored-by: nautilusx Co-authored-by: ngocanhtve Co-authored-by: nzgha Co-authored-by: odbsalt Co-authored-by: opusforlife2 Co-authored-by: ozyc Co-authored-by: petlyh <88139840+petlyh@users.noreply.github.com> Co-authored-by: pjammo Co-authored-by: qrynill Co-authored-by: r2308145 Co-authored-by: randomtroller Co-authored-by: retiolus Co-authored-by: rimasx Co-authored-by: shiloni Co-authored-by: simo Co-authored-by: skil3z Co-authored-by: ssantos Co-authored-by: subba raidu Co-authored-by: sudoLife Co-authored-by: tch69 Co-authored-by: uievawkejf Co-authored-by: wb9688 Co-authored-by: whenwesober Co-authored-by: winqooq Co-authored-by: yunna Co-authored-by: zelos-h Co-authored-by: zeritti Co-authored-by: zmni Co-authored-by: Ács Zoltán Co-authored-by: Åzze Co-authored-by: Éfrit Co-authored-by: Óscar Fernández Díaz <42654671+oscfdezdz@users.noreply.github.com> Co-authored-by: Александр Co-authored-by: Егор Ермаков Co-authored-by: Симеон Цветков Co-authored-by: Слободан Симић(Slobodan Simić) Co-authored-by: Юрий Иванович Шмаровский Co-authored-by: мачко Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) Co-authored-by: 모르것다 Co-authored-by: 이정희 Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ace/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/af/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ar_LY/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/as/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ast/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/az/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/be/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ber/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bg/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bm/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bn_BD/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bn_IN/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/br/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/bs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ca/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ckb/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/cnr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/cy/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/da/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/dum/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/el/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/en_GB/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/eo/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/es/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/et/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/eu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fa/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fil/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/gl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/gu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/he/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ht/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/hy/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ia/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/is/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ja/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/jv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ka/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/kab/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/kk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/kmr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/kn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ku/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/la/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/lmo/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/lt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/lv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/mk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ml/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/mn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/mr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ms/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/my/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nap/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nb/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ne/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nl_BE/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/nqo/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/oc/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/or/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pa/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pa_PK/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ro/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ru/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ryu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sat/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sc/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/si/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/so/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sq/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/sw/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ta/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/te/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/th/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ti/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tok/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/tzm/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/und/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/ur/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/uz_Latn/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/vi/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hant_HK/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/gl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/it/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/ar/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/cs/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/gl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/hu/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/id/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/pt/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/pt_PT/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/sv/ Translate-URL: https://hosted.weblate.org/projects/newpipe/readme/zh_Hant/ Translate-URL: https://hosted.weblate.org/projects/newpipe/strings/ Translation: NewPipe/Metadata Translation: NewPipe/README Translation: NewPipe/Strings Translation: NewPipe/compose Signed-off-by: Aayush Gupta --- app/src/main/res/values-az/strings.xml | 6 +-- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-gl/strings.xml | 40 +++++++++---------- app/src/main/res/values-pt/strings.xml | 3 +- .../composeResources/values-az/strings.xml | 30 ++++++++++++++ .../composeResources/values-cs/strings.xml | 30 ++++++++++++++ .../composeResources/values-gl/strings.xml | 30 ++++++++++++++ .../composeResources/values-pt/strings.xml | 1 + 8 files changed, 117 insertions(+), 25 deletions(-) diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 0b8fcd860..a837c14ba 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -208,7 +208,7 @@ Endirmə tarixçəsini təmizlə Endirmələri başlat Endirmələri dayandır - Haraya endiriləcəyini soruş + Haraya yüklənəcəyini soruş Sizdən hər endirmənin harada saxlanılacağı soruşulacaq. \nXarici SD karta endirmək istəyirsinizsə, sistem qovluğu seçicisini (SAF) aktiv edin \'Yaddaş Giriş Quruluşu\' xarici SD karta endirməyə imkan verir Sistem standartı @@ -477,9 +477,9 @@ Bəzi endirmələri dayandırmaq mümkün olmasa da, mobil dataya keçərkən faydalıdır Bağla Fayl silindiyi üçün irəliləyiş itirildi - Endirməni ləğv etməzdən əvvəl ümumi cəhdlərin sayı + Yükləməni ləğv etməzdən əvvəl maksimum cəhdlərin sayı Ölçülmüş şəbəkələrdə dayandır - Endirmə növbəsini məhdudlaşdır + Yükləmə növbəsini məhdudlaşdırın Eyni vaxtda ancaq bir endirmə həyata keçiriləcək Hesab ləğv edildi Yükləmə başladı diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 6c12da0d1..56ac5b1f5 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -557,7 +557,7 @@ Komentáře Zobrazit popis Otevřít s - Na Vašem zařízení není aplikace, která to umí otevřít + Na vašem zařízení se nenachází aplikace, která by tento odkaz dokázala otevřít Podobné položky Vypnout pro skrytí popisu videa a doplňkové informace Shodit aplikaci diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index f4b083cd4..ae5a9d70e 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -30,11 +30,11 @@ Segundo plano Modo popup Engadir a - Cartafol de descargas para os vídeos - Os vídeos descargados están almacenados aquí + Cartafol de descarga de vídeo + Os ficheiros de vídeo descargados almacenaranse aquí Elixa un cartafol de descargas para os vídeos Cartafol de descarga de audio - Os audios descargados están gardados aquí + Os ficheiros de audio descargados almacenaranse aquí Elixa un cartafol para descargar os audios Resolución por defecto Resolución predeterminada da xanela emerxente @@ -133,7 +133,7 @@ Os reprodutores externos non soportan estes tipos de ligazóns Non foi encontrada ningunha emisión de vídeo Non foi encontrada ningunha emisión de audio - Non hai ningún cartafol + Non hai tal cartafol Non hai ningún ficheiro / fonte de contido O ficheiro non existe ou falta permiso para lelo ou escribilo O nome do ficheiro non pode estar baleiro @@ -188,14 +188,14 @@ Toque para ver detalles Por favor, agarde… Copiado para o portarretallos - Selecciona un cartafol de descarga máis tarde na configuración + Por favor, define un cartafol de descargas máis tarde na configuración Esta permisión é necesaria \npara abrir o vídeo no modo «popup» 1 elemento foi eliminado. Desafío reCAPTCHA ReCAPTCHA reto solicitado Descargar - Caracteres permitidos nos nomes de ficheiros - Os caracteres inválidos serán substituídos por este valor + Caracteres permitidos nos nomes de ficheiro + Os caracteres non válidos son substituídos por este valor Carácter de substitución Letras e díxitos A maioría dos caracteres especiais @@ -364,19 +364,19 @@ Sistema predeterminado Lingua do aplicativo Elixir unha instancia - O \'Framework Access Framework\' permite a descarga a unha tarxeta SD externa - Usar selector de cartafois do sistema (SAF) - Preguntaralle onde gardar cada descarga. \nPermita o Sistema de Escolla de Cartafois (SAF) se desexar descarregar para un SD externo - Pregunta onde se descarga + O «Storage Access Framework» permite realizar descargas nunha tarxeta SD externa + Usar o selector de cartafoles do sistema (SAF) + Preguntarase onde gardar cada descarga.\nActiva o selector de cartafoles do sistema (SAF) se queres descargar nunha tarxeta SD externa + Pregunta a onde descargar Parar as descagas Comezar as descargas - Executarase unha descarga ao mesmo tempo + Unha descarga executarase ao mesmo tempo Limitar a cola de descarga Pechar - Útil para cambiar aos datos móbiles, aínda que non se poden suspender algunhas descargas - Interrupción en redes contadas + Útil ao cambiar a datos móbiles, aínda que algunhas descargas non se poden suspender + Interromper en redes con uso medido Número máximo de intentos antes de cancelar a descarga - Reintento máximo + Reintentos máximos Parar Eliminar os ficheiros descargados Quere limpar o seu historial de descargas ou eliminar todos os ficheiros descargados? @@ -458,8 +458,8 @@ Restaurar os valores predeterminados Non se puideron ler as pestanas gardadas, polo que usar as predeterminadas Ficheiro movido ou eliminado - Non é posible descargar na tarxeta SD externa. Restaurar a localización do cartafol de descarga? - Non hai dispoñible almacenamento externo + Non é posible descargar na tarxeta SD externa. Queres restablecer a localización do cartafol de descargas? + Almacenamento externo non dispoñible Elimináronse as posicións de reprodución Eliminas todas as posicións de reprodución? Elimina todas as posicións de reprodución @@ -554,7 +554,7 @@ Seleccione o seu tema escuro favorito — %s Este vídeo só está disponíbel para membros de YouTube Music Premium, polo que non pode ser transmitido nin descarregado polo NewPipe. Este contido é privado, polo que non pode ser transmitido nin descarregado polo NewPipe. - Non posúe ningunha aplicación para abrir isto + Ningunha aplicación do teu dispositivo pode abrir isto Usar miniaturas para a pantalla de bloqueo e para as notificacións Os comentarios están desactivados Mostrar contido potencialmente non apto para menores porque ten unha limitación de idade (como +18) @@ -563,7 +563,7 @@ Provedor Destacado Este contido só está dispoñíbel para usuarios que pagaran por el, así que non pode ser transmitido ou descarregado por NewPipe. - Será preguntado onde desexa gardar cada descarga + Preguntaráselle onde gardar cada descarga Non amosar Baixa calidade (máis pequeno) Alta calidade (máis grande) @@ -616,7 +616,7 @@ Procurar actualizacións Procurar manualmente novas versións A procurar actualizacións… - A partir do Android 10, só o \'Sistema de Acceso ao Almacenamento\' está soportado + A partir de Android 10, só se admite o «Storage Access Framework» Procesando... Pode devagar un momento Crear unha notificación de erro Novos elementos diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index d41002438..e8d1e2922 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -385,7 +385,7 @@ Permitir apenas uma descarga de cada vez Iniciar descargas Pausa nas descargas - Perguntar onde guardar + Perguntar para onde descarregar Ser-lhe-á perguntado onde guardar cada descarga. \nAtive o seletor de pastas do sistema (SAF) se quiser descarregar para um cartão SD externo Utilizar seletor de pastas do sistema (SAF) \'Storage Access Framework\' permite descargas para um cartão SD externo @@ -843,4 +843,5 @@ O NewPipe deixará de apoiar o Android 5 Infelizmente, o NewPipe depende de algumas bibliotecas que terminaram apoio para o Android 5.0 e 5.1. Por isso, a próxima versão do NewPipe só funcionará em dispositivos com Android 6 ou superior, infelizmente. Saiba mais na publicação do blog. Postagem no blog + Cursos diff --git a/shared/src/commonMain/composeResources/values-az/strings.xml b/shared/src/commonMain/composeResources/values-az/strings.xml index 6440907e2..445f0d575 100644 --- a/shared/src/commonMain/composeResources/values-az/strings.xml +++ b/shared/src/commonMain/composeResources/values-az/strings.xml @@ -161,4 +161,34 @@ Utilizasiyadan sonra fraqment və ya fəaliyyətin yaşam dövründən kənarda, çatdırıla bilməyən Rx istisnaları barədə məlumat verməsinə məcbur et Xəta balonu göstər Məlumat Ver + Oldu + Haraya yüklənəcəyini soruş + Sizdən hər endirmənin harada saxlanılacağı soruşulacaq. \nXarici SD karta endirmək istəyirsinizsə, sistem qovluğu seçicisini (SAF) aktiv edin + Sizdən hər endirmənin harada saxlanılacağı soruşulacaq + Sistem qovluğu seçicisini (SAF) istifadə et + 'Yaddaş Giriş Quruluşu' xarici SD karta endirməyə imkan verir + "Yaddaş Giriş Quruluşu"yalnız Android 10'dan başlayaraq dəstəklənir + Video yükləmə qovluğu + Yüklənilmiş video fayllar burada saxlanılır + Səs yükləmə qovluğu + Yüklənilmiş səs faylları burada saxlanılır + Fayl adlarında icazə verilən simvollar + Hərflər və rəqəmlər + Ən xüsusi simvollar + Əvəzedici simvol + Etibarsız simvollar bu dəyərlə əvəz olunur + Maksimum təkrar cəhdlər + Yükləməni ləğv etməzdən əvvəl maksimum cəhdlərin sayı + Ölçülmüş şəbəkələrdə dayandır + Bəzi endirmələri dayandırmaq mümkün olmasa da, mobil dataya keçərkən faydalıdır + Yükləmə növbəsini məhdudlaşdırın + Eyni vaxtda ancaq bir endirmə həyata keçiriləcək + Xəta + Belə qovluq yoxdur + Zəhmət olmasa, endirmə qovluğunu daha sonra tənzimləmələrdə təyin et + Xarici yaddaş əlçatan deyil + Xarici SD karta endirmək mümkün deyil. Endirmə qovluğunun yeri sıfırlansın? + Cihazınızdakı heç bir tətbiq bunu aça bilməz + Bu əməliyyat üçün uyğun fayl meneceri tapılmadı.\nZəhmət olmasa, fayl menecerini quraşdır və ya endirmə tənzimləmələrində '%1$s'-i qeyri-aktiv etməyə çalış + Bu fəaliyyət üçün uyğun fayl meneceri tapılmadı.\nXahiş olunur, Yaddaş Giriş Quruluşuna uyğun fayl meneceri quraşdır diff --git a/shared/src/commonMain/composeResources/values-cs/strings.xml b/shared/src/commonMain/composeResources/values-cs/strings.xml index 0ea80aae4..aee8dc374 100644 --- a/shared/src/commonMain/composeResources/values-cs/strings.xml +++ b/shared/src/commonMain/composeResources/values-cs/strings.xml @@ -163,4 +163,34 @@ Vytvořit chybové oznámení Omlouváme se, něco se pokazilo. Nahlásit + OK + Zeptat se na složku pro stahování + Budete dotázáni, kam jednotlivé soubory uložit. \nAktivujte výběr systémového adresáře (SAF), chcete-li stáhnout soubor na externí SD kartu + Budete dotázáni, kde uložit každý stažený soubor + Použít výběr systémového adresáře (SAF) + „Storage Access Framework“ umožňuje stahovat na externí SD kartu + Počínaje systémem Android 10 je podporován pouze „Storage Access Framework“ + Adresář pro stažená videa + Sem budou ukládána stažená videa + Adresář pro stažené audio + Sem bude ukládáno stažené audio + Povolené znaky v názvech souborů + Písmena a číslice + Většina speciálních znaků + Náhradní znak + Neplatné znaky budou nahrazeny těmito + Maximální počet pokusů o opakování + Maximální počet pokusů před zrušením stahování + Přerušit na mobilních sítích + Užitečné při přepnutí na mobilní data, některá stahování ale nelze přerušit + Omezit frontu stahování + Najednou se bude stahovat pouze jeden soubor + Chyba + Neexistující složka + Určete prosím složku pro stahování později v nastavení + Externí úložiště není k dispozici + Stahování na externí SD kartu není možné. Resetovat umístění složky pro stahování? + Na vašem zařízení se nenachází aplikace, která by tento odkaz dokázala otevřít + Pro tuto akci nebyl nalezen žádný vhodný správce souborů. \nNainstalujte si správce souborů nebo zkuste vypnout „%1$s“ v nastavení stahování + Pro tuto akci nebyl nalezen žádný vhodný správce souborů. \nNainstalujte si správce souborů kompatibilní se Storage Access Framework diff --git a/shared/src/commonMain/composeResources/values-gl/strings.xml b/shared/src/commonMain/composeResources/values-gl/strings.xml index f9f877787..aec930536 100644 --- a/shared/src/commonMain/composeResources/values-gl/strings.xml +++ b/shared/src/commonMain/composeResources/values-gl/strings.xml @@ -161,4 +161,34 @@ Crear unha notificación de erro Desculpe, algo saíu mal. Informe + OK + Pregunta a onde descargar + Preguntarase onde gardar cada descarga.\nActiva o selector de cartafoles do sistema (SAF) se queres descargar nunha tarxeta SD externa + Preguntaráselle onde gardar cada descarga + Usar o selector de cartafoles do sistema (SAF) + O «Storage Access Framework» permite realizar descargas nunha tarxeta SD externa + A partir de Android 10, só se admite o «Storage Access Framework» + Cartafol de descarga de vídeo + Os ficheiros de vídeo descargados almacenaranse aquí + Cartafol de descarga de audio + Os ficheiros de audio descargados almacenaranse aquí + Caracteres permitidos nos nomes de ficheiro + Letras e díxitos + A maioría dos caracteres especiais + Carácter de substitución + Os caracteres non válidos son substituídos por este valor + Reintentos máximos + Número máximo de intentos antes de cancelar a descarga + Interromper en redes con uso medido + Útil ao cambiar a datos móbiles, aínda que algunhas descargas non se poden suspender + Limitar a cola de descarga + Unha descarga executarase ao mesmo tempo + Erro + Non hai tal cartafol + Por favor, define un cartafol de descargas máis tarde na configuración + Almacenamento externo non dispoñible + Non é posible descargar na tarxeta SD externa. Queres restablecer a localización do cartafol de descargas? + Ningunha aplicación do teu dispositivo pode abrir isto + Non se atopou ningún xestor de ficheiros axeitado para esta acción.\nInstale un xestor de ficheiros ou tente desactivar «%1$s» na configuración de descargas + Non se atopou ningún xestor de ficheiros axeitado para esta acción.\nInstale un xestor de ficheiros compatible coa Storage Access Framework diff --git a/shared/src/commonMain/composeResources/values-pt/strings.xml b/shared/src/commonMain/composeResources/values-pt/strings.xml index 642b195c0..762dbcf28 100644 --- a/shared/src/commonMain/composeResources/values-pt/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt/strings.xml @@ -162,4 +162,5 @@ Escolha o gesto para a metade esquerda do ecrã do reprodutor Sempre perguntar Player de vídeo + Perguntar para onde descarregar From 2d1916a4084b5281a117cf0c53b7f029244c850f Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Mon, 12 Oct 2026 18:00:00 +0800 Subject: [PATCH 121/155] [DO NOT MERGE] Migrate room to v3 Ref: - https://developer.android.com/blog/posts/modernizing-the-room - https://developer.android.com/jetpack/androidx/releases/room3 - https://developer.android.com/training/data-storage/room/migration-2-to-3 Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 6 +- .../org/schabi/newpipe/NewPipeDatabase.kt | 22 ++- .../schabi/newpipe/database/AppDatabase.kt | 8 +- .../org/schabi/newpipe/database/BasicDAO.kt | 8 +- .../org/schabi/newpipe/database/Converters.kt | 14 +- .../org/schabi/newpipe/database/Migrations.kt | 165 +++++++++--------- .../newpipe/database/feed/dao/FeedDAO.kt | 15 +- .../newpipe/database/feed/dao/FeedGroupDAO.kt | 15 +- .../newpipe/database/feed/model/FeedEntity.kt | 8 +- .../database/feed/model/FeedGroupEntity.kt | 8 +- .../feed/model/FeedGroupSubscriptionEntity.kt | 8 +- .../feed/model/FeedLastUpdatedEntity.kt | 8 +- .../database/history/dao/SearchHistoryDAO.kt | 7 +- .../database/history/dao/StreamHistoryDAO.kt | 9 +- .../history/model/SearchHistoryEntry.kt | 10 +- .../history/model/StreamHistoryEntity.kt | 10 +- .../history/model/StreamHistoryEntry.kt | 4 +- .../playlist/PlaylistDuplicatesEntry.kt | 2 +- .../playlist/PlaylistMetadataEntry.kt | 2 +- .../database/playlist/PlaylistStreamEntry.kt | 4 +- .../database/playlist/dao/PlaylistDAO.kt | 9 +- .../playlist/dao/PlaylistRemoteDAO.kt | 9 +- .../playlist/dao/PlaylistStreamDAO.kt | 11 +- .../database/playlist/model/PlaylistEntity.kt | 10 +- .../playlist/model/PlaylistRemoteEntity.kt | 10 +- .../playlist/model/PlaylistStreamEntity.kt | 10 +- .../database/stream/StreamStatisticsEntry.kt | 6 +- .../database/stream/StreamWithState.kt | 4 +- .../newpipe/database/stream/dao/StreamDAO.kt | 15 +- .../database/stream/dao/StreamStateDAO.kt | 15 +- .../database/stream/model/StreamEntity.kt | 10 +- .../stream/model/StreamStateEntity.kt | 9 +- .../database/subscription/SubscriptionDAO.kt | 15 +- .../subscription/SubscriptionEntity.kt | 17 +- build.gradle.kts | 1 + gradle/libs.versions.toml | 13 +- 36 files changed, 268 insertions(+), 229 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d9e1e1b8c..538d1fd19 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,6 +14,7 @@ plugins { alias(libs.plugins.jetbrains.kotlinx.serialization) alias(libs.plugins.sonarqube) alias(libs.plugins.about.libraries) + alias(libs.plugins.androidx.room) checkstyle } @@ -140,8 +141,8 @@ configure { } } -ksp { - arg("room.schemaLocation", "$projectDir/schemas") +room3 { + schemaDirectory("$projectDir/schemas") } // Custom dependency configuration for ktlint @@ -244,6 +245,7 @@ dependencies { implementation(libs.androidx.recyclerview) implementation(libs.androidx.room.runtime) implementation(libs.androidx.room.rxjava3) + implementation(libs.androidx.sqlite.bundled) ksp(libs.androidx.room.compiler) implementation(libs.androidx.swiperefreshlayout) implementation(libs.androidx.viewpager2) diff --git a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt index 6527bd2ae..b7ab67a2d 100644 --- a/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt +++ b/app/src/main/java/org/schabi/newpipe/NewPipeDatabase.kt @@ -7,8 +7,11 @@ package org.schabi.newpipe import android.content.Context -import androidx.room.Room.databaseBuilder +import androidx.room3.Room.databaseBuilder +import androidx.room3.useWriterConnection +import androidx.sqlite.driver.bundled.BundledSQLiteDriver import kotlin.concurrent.Volatile +import kotlinx.coroutines.runBlocking import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.Migrations.MIGRATION_1_2 import org.schabi.newpipe.database.Migrations.MIGRATION_2_3 @@ -28,7 +31,7 @@ object NewPipeDatabase { return databaseBuilder( context.applicationContext, AppDatabase::class.java, - AppDatabase.Companion.DATABASE_NAME + AppDatabase.DATABASE_NAME ).addMigrations( MIGRATION_1_2, MIGRATION_2_3, @@ -38,7 +41,7 @@ object NewPipeDatabase { MIGRATION_6_7, MIGRATION_7_8, MIGRATION_8_9 - ).build() + ).setDriver(BundledSQLiteDriver()).build() } @JvmStatic @@ -59,10 +62,15 @@ object NewPipeDatabase { @JvmStatic fun checkpoint() { - checkNotNull(databaseInstance) { "database is not initialized" } - val c = databaseInstance!!.query("pragma wal_checkpoint(full)", null) - if (c.moveToFirst() && c.getInt(0) == 1) { - throw RuntimeException("Checkpoint was blocked from completing") + val database = checkNotNull(databaseInstance) { "database is not initialized" } + runBlocking { + database.useWriterConnection { transactor -> + transactor.usePrepared("pragma wal_checkpoint(full)") { statement -> + if (statement.step() && statement.getInt(0) == 1) { + throw RuntimeException("Checkpoint was blocked from completing") + } + } + } } } diff --git a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt index 286eddf7b..e045ba1b2 100644 --- a/app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt +++ b/app/src/main/java/org/schabi/newpipe/database/AppDatabase.kt @@ -6,9 +6,9 @@ package org.schabi.newpipe.database -import androidx.room.Database -import androidx.room.RoomDatabase -import androidx.room.TypeConverters +import androidx.room3.ColumnTypeConverters +import androidx.room3.Database +import androidx.room3.RoomDatabase import org.schabi.newpipe.database.feed.dao.FeedDAO import org.schabi.newpipe.database.feed.dao.FeedGroupDAO import org.schabi.newpipe.database.feed.model.FeedEntity @@ -32,7 +32,7 @@ import org.schabi.newpipe.database.stream.model.StreamStateEntity import org.schabi.newpipe.database.subscription.SubscriptionDAO import org.schabi.newpipe.database.subscription.SubscriptionEntity -@TypeConverters(Converters::class) +@ColumnTypeConverters(Converters::class) @Database( version = Migrations.DB_VER_9, entities = [ diff --git a/app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt b/app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt index 74c7cc87c..28a9b5af0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/BasicDAO.kt @@ -6,10 +6,10 @@ package org.schabi.newpipe.database -import androidx.room.Dao -import androidx.room.Delete -import androidx.room.Insert -import androidx.room.Update +import androidx.room3.Dao +import androidx.room3.Delete +import androidx.room3.Insert +import androidx.room3.Update import io.reactivex.rxjava3.core.Flowable @Dao diff --git a/app/src/main/java/org/schabi/newpipe/database/Converters.kt b/app/src/main/java/org/schabi/newpipe/database/Converters.kt index f9cbb1de2..439753114 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Converters.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Converters.kt @@ -1,6 +1,6 @@ package org.schabi.newpipe.database -import androidx.room.TypeConverter +import androidx.room3.ColumnTypeConverter import java.time.Instant import java.time.OffsetDateTime import java.time.ZoneOffset @@ -14,7 +14,7 @@ class Converters { * @param value the long value * @return the `OffsetDateTime` */ - @TypeConverter + @ColumnTypeConverter fun offsetDateTimeFromTimestamp(value: Long?): OffsetDateTime? { return value?.let { OffsetDateTime.ofInstant(Instant.ofEpochMilli(it), ZoneOffset.UTC) } } @@ -25,27 +25,27 @@ class Converters { * @param offsetDateTime the `OffsetDateTime` * @return the long value */ - @TypeConverter + @ColumnTypeConverter fun offsetDateTimeToTimestamp(offsetDateTime: OffsetDateTime?): Long? { return offsetDateTime?.withOffsetSameInstant(ZoneOffset.UTC)?.toInstant()?.toEpochMilli() } - @TypeConverter + @ColumnTypeConverter fun streamTypeOf(value: String): StreamType { return StreamType.valueOf(value) } - @TypeConverter + @ColumnTypeConverter fun stringOf(streamType: StreamType): String { return streamType.name } - @TypeConverter + @ColumnTypeConverter fun integerOf(feedGroupIcon: FeedGroupIcon): Int { return feedGroupIcon.id } - @TypeConverter + @ColumnTypeConverter fun feedGroupIconOf(id: Int): FeedGroupIcon { return FeedGroupIcon.entries.first { it.id == id } } diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt index 414f74893..0aa608264 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt @@ -7,7 +7,8 @@ package org.schabi.newpipe.database import android.util.Log -import androidx.room.migration.Migration +import androidx.room3.migration.Migration +import androidx.sqlite.execSQL import org.schabi.newpipe.MainActivity object Migrations { @@ -33,7 +34,7 @@ object Migrations { private val TAG = Migrations::class.java.getName() private val isDebug = MainActivity.DEBUG - val MIGRATION_1_2 = Migration(DB_VER_1, DB_VER_2) { db -> + val MIGRATION_1_2 = Migration(DB_VER_1, DB_VER_2) { connection -> if (isDebug) { Log.d(TAG, "Start migrating database") } @@ -46,45 +47,45 @@ object Migrations { // Not much we can do about this, since room doesn't create tables before migration. // It's either this or blasting the entire database anew. - db.execSQL( + connection.execSQL( "CREATE INDEX `index_search_history_search` " + "ON `search_history` (`search`)" ) - db.execSQL( + connection.execSQL( "CREATE TABLE IF NOT EXISTS `streams` " + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`service_id` INTEGER NOT NULL, `url` TEXT, `title` TEXT, " + "`stream_type` TEXT, `duration` INTEGER, `uploader` TEXT, " + "`thumbnail_url` TEXT)" ) - db.execSQL( + connection.execSQL( "CREATE UNIQUE INDEX `index_streams_service_id_url` " + "ON `streams` (`service_id`, `url`)" ) - db.execSQL( + connection.execSQL( "CREATE TABLE IF NOT EXISTS `stream_history` " + "(`stream_id` INTEGER NOT NULL, `access_date` INTEGER NOT NULL, " + "`repeat_count` INTEGER NOT NULL, PRIMARY KEY(`stream_id`, `access_date`), " + "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " + "ON UPDATE CASCADE ON DELETE CASCADE )" ) - db.execSQL( + connection.execSQL( "CREATE INDEX `index_stream_history_stream_id` " + "ON `stream_history` (`stream_id`)" ) - db.execSQL( + connection.execSQL( "CREATE TABLE IF NOT EXISTS `stream_state` " + "(`stream_id` INTEGER NOT NULL, `progress_time` INTEGER NOT NULL, " + "PRIMARY KEY(`stream_id`), FOREIGN KEY(`stream_id`) " + "REFERENCES `streams`(`uid`) ON UPDATE CASCADE ON DELETE CASCADE )" ) - db.execSQL( + connection.execSQL( "CREATE TABLE IF NOT EXISTS `playlists` " + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`name` TEXT, `thumbnail_url` TEXT)" ) - db.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)") - db.execSQL( + connection.execSQL("CREATE INDEX `index_playlists_name` ON `playlists` (`name`)") + connection.execSQL( "CREATE TABLE IF NOT EXISTS `playlist_stream_join` " + "(`playlist_id` INTEGER NOT NULL, `stream_id` INTEGER NOT NULL, " + "`join_index` INTEGER NOT NULL, PRIMARY KEY(`playlist_id`, `join_index`), " + @@ -93,33 +94,33 @@ object Migrations { "FOREIGN KEY(`stream_id`) REFERENCES `streams`(`uid`) " + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" ) - db.execSQL( + connection.execSQL( "CREATE UNIQUE INDEX " + "`index_playlist_stream_join_playlist_id_join_index` " + "ON `playlist_stream_join` (`playlist_id`, `join_index`)" ) - db.execSQL( + connection.execSQL( "CREATE INDEX `index_playlist_stream_join_stream_id` " + "ON `playlist_stream_join` (`stream_id`)" ) - db.execSQL( + connection.execSQL( "CREATE TABLE IF NOT EXISTS `remote_playlists` " + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + "`thumbnail_url` TEXT, `uploader` TEXT, `stream_count` INTEGER)" ) - db.execSQL( + connection.execSQL( "CREATE INDEX `index_remote_playlists_name` " + "ON `remote_playlists` (`name`)" ) - db.execSQL( + connection.execSQL( "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + "ON `remote_playlists` (`service_id`, `url`)" ) // Populate streams table with existing entries in watch history // Latest data first, thus ignoring older entries with the same indices - db.execSQL( + connection.execSQL( "INSERT OR IGNORE INTO streams (service_id, url, title, " + "stream_type, duration, uploader, thumbnail_url) " + @@ -132,7 +133,7 @@ object Migrations { // Once the streams have PKs, join them with the normalized history table // and populate it with the remaining data from watch history - db.execSQL( + connection.execSQL( "INSERT INTO stream_history (stream_id, access_date, repeat_count)" + "SELECT uid, creation_date, 1 " + "FROM watch_history INNER JOIN streams " + @@ -141,16 +142,16 @@ object Migrations { "ORDER BY creation_date DESC" ) - db.execSQL("DROP TABLE IF EXISTS watch_history") + connection.execSQL("DROP TABLE IF EXISTS watch_history") if (isDebug) { Log.d(TAG, "Stop migrating database") } } - val MIGRATION_2_3 = Migration(DB_VER_2, DB_VER_3) { db -> + val MIGRATION_2_3 = Migration(DB_VER_2, DB_VER_3) { connection -> // Add NOT NULLs and new fields - db.execSQL( + connection.execSQL( "CREATE TABLE IF NOT EXISTS streams_new " + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "service_id INTEGER NOT NULL, url TEXT NOT NULL, title TEXT NOT NULL, " + @@ -160,7 +161,7 @@ object Migrations { "is_upload_date_approximation INTEGER)" ) - db.execSQL( + connection.execSQL( "INSERT INTO streams_new (uid, service_id, url, title, stream_type, " + "duration, uploader, thumbnail_url, view_count, textual_upload_date, " + "upload_date, is_upload_date_approximation) " + @@ -172,15 +173,15 @@ object Migrations { "FROM streams WHERE url IS NOT NULL" ) - db.execSQL("DROP TABLE streams") - db.execSQL("ALTER TABLE streams_new RENAME TO streams") - db.execSQL( + connection.execSQL("DROP TABLE streams") + connection.execSQL("ALTER TABLE streams_new RENAME TO streams") + connection.execSQL( "CREATE UNIQUE INDEX index_streams_service_id_url " + "ON streams (service_id, url)" ) // Tables for feed feature - db.execSQL( + connection.execSQL( "CREATE TABLE IF NOT EXISTS feed " + "(stream_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " + "PRIMARY KEY(stream_id, subscription_id), " + @@ -189,14 +190,14 @@ object Migrations { "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" ) - db.execSQL("CREATE INDEX index_feed_subscription_id ON feed (subscription_id)") - db.execSQL( + connection.execSQL("CREATE INDEX index_feed_subscription_id ON feed (subscription_id)") + connection.execSQL( "CREATE TABLE IF NOT EXISTS feed_group " + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, " + "icon_id INTEGER NOT NULL, sort_order INTEGER NOT NULL)" ) - db.execSQL("CREATE INDEX index_feed_group_sort_order ON feed_group (sort_order)") - db.execSQL( + connection.execSQL("CREATE INDEX index_feed_group_sort_order ON feed_group (sort_order)") + connection.execSQL( "CREATE TABLE IF NOT EXISTS feed_group_subscription_join " + "(group_id INTEGER NOT NULL, subscription_id INTEGER NOT NULL, " + "PRIMARY KEY(group_id, subscription_id), " + @@ -205,11 +206,11 @@ object Migrations { "FOREIGN KEY(subscription_id) REFERENCES subscriptions(uid) " + "ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED)" ) - db.execSQL( + connection.execSQL( "CREATE INDEX index_feed_group_subscription_join_subscription_id " + "ON feed_group_subscription_join (subscription_id)" ) - db.execSQL( + connection.execSQL( "CREATE TABLE IF NOT EXISTS feed_last_updated " + "(subscription_id INTEGER NOT NULL, last_updated INTEGER, " + "PRIMARY KEY(subscription_id), " + @@ -218,33 +219,33 @@ object Migrations { ) } - val MIGRATION_3_4 = Migration(DB_VER_3, DB_VER_4) { db -> - db.execSQL("ALTER TABLE streams ADD COLUMN uploader_url TEXT") + val MIGRATION_3_4 = Migration(DB_VER_3, DB_VER_4) { connection -> + connection.execSQL("ALTER TABLE streams ADD COLUMN uploader_url TEXT") } - val MIGRATION_4_5 = Migration(DB_VER_4, DB_VER_5) { db -> - db.execSQL( + val MIGRATION_4_5 = Migration(DB_VER_4, DB_VER_5) { connection -> + connection.execSQL( "ALTER TABLE `subscriptions` ADD COLUMN `notification_mode` " + "INTEGER NOT NULL DEFAULT 0" ) } - val MIGRATION_5_6 = Migration(DB_VER_5, DB_VER_6) { db -> - db.execSQL( + val MIGRATION_5_6 = Migration(DB_VER_5, DB_VER_6) { connection -> + connection.execSQL( "ALTER TABLE `playlists` ADD COLUMN `is_thumbnail_permanent` " + "INTEGER NOT NULL DEFAULT 0" ) } - val MIGRATION_6_7 = Migration(DB_VER_6, DB_VER_7) { db -> + val MIGRATION_6_7 = Migration(DB_VER_6, DB_VER_7) { connection -> // Create a new column thumbnail_stream_id - db.execSQL( + connection.execSQL( "ALTER TABLE `playlists` ADD COLUMN `thumbnail_stream_id` " + "INTEGER NOT NULL DEFAULT -1" ) // Migrate the thumbnail_url to the thumbnail_stream_id - db.execSQL( + connection.execSQL( "UPDATE playlists SET thumbnail_stream_id = (" + " SELECT CASE WHEN COUNT(*) != 0 then stream_uid ELSE -1 END" + " FROM (" + @@ -257,7 +258,7 @@ object Migrations { ) // Remove the thumbnail_url field in the playlist table - db.execSQL( + connection.execSQL( "CREATE TABLE IF NOT EXISTS `playlists_new`" + "(uid INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "name TEXT, " + @@ -265,87 +266,79 @@ object Migrations { "thumbnail_stream_id INTEGER NOT NULL)" ) - db.execSQL( + connection.execSQL( "INSERT INTO playlists_new" + " SELECT uid, name, is_thumbnail_permanent, thumbnail_stream_id " + " FROM playlists" ) - db.execSQL("DROP TABLE playlists") - db.execSQL("ALTER TABLE playlists_new RENAME TO playlists") - db.execSQL( + connection.execSQL("DROP TABLE playlists") + connection.execSQL("ALTER TABLE playlists_new RENAME TO playlists") + connection.execSQL( "CREATE INDEX IF NOT EXISTS " + "`index_playlists_name` ON `playlists` (`name`)" ) } - val MIGRATION_7_8 = Migration(DB_VER_7, DB_VER_8) { db -> - db.execSQL( + val MIGRATION_7_8 = Migration(DB_VER_7, DB_VER_8) { connection -> + connection.execSQL( "DELETE FROM search_history WHERE id NOT IN (SELECT id FROM (SELECT " + "MIN(id) as id FROM search_history GROUP BY trim(search), service_id ) tmp)" ) - db.execSQL("UPDATE search_history SET search = trim(search)") + connection.execSQL("UPDATE search_history SET search = trim(search)") } - val MIGRATION_8_9 = Migration(DB_VER_8, DB_VER_9) { db -> - try { - db.beginTransaction() - - // Update playlists. - // Create a temp table to initialize display_index. - db.execSQL( - "CREATE TABLE `playlists_tmp` " + + val MIGRATION_8_9 = Migration(DB_VER_8, DB_VER_9) { connection -> + // Update playlists. + // Create a temp table to initialize display_index. + connection.execSQL( + "CREATE TABLE `playlists_tmp` " + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, " + "`thumbnail_stream_id` INTEGER NOT NULL, " + "`display_index` INTEGER NOT NULL)" - ) - db.execSQL( - "INSERT INTO `playlists_tmp` " + + ) + connection.execSQL( + "INSERT INTO `playlists_tmp` " + "(`uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + "`display_index`) " + "SELECT `uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + "-1 " + "FROM `playlists`" - ) + ) - // Replace the old table, note that this also removes the index on the name which - // we don't need anymore. - db.execSQL("DROP TABLE `playlists`") - db.execSQL("ALTER TABLE `playlists_tmp` RENAME TO `playlists`") + // Replace the old table, note that this also removes the index on the name which + // we don't need anymore. + connection.execSQL("DROP TABLE `playlists`") + connection.execSQL("ALTER TABLE `playlists_tmp` RENAME TO `playlists`") - // Update remote_playlists. - // Create a temp table to initialize display_index. - db.execSQL( - "CREATE TABLE `remote_playlists_tmp` " + + // Update remote_playlists. + // Create a temp table to initialize display_index. + connection.execSQL( + "CREATE TABLE `remote_playlists_tmp` " + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + "`thumbnail_url` TEXT, `uploader` TEXT, " + "`display_index` INTEGER NOT NULL," + "`stream_count` INTEGER)" - ) - db.execSQL( - "INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, " + + ) + connection.execSQL( + "INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, " + "`name`, `url`, `thumbnail_url`, `uploader`, `display_index`, " + "`stream_count`)" + "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " + "-1, `stream_count` FROM `remote_playlists`" - ) + ) - // Replace the old table, note that this also removes the index on the name which - // we don't need anymore. - db.execSQL("DROP TABLE `remote_playlists`") - db.execSQL("ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`") + // Replace the old table, note that this also removes the index on the name which + // we don't need anymore. + connection.execSQL("DROP TABLE `remote_playlists`") + connection.execSQL("ALTER TABLE `remote_playlists_tmp` RENAME TO `remote_playlists`") - // Create index on the new table. - db.execSQL( - "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + + // Create index on the new table. + connection.execSQL( + "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + "ON `remote_playlists` (`service_id`, `url`)" - ) - - db.setTransactionSuccessful() - } finally { - db.endTransaction() - } + ) } } diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt index 0c5f1d34d..964e34f14 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedDAO.kt @@ -1,11 +1,13 @@ package org.schabi.newpipe.database.feed.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Transaction -import androidx.room.Update +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query +import androidx.room3.Transaction +import androidx.room3.Update +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe import java.time.OffsetDateTime @@ -18,6 +20,7 @@ import org.schabi.newpipe.database.subscription.NotificationMode import org.schabi.newpipe.database.subscription.SubscriptionEntity @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) abstract class FeedDAO { @Query("DELETE FROM feed") abstract fun deleteAll(): Int diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedGroupDAO.kt b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedGroupDAO.kt index 217eef03f..fe052d6cd 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedGroupDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/dao/FeedGroupDAO.kt @@ -1,17 +1,20 @@ package org.schabi.newpipe.database.feed.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Transaction -import androidx.room.Update +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query +import androidx.room3.Transaction +import androidx.room3.Update +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) abstract class FeedGroupDAO { @Query("SELECT * FROM feed_group ORDER BY sort_order ASC") diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt index 86568bc90..497e8637e 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedEntity.kt @@ -1,9 +1,9 @@ package org.schabi.newpipe.database.feed.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.Index +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.ForeignKey +import androidx.room3.Index import org.schabi.newpipe.database.feed.model.FeedEntity.Companion.FEED_TABLE import org.schabi.newpipe.database.feed.model.FeedEntity.Companion.STREAM_ID import org.schabi.newpipe.database.feed.model.FeedEntity.Companion.SUBSCRIPTION_ID diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt index 1dd26946a..dc25f6d83 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupEntity.kt @@ -1,9 +1,9 @@ package org.schabi.newpipe.database.feed.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Index -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.Index +import androidx.room3.PrimaryKey import org.schabi.newpipe.database.feed.model.FeedGroupEntity.Companion.FEED_GROUP_TABLE import org.schabi.newpipe.database.feed.model.FeedGroupEntity.Companion.SORT_ORDER import org.schabi.newpipe.local.subscription.FeedGroupIcon diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt index 6dac3c89c..413dd2621 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedGroupSubscriptionEntity.kt @@ -1,9 +1,9 @@ package org.schabi.newpipe.database.feed.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.Index +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.ForeignKey +import androidx.room3.Index import org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity.Companion.FEED_GROUP_SUBSCRIPTION_TABLE import org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity.Companion.GROUP_ID import org.schabi.newpipe.database.feed.model.FeedGroupSubscriptionEntity.Companion.SUBSCRIPTION_ID diff --git a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt index fc0ee6742..700232481 100644 --- a/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/feed/model/FeedLastUpdatedEntity.kt @@ -1,9 +1,9 @@ package org.schabi.newpipe.database.feed.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.ForeignKey +import androidx.room3.PrimaryKey import java.time.OffsetDateTime import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.FEED_LAST_UPDATED_TABLE import org.schabi.newpipe.database.feed.model.FeedLastUpdatedEntity.Companion.SUBSCRIPTION_ID diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt index ddcb00489..4579e83d0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/SearchHistoryDAO.kt @@ -6,13 +6,16 @@ package org.schabi.newpipe.database.history.dao -import androidx.room.Dao -import androidx.room.Query +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Query +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.history.model.SearchHistoryEntry @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) interface SearchHistoryDAO : BasicDAO { @get:Query("SELECT * FROM search_history WHERE id = (SELECT MAX(id) FROM search_history)") diff --git a/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt b/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt index 916d4e5ed..f8972e20d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/dao/StreamHistoryDAO.kt @@ -6,9 +6,11 @@ package org.schabi.newpipe.database.history.dao -import androidx.room.Dao -import androidx.room.Query -import androidx.room.RewriteQueriesToDropUnusedColumns +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Query +import androidx.room3.RewriteQueriesToDropUnusedColumns +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.history.model.StreamHistoryEntity @@ -16,6 +18,7 @@ import org.schabi.newpipe.database.history.model.StreamHistoryEntry import org.schabi.newpipe.database.stream.StreamStatisticsEntry @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) abstract class StreamHistoryDAO : BasicDAO { @Query("SELECT * FROM stream_history") diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt index eee213453..f44796f4c 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/SearchHistoryEntry.kt @@ -6,11 +6,11 @@ package org.schabi.newpipe.database.history.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Ignore -import androidx.room.Index -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.Ignore +import androidx.room3.Index +import androidx.room3.PrimaryKey import java.time.OffsetDateTime @Entity( diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt index deba7dd3a..e502d8a18 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntity.kt @@ -6,11 +6,11 @@ package org.schabi.newpipe.database.history.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.ForeignKey.Companion.CASCADE -import androidx.room.Index +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.ForeignKey +import androidx.room3.ForeignKey.Companion.CASCADE +import androidx.room3.Index import java.time.OffsetDateTime import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.JOIN_STREAM_ID import org.schabi.newpipe.database.history.model.StreamHistoryEntity.Companion.STREAM_ACCESS_DATE diff --git a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt index 816b25c2a..8abd0fc67 100644 --- a/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/history/model/StreamHistoryEntry.kt @@ -1,7 +1,7 @@ package org.schabi.newpipe.database.history.model -import androidx.room.ColumnInfo -import androidx.room.Embedded +import androidx.room3.ColumnInfo +import androidx.room3.Embedded import java.time.OffsetDateTime import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.extractor.stream.StreamInfoItem diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt index 84972a89e..5f1af487d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistDuplicatesEntry.kt @@ -6,7 +6,7 @@ package org.schabi.newpipe.database.playlist -import androidx.room.ColumnInfo +import androidx.room3.ColumnInfo import org.schabi.newpipe.database.playlist.model.PlaylistEntity /** diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt index 9b62c1380..59c48e811 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistMetadataEntry.kt @@ -6,7 +6,7 @@ package org.schabi.newpipe.database.playlist -import androidx.room.ColumnInfo +import androidx.room3.ColumnInfo import org.schabi.newpipe.database.LocalItem.LocalItemType import org.schabi.newpipe.database.playlist.model.PlaylistEntity diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt index 90fdee2d3..9ef6ad425 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/PlaylistStreamEntry.kt @@ -6,8 +6,8 @@ package org.schabi.newpipe.database.playlist -import androidx.room.ColumnInfo -import androidx.room.Embedded +import androidx.room3.ColumnInfo +import androidx.room3.Embedded import org.schabi.newpipe.database.LocalItem import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity import org.schabi.newpipe.database.stream.model.StreamEntity diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt index 9c2dd89a8..914bbdb6b 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt @@ -6,14 +6,17 @@ package org.schabi.newpipe.database.playlist.dao -import androidx.room.Dao -import androidx.room.Query -import androidx.room.Transaction +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Query +import androidx.room3.Transaction +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.playlist.model.PlaylistEntity @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) interface PlaylistDAO : BasicDAO { @Query("SELECT * FROM playlists") diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt index 36a80bc91..21116e42d 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt @@ -6,14 +6,17 @@ package org.schabi.newpipe.database.playlist.dao -import androidx.room.Dao -import androidx.room.Query -import androidx.room.Transaction +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Query +import androidx.room3.Transaction +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) interface PlaylistRemoteDAO : BasicDAO { @Query("SELECT * FROM remote_playlists") diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt index c6b6e37a4..ac2ec21d9 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt @@ -6,10 +6,12 @@ package org.schabi.newpipe.database.playlist.dao -import androidx.room.Dao -import androidx.room.Query -import androidx.room.RewriteQueriesToDropUnusedColumns -import androidx.room.Transaction +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Query +import androidx.room3.RewriteQueriesToDropUnusedColumns +import androidx.room3.Transaction +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry @@ -19,6 +21,7 @@ import org.schabi.newpipe.database.playlist.model.PlaylistEntity.Companion.DEFAU import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) interface PlaylistStreamDAO : BasicDAO { @Query("SELECT * FROM playlist_stream_join") diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt index 1f1862f4f..045a40b4b 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistEntity.kt @@ -6,13 +6,13 @@ package org.schabi.newpipe.database.playlist.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Ignore -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.Ignore +import androidx.room3.PrimaryKey import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry -@Entity(tableName = PlaylistEntity.Companion.PLAYLIST_TABLE) +@Entity(tableName = PlaylistEntity.PLAYLIST_TABLE) data class PlaylistEntity @JvmOverloads constructor( @PrimaryKey(autoGenerate = true) @ColumnInfo(name = PLAYLIST_ID) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt index 254fa425a..46ff01bce 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistRemoteEntity.kt @@ -7,11 +7,11 @@ package org.schabi.newpipe.database.playlist.model import android.text.TextUtils -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Ignore -import androidx.room.Index -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.Ignore +import androidx.room3.Index +import androidx.room3.PrimaryKey import org.schabi.newpipe.database.LocalItem.LocalItemType import org.schabi.newpipe.database.playlist.PlaylistLocalItem import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity.Companion.REMOTE_PLAYLIST_SERVICE_ID diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt index 6ab1b6ac4..4897e5a12 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/model/PlaylistStreamEntity.kt @@ -6,11 +6,11 @@ package org.schabi.newpipe.database.playlist.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.ForeignKey.Companion.CASCADE -import androidx.room.Index +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.ForeignKey +import androidx.room3.ForeignKey.Companion.CASCADE +import androidx.room3.Index import org.schabi.newpipe.database.LocalItem import org.schabi.newpipe.database.playlist.model.PlaylistEntity.Companion.PLAYLIST_ID import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity.Companion.JOIN_INDEX diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt index ce74678ca..5bb30c041 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/StreamStatisticsEntry.kt @@ -6,9 +6,9 @@ package org.schabi.newpipe.database.stream -import androidx.room.ColumnInfo -import androidx.room.Embedded -import androidx.room.Ignore +import androidx.room3.ColumnInfo +import androidx.room3.Embedded +import androidx.room3.Ignore import java.time.OffsetDateTime import org.schabi.newpipe.database.LocalItem import org.schabi.newpipe.database.history.model.StreamHistoryEntity diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/StreamWithState.kt b/app/src/main/java/org/schabi/newpipe/database/stream/StreamWithState.kt index abeabf888..f738ba449 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/StreamWithState.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/StreamWithState.kt @@ -1,7 +1,7 @@ package org.schabi.newpipe.database.stream -import androidx.room.ColumnInfo -import androidx.room.Embedded +import androidx.room3.ColumnInfo +import androidx.room3.Embedded import org.schabi.newpipe.database.stream.model.StreamEntity import org.schabi.newpipe.database.stream.model.StreamStateEntity diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt index 86ba262f5..de9d87f13 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamDAO.kt @@ -1,11 +1,13 @@ package org.schabi.newpipe.database.stream.dao -import androidx.room.ColumnInfo -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Transaction +import androidx.room3.ColumnInfo +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query +import androidx.room3.Transaction +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import java.time.OffsetDateTime @@ -16,6 +18,7 @@ import org.schabi.newpipe.extractor.stream.StreamType import org.schabi.newpipe.util.StreamTypeUtil @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) abstract class StreamDAO : BasicDAO { @Query("SELECT * FROM streams") abstract override fun getAll(): Flowable> diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt index f3c44f1f2..d6e300342 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/dao/StreamStateDAO.kt @@ -6,16 +6,19 @@ package org.schabi.newpipe.database.stream.dao -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.Transaction +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query +import androidx.room3.Transaction +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import org.schabi.newpipe.database.BasicDAO import org.schabi.newpipe.database.stream.model.StreamStateEntity @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) interface StreamStateDAO : BasicDAO { @Query("SELECT * FROM " + StreamStateEntity.STREAM_STATE_TABLE) @@ -34,7 +37,7 @@ interface StreamStateDAO : BasicDAO { @Query("DELETE FROM " + StreamStateEntity.STREAM_STATE_TABLE + " WHERE " + StreamStateEntity.JOIN_STREAM_ID + " = :streamId") fun deleteState(streamId: Long): Int - @Insert(onConflict = OnConflictStrategy.Companion.IGNORE) + @Insert(onConflict = OnConflictStrategy.IGNORE) fun silentInsertInternal(streamState: StreamStateEntity) @Transaction diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt index 067f666b6..2640f7e5a 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamEntity.kt @@ -1,10 +1,10 @@ package org.schabi.newpipe.database.stream.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Ignore -import androidx.room.Index -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.Ignore +import androidx.room3.Index +import androidx.room3.PrimaryKey import java.io.Serializable import java.time.OffsetDateTime import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_SERVICE_ID diff --git a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt index 759a2dcec..44b030c8c 100644 --- a/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/stream/model/StreamStateEntity.kt @@ -6,13 +6,12 @@ package org.schabi.newpipe.database.stream.model -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.ForeignKey -import androidx.room.ForeignKey.Companion.CASCADE +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.ForeignKey +import androidx.room3.ForeignKey.Companion.CASCADE import org.schabi.newpipe.database.stream.model.StreamEntity.Companion.STREAM_ID import org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.JOIN_STREAM_ID -import org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.PLAYBACK_FINISHED_END_MILLISECONDS import org.schabi.newpipe.database.stream.model.StreamStateEntity.Companion.STREAM_STATE_TABLE @Entity( diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt index 72bdbcf5c..30890e6ab 100644 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionDAO.kt @@ -1,16 +1,19 @@ package org.schabi.newpipe.database.subscription -import androidx.room.Dao -import androidx.room.Insert -import androidx.room.OnConflictStrategy -import androidx.room.Query -import androidx.room.RewriteQueriesToDropUnusedColumns -import androidx.room.Transaction +import androidx.room3.Dao +import androidx.room3.DaoReturnTypeConverters +import androidx.room3.Insert +import androidx.room3.OnConflictStrategy +import androidx.room3.Query +import androidx.room3.RewriteQueriesToDropUnusedColumns +import androidx.room3.Transaction +import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe import org.schabi.newpipe.database.BasicDAO @Dao +@DaoReturnTypeConverters(RxDaoReturnTypeConverters::class) abstract class SubscriptionDAO : BasicDAO { @Query("SELECT COUNT(*) FROM subscriptions") abstract fun rowCount(): Flowable diff --git a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt index 7df9830e4..6eb76d0a0 100644 --- a/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt +++ b/app/src/main/java/org/schabi/newpipe/database/subscription/SubscriptionEntity.kt @@ -6,21 +6,24 @@ package org.schabi.newpipe.database.subscription -import androidx.room.ColumnInfo -import androidx.room.Entity -import androidx.room.Ignore -import androidx.room.Index -import androidx.room.PrimaryKey +import androidx.room3.ColumnInfo +import androidx.room3.Entity +import androidx.room3.Ignore +import androidx.room3.Index +import androidx.room3.PrimaryKey import org.schabi.newpipe.extractor.channel.ChannelInfo import org.schabi.newpipe.extractor.channel.ChannelInfoItem import org.schabi.newpipe.util.NO_SERVICE_ID import org.schabi.newpipe.util.image.ImageStrategy @Entity( - tableName = SubscriptionEntity.Companion.SUBSCRIPTION_TABLE, + tableName = SubscriptionEntity.SUBSCRIPTION_TABLE, indices = [ Index( - value = [SubscriptionEntity.Companion.SUBSCRIPTION_SERVICE_ID, SubscriptionEntity.Companion.SUBSCRIPTION_URL], + value = [ + SubscriptionEntity.SUBSCRIPTION_SERVICE_ID, + SubscriptionEntity.SUBSCRIPTION_URL + ], unique = true ) ] diff --git a/build.gradle.kts b/build.gradle.kts index 4005c3639..82b6e219a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -24,4 +24,5 @@ plugins { alias(libs.plugins.sonarqube) apply false alias(libs.plugins.koin) apply false alias(libs.plugins.about.libraries) apply false + alias(libs.plugins.androidx.room) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4b27460b0..a94c09fe1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -54,7 +54,7 @@ phoenix = "3.0.0" preference = "1.2.1" prettytime = "5.0.8.Final" recyclerview = "1.4.0" -room = "2.8.5" # Needs migration to 3.x, may as well be moved to shared +room = "3.0.3" runner = "1.7.0" rxandroid = "3.0.2" rxbinding = "4.0.0" @@ -63,6 +63,7 @@ settings = "1.3.0" sonarqube = "7.5.0.8588" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" +sqlite = "2.7.1" swiperefreshlayout = "1.2.0" # You can use a local version by uncommenting a few lines in settings.gradle # Or you can use a commit you pushed to GitHub by just replacing TeamNewPipe with your GitHub @@ -99,12 +100,13 @@ androidx-localbroadcastmanager = { module = "androidx.localbroadcastmanager:loca androidx-media = { module = "androidx.media:media", version.ref = "media" } androidx-preference = { module = "androidx.preference:preference", version.ref = "preference" } androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" } -androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } -androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } -androidx-room-rxjava3 = { module = "androidx.room:room-rxjava3", version.ref = "room" } -androidx-room-testing = { module = "androidx.room:room-testing", version.ref = "room" } +androidx-room-compiler = { module = "androidx.room3:room3-compiler", version.ref = "room" } +androidx-room-runtime = { module = "androidx.room3:room3-runtime", version.ref = "room" } +androidx-room-rxjava3 = { module = "androidx.room3:room3-rxjava3", version.ref = "room" } +androidx-room-testing = { module = "androidx.room3:room3-testing", version.ref = "room" } androidx-runner = { module = "androidx.test:runner", version.ref = "runner" } androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" } +androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } androidx-test-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso" } androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" } androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } @@ -179,6 +181,7 @@ about-libraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "ab android-application = { id = "com.android.application", version.ref = "agp" } android-legacy-kapt = { id = "com.android.legacy-kapt", version.ref = "agp" } # Needed for statesaver android-library = { id = "com.android.kotlin.multiplatform.library", version.ref = "agp" } +androidx-room = { id = "androidx.room3", version.ref = "room" } google-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } jetbrains-compose-multiplatform = { id = "org.jetbrains.compose", version.ref = "multiplatform" } jetbrains-kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } From b6a7bfcf9727a3cd3729e6726aadd8a7abacd194 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 15 Oct 2026 16:09:25 +0800 Subject: [PATCH 122/155] Switch from runInTransaction to withWriteTransaction API Signed-off-by: Aayush Gupta --- .../playlist/dao/PlaylistRemoteDAO.kt | 6 +++ .../local/feed/service/FeedLoadManager.kt | 54 ++++++++++--------- .../local/playlist/RemotePlaylistManager.kt | 10 ++-- .../local/subscription/SubscriptionManager.kt | 5 +- 4 files changed, 43 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt index 21116e42d..ca2a31b3c 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt @@ -55,4 +55,10 @@ interface PlaylistRemoteDAO : BasicDAO { @Query("DELETE FROM remote_playlists WHERE uid = :playlistId") fun deletePlaylist(playlistId: Long): Int + + @Transaction + fun updatePlaylists(updateItems: List, deletedItems: List) { + deletedItems.forEach { deletePlaylist(it) } + updateItems.forEach { upsert(it) } + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index 1e1bdcf16..92d0464c5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -3,6 +3,7 @@ package org.schabi.newpipe.local.feed.service import android.content.Context import android.content.SharedPreferences import androidx.preference.PreferenceManager +import androidx.room3.withWriteTransaction import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable @@ -15,6 +16,7 @@ import java.time.OffsetDateTime import java.time.ZoneOffset import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger +import kotlinx.coroutines.runBlocking import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.subscription.NotificationMode @@ -287,37 +289,39 @@ class FeedLoadManager(private val context: Context) { private inner class DatabaseConsumer : Consumer>> { override fun accept(list: List>) { - feedDatabaseManager.database().runInTransaction { - for (notification in list) { - when { - notification.isOnNext -> { - val info = notification.value!! + runBlocking { + feedDatabaseManager.database().withWriteTransaction { + for (notification in list) { + when { + notification.isOnNext -> { + val info = notification.value!! - notification.value!!.newStreams = filterNewStreams(info.streams) + notification.value!!.newStreams = filterNewStreams(info.streams) - feedDatabaseManager.upsertAll(info.uid, info.streams) - subscriptionManager.updateFromInfo(info) + feedDatabaseManager.upsertAll(info.uid, info.streams) + subscriptionManager.updateFromInfo(info) - if (info.errors.isNotEmpty()) { - feedResultsHolder.addErrors( - info.errors.map { - FeedLoadService.RequestException( - info.uid, - "${info.serviceId}:${info.url}", - it - ) - } - ) - feedDatabaseManager.markAsOutdated(info.uid) + if (info.errors.isNotEmpty()) { + feedResultsHolder.addErrors( + info.errors.map { + FeedLoadService.RequestException( + info.uid, + "${info.serviceId}:${info.url}", + it + ) + } + ) + feedDatabaseManager.markAsOutdated(info.uid) + } } - } - notification.isOnError -> { - val error = notification.error - feedResultsHolder.addError(error!!) + notification.isOnError -> { + val error = notification.error + feedResultsHolder.addError(error!!) - if (error is FeedLoadService.RequestException) { - feedDatabaseManager.markAsOutdated(error.subscriptionId) + if (error is FeedLoadService.RequestException) { + feedDatabaseManager.markAsOutdated(error.subscriptionId) + } } } } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt index 6961b6bb4..318b6f38e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt @@ -13,7 +13,7 @@ import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity import org.schabi.newpipe.extractor.playlist.PlaylistInfo -class RemotePlaylistManager(private val database: AppDatabase) { +class RemotePlaylistManager(database: AppDatabase) { private val playlistRemoteTable = database.playlistRemoteDAO() val playlists: Flowable> @@ -38,10 +38,10 @@ class RemotePlaylistManager(private val database: AppDatabase) { deletedItems: List ): Completable { return Completable.fromRunnable { - database.runInTransaction { - deletedItems.forEach { playlistRemoteTable.deletePlaylist(it) } - updateItems.forEach { playlistRemoteTable.upsert(it) } - } + playlistRemoteTable.updatePlaylists( + updateItems = updateItems, + deletedItems = deletedItems + ) }.subscribeOn(Schedulers.io()) } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index 0329d3594..7ddf2df2f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -1,6 +1,7 @@ package org.schabi.newpipe.local.subscription import android.content.Context +import androidx.room3.withWriteTransaction import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable @@ -50,11 +51,11 @@ class SubscriptionManager(context: Context) { } } - fun upsertAll(infoList: List>) { + suspend fun upsertAll(infoList: List>) { val listEntities = infoList.map { SubscriptionEntity.from(it.first) } subscriptionTable.upsertAll(listEntities) - database.runInTransaction { + database.withWriteTransaction { infoList.forEachIndexed { index, info -> // There may be no tabs on the channel to refresh the feed from if (info.second == null) return@forEachIndexed From 9f6ff2fd37fbf2518b286d3cdcc8f1e3ed7919d2 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 15 Oct 2026 17:04:37 +0800 Subject: [PATCH 123/155] Rewrite *Manager classes to Kotlin for new room API Seems to be unavailable in Java, rewrite and simplify it a bit as well Signed-off-by: Aayush Gupta --- .../database/playlist/dao/PlaylistDAO.kt | 7 + .../playlist/dao/PlaylistStreamDAO.kt | 6 + .../holder/StreamMiniInfoItemHolder.java | 4 +- .../local/history/HistoryRecordManager.java | 318 ------------------ .../local/history/HistoryRecordManager.kt | 292 ++++++++++++++++ .../local/playlist/LocalPlaylistManager.java | 189 ----------- .../local/playlist/LocalPlaylistManager.kt | 181 ++++++++++ .../local/playlist/LocalPlaylistViewModel.kt | 2 +- 8 files changed, 489 insertions(+), 510 deletions(-) delete mode 100644 app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java create mode 100644 app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt delete mode 100644 app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java create mode 100644 app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt index 914bbdb6b..a272b4c04 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistDAO.kt @@ -13,6 +13,7 @@ import androidx.room3.Transaction import androidx.room3.rxjava3.RxDaoReturnTypeConverters import io.reactivex.rxjava3.core.Flowable import org.schabi.newpipe.database.BasicDAO +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry import org.schabi.newpipe.database.playlist.model.PlaylistEntity @Dao @@ -48,4 +49,10 @@ interface PlaylistDAO : BasicDAO { return playlist.uid } } + + @Transaction + fun updatePlaylists(updateItems: List, deletedItems: List) { + deletedItems.forEach { uid -> deletePlaylist(uid) } + updateItems.forEach { item -> upsertPlaylist(PlaylistEntity(item)) } + } } diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt index ac2ec21d9..27f317e92 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistStreamDAO.kt @@ -136,4 +136,10 @@ interface PlaylistStreamDAO : BasicDAO { """ ) fun getPlaylistDuplicatesMetadata(streamUrl: String): Flowable> + + @Transaction + fun updatePlaylistStreams(playlistId: Long, joinEntities: List) { + deleteBatch(playlistId) + insertAll(joinEntities) + } } diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java index 32fa8bf60..73f66b5c9 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamMiniInfoItemHolder.java @@ -65,7 +65,7 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder { if (DependentPreferenceHelper .getPositionsInListsEnabled(itemProgressView.getContext())) { state2 = historyRecordManager.loadStreamState(infoItem) - .blockingGet()[0]; + .blockingGet(); } if (state2 != null) { itemProgressView.setVisibility(View.VISIBLE); @@ -120,7 +120,7 @@ public class StreamMiniInfoItemHolder extends InfoItemHolder { if (DependentPreferenceHelper.getPositionsInListsEnabled(itemProgressView.getContext())) { state = historyRecordManager .loadStreamState(infoItem) - .blockingGet()[0]; + .blockingGet(); } if (state != null && item.getDuration() > 0 && !StreamTypeUtil.isLiveStream(item.getStreamType())) { diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java deleted file mode 100644 index ed3cf548f..000000000 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.java +++ /dev/null @@ -1,318 +0,0 @@ -package org.schabi.newpipe.local.history; - -/* - * Copyright (C) Mauricio Colli 2018 - * HistoryRecordManager.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 . - */ - -import android.content.Context; -import android.content.SharedPreferences; - -import androidx.annotation.NonNull; -import androidx.preference.PreferenceManager; - -import org.schabi.newpipe.NewPipeDatabase; -import org.schabi.newpipe.R; -import org.schabi.newpipe.database.AppDatabase; -import org.schabi.newpipe.database.LocalItem; -import org.schabi.newpipe.database.history.dao.SearchHistoryDAO; -import org.schabi.newpipe.database.history.dao.StreamHistoryDAO; -import org.schabi.newpipe.database.history.model.SearchHistoryEntry; -import org.schabi.newpipe.database.history.model.StreamHistoryEntity; -import org.schabi.newpipe.database.history.model.StreamHistoryEntry; -import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; -import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity; -import org.schabi.newpipe.database.stream.StreamStatisticsEntry; -import org.schabi.newpipe.database.stream.dao.StreamDAO; -import org.schabi.newpipe.database.stream.dao.StreamStateDAO; -import org.schabi.newpipe.database.stream.model.StreamEntity; -import org.schabi.newpipe.database.stream.model.StreamStateEntity; -import org.schabi.newpipe.extractor.InfoItem; -import org.schabi.newpipe.extractor.stream.StreamInfo; -import org.schabi.newpipe.extractor.stream.StreamInfoItem; -import org.schabi.newpipe.local.feed.FeedViewModel; -import org.schabi.newpipe.player.playqueue.PlayQueueItem; -import org.schabi.newpipe.util.ExtractorHelper; - -import java.time.OffsetDateTime; -import java.time.ZoneOffset; -import java.util.ArrayList; -import java.util.List; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Flowable; -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.Single; -import io.reactivex.rxjava3.schedulers.Schedulers; - -public class HistoryRecordManager { - private final AppDatabase database; - private final StreamDAO streamTable; - private final StreamHistoryDAO streamHistoryTable; - private final SearchHistoryDAO searchHistoryTable; - private final StreamStateDAO streamStateTable; - private final SharedPreferences sharedPreferences; - private final String searchHistoryKey; - private final String streamHistoryKey; - - public HistoryRecordManager(final Context context) { - database = NewPipeDatabase.getInstance(context); - streamTable = database.streamDAO(); - streamHistoryTable = database.streamHistoryDAO(); - searchHistoryTable = database.searchHistoryDAO(); - streamStateTable = database.streamStateDAO(); - sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); - searchHistoryKey = context.getString(R.string.enable_search_history_key); - streamHistoryKey = context.getString(R.string.enable_watch_history_key); - } - - /////////////////////////////////////////////////////// - // Watch History - /////////////////////////////////////////////////////// - - /** - * Marks a stream item as watched such that it is hidden from the feed if watched videos are - * hidden. Adds a history entry and updates the stream progress to 100%. - * - * @see FeedViewModel#setSaveShowPlayedItems - * @param info the item to mark as watched - * @return a Maybe containing the ID of the item if successful - */ - public Maybe markAsWatched(final StreamInfoItem info) { - if (!isStreamHistoryEnabled()) { - return Maybe.empty(); - } - - final OffsetDateTime currentTime = OffsetDateTime.now(ZoneOffset.UTC); - return Maybe.fromCallable(() -> database.runInTransaction(() -> { - final long streamId; - final long duration; - // Duration will not exist if the item was loaded with fast mode, so fetch it if empty - if (info.getDuration() < 0) { - final StreamInfo completeInfo = ExtractorHelper.getStreamInfo( - info.getServiceId(), - info.getUrl(), - false - ) - .subscribeOn(Schedulers.io()) - .blockingGet(); - duration = completeInfo.getDuration(); - streamId = streamTable.upsert(new StreamEntity(completeInfo)); - } else { - duration = info.getDuration(); - streamId = streamTable.upsert(new StreamEntity(info)); - } - - // Update the stream progress to the full duration of the video - final StreamStateEntity entity = new StreamStateEntity( - streamId, - duration * 1000 - ); - streamStateTable.upsert(entity); - - // Add a history entry - final StreamHistoryEntity latestEntry = streamHistoryTable.getLatestEntry(streamId); - if (latestEntry == null) { - // never actually viewed: add history entry but with 0 views - return streamHistoryTable.insert(new StreamHistoryEntity(streamId, currentTime, 0)); - } else { - return 0L; - } - })).subscribeOn(Schedulers.io()); - } - - public Maybe onViewed(final StreamInfo info) { - if (!isStreamHistoryEnabled()) { - return Maybe.empty(); - } - - final OffsetDateTime currentTime = OffsetDateTime.now(ZoneOffset.UTC); - return Maybe.fromCallable(() -> database.runInTransaction(() -> { - final long streamId = streamTable.upsert(new StreamEntity(info)); - final StreamHistoryEntity latestEntry = streamHistoryTable.getLatestEntry(streamId); - - if (latestEntry != null) { - streamHistoryTable.delete(latestEntry); - latestEntry.setAccessDate(currentTime); - latestEntry.setRepeatCount(latestEntry.getRepeatCount() + 1); - return streamHistoryTable.insert(latestEntry); - } else { - // just viewed for the first time: set 1 view - return streamHistoryTable.insert(new StreamHistoryEntity(streamId, currentTime, 1)); - } - })).subscribeOn(Schedulers.io()); - } - - public Completable deleteStreamHistoryAndState(final long streamId) { - return Completable.fromAction(() -> { - streamStateTable.deleteState(streamId); - streamHistoryTable.deleteStreamHistory(streamId); - }).subscribeOn(Schedulers.io()); - } - - public Single deleteWholeStreamHistory() { - return Single.fromCallable(streamHistoryTable::deleteAll) - .subscribeOn(Schedulers.io()); - } - - public Single deleteCompleteStreamStateHistory() { - return Single.fromCallable(streamStateTable::deleteAll) - .subscribeOn(Schedulers.io()); - } - - public Flowable> getStreamHistorySortedById() { - return streamHistoryTable.getHistorySortedById().subscribeOn(Schedulers.io()); - } - - public Flowable> getStreamStatistics() { - return streamHistoryTable.getStatistics().subscribeOn(Schedulers.io()); - } - - private boolean isStreamHistoryEnabled() { - return sharedPreferences.getBoolean(streamHistoryKey, false); - } - - /////////////////////////////////////////////////////// - // Search History - /////////////////////////////////////////////////////// - - public Maybe onSearched(final int serviceId, final String search) { - if (!isSearchHistoryEnabled()) { - return Maybe.empty(); - } - - final OffsetDateTime currentTime = OffsetDateTime.now(ZoneOffset.UTC); - final SearchHistoryEntry newEntry = new SearchHistoryEntry(currentTime, serviceId, search); - - return Maybe.fromCallable(() -> database.runInTransaction(() -> { - final SearchHistoryEntry latestEntry = searchHistoryTable.getLatestEntry(); - if (latestEntry != null && latestEntry.hasEqualValues(newEntry)) { - latestEntry.setCreationDate(currentTime); - return (long) searchHistoryTable.update(latestEntry); - } else { - return searchHistoryTable.insert(newEntry); - } - })).subscribeOn(Schedulers.io()); - } - - public Single deleteSearchHistory(final String search) { - return Single.fromCallable(() -> searchHistoryTable.deleteAllWhereQuery(search)) - .subscribeOn(Schedulers.io()); - } - - public Single deleteCompleteSearchHistory() { - return Single.fromCallable(searchHistoryTable::deleteAll) - .subscribeOn(Schedulers.io()); - } - - public Flowable> getRelatedSearches(final String query, - final int similarQueryLimit, - final int uniqueQueryLimit) { - return query.length() > 0 - ? searchHistoryTable.getSimilarEntries(query, similarQueryLimit) - : searchHistoryTable.getUniqueEntries(uniqueQueryLimit); - } - - private boolean isSearchHistoryEnabled() { - return sharedPreferences.getBoolean(searchHistoryKey, false); - } - - /////////////////////////////////////////////////////// - // Stream State History - /////////////////////////////////////////////////////// - - public Maybe loadStreamState(final PlayQueueItem queueItem) { - return queueItem.getStream() - .map(info -> streamTable.upsert(new StreamEntity(info))) - .flatMapPublisher(streamStateTable::getState) - .firstElement() - .flatMap(list -> list.isEmpty() ? Maybe.empty() : Maybe.just(list.get(0))) - .filter(state -> state.isValid(queueItem.getDuration())) - .subscribeOn(Schedulers.io()); - } - - public Maybe loadStreamState(final StreamInfo info) { - return Single.fromCallable(() -> streamTable.upsert(new StreamEntity(info))) - .flatMapPublisher(streamStateTable::getState) - .firstElement() - .flatMap(list -> list.isEmpty() ? Maybe.empty() : Maybe.just(list.get(0))) - .filter(state -> state.isValid(info.getDuration())) - .subscribeOn(Schedulers.io()); - } - - public Completable saveStreamState(@NonNull final StreamInfo info, final long progressMillis) { - return Completable.fromAction(() -> database.runInTransaction(() -> { - final long streamId = streamTable.upsert(new StreamEntity(info)); - final StreamStateEntity state = new StreamStateEntity(streamId, progressMillis); - if (state.isValid(info.getDuration())) { - streamStateTable.upsert(state); - } - })).subscribeOn(Schedulers.io()); - } - - public Single loadStreamState(final InfoItem info) { - return Single.fromCallable(() -> { - final List entities = streamTable - .getStream(info.getServiceId(), info.getUrl()).blockingFirst(); - if (entities.isEmpty()) { - return new StreamStateEntity[]{null}; - } - final List states = streamStateTable - .getState(entities.get(0).getUid()).blockingFirst(); - if (states.isEmpty()) { - return new StreamStateEntity[]{null}; - } - return new StreamStateEntity[]{states.get(0)}; - }).subscribeOn(Schedulers.io()); - } - - public Single> loadLocalStreamStateBatch( - final List items) { - return Single.fromCallable(() -> { - final List result = new ArrayList<>(items.size()); - for (final LocalItem item : items) { - final long streamId; - if (item instanceof StreamStatisticsEntry) { - streamId = ((StreamStatisticsEntry) item).getStreamId(); - } else if (item instanceof PlaylistStreamEntity) { - streamId = ((PlaylistStreamEntity) item).getStreamUid(); - } else if (item instanceof PlaylistStreamEntry) { - streamId = ((PlaylistStreamEntry) item).getStreamId(); - } else { - result.add(null); - continue; - } - final List states = streamStateTable.getState(streamId) - .blockingFirst(); - if (states.isEmpty()) { - result.add(null); - } else { - result.add(states.get(0)); - } - } - return result; - }).subscribeOn(Schedulers.io()); - } - - /////////////////////////////////////////////////////// - // Utility - /////////////////////////////////////////////////////// - - public Single removeOrphanedRecords() { - return Single.fromCallable(streamTable::deleteOrphans).subscribeOn(Schedulers.io()); - } - -} diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt new file mode 100644 index 000000000..5976ec148 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt @@ -0,0 +1,292 @@ +/* + * SPDX-FileCopyrightText: 2018-2023 NewPipe contributors + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.local.history + +import android.content.Context +import androidx.preference.PreferenceManager +import androidx.room3.withWriteTransaction +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.core.Maybe +import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.schedulers.Schedulers +import java.time.OffsetDateTime +import java.time.ZoneOffset +import kotlinx.coroutines.runBlocking +import org.schabi.newpipe.NewPipeDatabase +import org.schabi.newpipe.R +import org.schabi.newpipe.database.LocalItem +import org.schabi.newpipe.database.history.model.SearchHistoryEntry +import org.schabi.newpipe.database.history.model.StreamHistoryEntity +import org.schabi.newpipe.database.history.model.StreamHistoryEntry +import org.schabi.newpipe.database.playlist.PlaylistStreamEntry +import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity +import org.schabi.newpipe.database.stream.StreamStatisticsEntry +import org.schabi.newpipe.database.stream.model.StreamEntity +import org.schabi.newpipe.database.stream.model.StreamStateEntity +import org.schabi.newpipe.extractor.InfoItem +import org.schabi.newpipe.extractor.stream.StreamInfo +import org.schabi.newpipe.extractor.stream.StreamInfoItem +import org.schabi.newpipe.local.feed.FeedViewModel +import org.schabi.newpipe.player.playqueue.PlayQueueItem +import org.schabi.newpipe.util.ExtractorHelper + +class HistoryRecordManager(context: Context) { + + private val database = NewPipeDatabase.getInstance(context) + private val streamTable = database.streamDAO() + private val streamHistoryTable = database.streamHistoryDAO() + private val searchHistoryTable = database.searchHistoryDAO() + private val streamStateTable = database.streamStateDAO() + + private val sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + private val searchHistoryKey = context.getString(R.string.enable_search_history_key) + private val streamHistoryKey = context.getString(R.string.enable_watch_history_key) + + private val isSearchHistoryEnabled: Boolean + get() = sharedPreferences.getBoolean(searchHistoryKey, false) + + private val isStreamHistoryEnabled: Boolean + get() = sharedPreferences.getBoolean(streamHistoryKey, false) + + ///////////////////////////////////////////////////////// + // Watch History + ///////////////////////////////////////////////////////// + + /** + * Marks a stream item as watched such that it is hidden from the feed if watched videos are + * hidden. Adds a history entry and updates the stream progress to 100%. + * + * @see FeedViewModel.setSaveShowPlayedItems + * @param info the item to mark as watched + * @return a Maybe containing the ID of the item if successful + */ + fun markAsWatched(info: StreamInfoItem): Maybe { + if (!isStreamHistoryEnabled) { + return Maybe.empty() + } + + val currentTime = OffsetDateTime.now(ZoneOffset.UTC) + + return Maybe.fromCallable { + runBlocking { + database.withWriteTransaction { + val streamId: Long + val duration: Long + + // Duration will not exist if the item was loaded with fast mode, so fetch it + // if empty + if (info.duration < 0) { + val completeInfo = ExtractorHelper.getStreamInfo( + info.serviceId, + info.url, + false + ).subscribeOn(Schedulers.io()).blockingGet() + + duration = completeInfo.duration + streamId = streamTable.upsert(StreamEntity(completeInfo)) + } else { + duration = info.duration + streamId = streamTable.upsert(StreamEntity(info)) + } + + // Update the stream progress to the full duration of the video + val entity = StreamStateEntity( + streamId, + duration * 1000 + ) + streamStateTable.upsert(entity) + + // Add a history entry + val latestEntry = streamHistoryTable.getLatestEntry(streamId) + if (latestEntry == null) { + // never actually viewed: add history entry but with 0 views + streamHistoryTable.insert(StreamHistoryEntity(streamId, currentTime, 0)) + } else { + 0L + } + } + } + }.subscribeOn(Schedulers.io()) + } + + fun onViewed(info: StreamInfo): Maybe { + if (!isStreamHistoryEnabled) { + return Maybe.empty() + } + + val currentTime = OffsetDateTime.now(ZoneOffset.UTC) + return Maybe.fromCallable { + runBlocking { + database.withWriteTransaction { + val streamId = streamTable.upsert(StreamEntity(info)) + val latestEntry = streamHistoryTable.getLatestEntry(streamId) + + if (latestEntry != null) { + streamHistoryTable.delete(latestEntry) + latestEntry.accessDate = currentTime + latestEntry.repeatCount = latestEntry.repeatCount + 1 + streamHistoryTable.insert(latestEntry) + } else { + // just viewed for the first time: set 1 view + streamHistoryTable.insert(StreamHistoryEntity(streamId, currentTime, 1)) + } + } + } + }.subscribeOn(Schedulers.io()) + } + + fun deleteStreamHistoryAndState(streamId: Long): Completable { + return Completable.fromAction { + streamStateTable.deleteState(streamId) + streamHistoryTable.deleteStreamHistory(streamId) + }.subscribeOn(Schedulers.io()) + } + + fun deleteWholeStreamHistory(): Single { + return Single.fromCallable { streamHistoryTable.deleteAll() } + .subscribeOn(Schedulers.io()) + } + + fun deleteCompleteStreamStateHistory(): Single { + return Single.fromCallable { streamStateTable.deleteAll() } + .subscribeOn(Schedulers.io()) + } + + fun getStreamHistorySortedById(): Flowable> { + return streamHistoryTable.historySortedById.subscribeOn(Schedulers.io()) + } + + fun getStreamStatistics(): Flowable> { + return streamHistoryTable.getStatistics().subscribeOn(Schedulers.io()) + } + + ///////////////////////////////////////////////////////// + // Search History + ///////////////////////////////////////////////////////// + + fun onSearched(serviceId: Int, search: String): Maybe { + if (!isSearchHistoryEnabled) { + return Maybe.empty() + } + + val currentTime = OffsetDateTime.now(ZoneOffset.UTC) + val newEntry = SearchHistoryEntry(currentTime, serviceId, search) + + return Maybe.fromCallable { + runBlocking { + database.withWriteTransaction { + val latestEntry = searchHistoryTable.latestEntry + if (latestEntry != null && latestEntry.hasEqualValues(newEntry)) { + latestEntry.creationDate = currentTime + searchHistoryTable.update(latestEntry).toLong() + } else { + searchHistoryTable.insert(newEntry) + } + } + } + }.subscribeOn(Schedulers.io()) + } + + fun deleteSearchHistory(search: String): Single { + return Single.fromCallable { searchHistoryTable.deleteAllWhereQuery(search) } + .subscribeOn(Schedulers.io()) + } + + fun deleteCompleteSearchHistory(): Single { + return Single.fromCallable { searchHistoryTable.deleteAll() } + .subscribeOn(Schedulers.io()) + } + + fun getRelatedSearches( + query: String, + similarQueryLimit: Int, + uniqueQueryLimit: Int + ): Flowable> { + return if (query.isNotEmpty()) { + searchHistoryTable.getSimilarEntries(query, similarQueryLimit) + } else { + searchHistoryTable.getUniqueEntries(uniqueQueryLimit) + } + } + + ///////////////////////////////////////////////////////// + // Stream State History + ///////////////////////////////////////////////////////// + + fun loadStreamState(queueItem: PlayQueueItem): Maybe { + return queueItem.stream + .map { info -> streamTable.upsert(StreamEntity(info)) } + .flatMapPublisher { streamId -> streamStateTable.getState(streamId) } + .firstElement() + .flatMap { list -> if (list.isEmpty()) Maybe.empty() else Maybe.just(list[0]) } + .filter { state -> state.isValid(queueItem.duration) } + .subscribeOn(Schedulers.io()) + } + + fun loadStreamState(info: StreamInfo): Maybe { + return Single.fromCallable { streamTable.upsert(StreamEntity(info)) } + .flatMapPublisher { streamId -> streamStateTable.getState(streamId) } + .firstElement() + .flatMap { list -> if (list.isEmpty()) Maybe.empty() else Maybe.just(list[0]) } + .filter { state -> state.isValid(info.duration) } + .subscribeOn(Schedulers.io()) + } + + fun saveStreamState(info: StreamInfo, progressMillis: Long): Completable { + return Completable.fromAction { + runBlocking { + database.withWriteTransaction { + val streamId = streamTable.upsert(StreamEntity(info)) + val state = StreamStateEntity(streamId, progressMillis) + if (state.isValid(info.duration)) { + streamStateTable.upsert(state) + } + } + } + }.subscribeOn(Schedulers.io()) + } + + fun loadStreamState(info: InfoItem): Maybe { + return Maybe.fromCallable { + streamTable.getStream(info.serviceId.toLong(), info.url) + .blockingFirst() + .firstOrNull() + ?.let { entity -> + streamStateTable.getState(entity.uid) + .blockingFirst() + .firstOrNull() + } + }.subscribeOn(Schedulers.io()) + } + + fun loadLocalStreamStateBatch(items: List): Single> { + return Single.fromCallable { + items.map { item -> + val streamId = when (item) { + is StreamStatisticsEntry -> item.streamId + is PlaylistStreamEntity -> item.streamUid + is PlaylistStreamEntry -> item.streamId + else -> return@map null + } + + streamStateTable.getState(streamId) + .blockingFirst() + .firstOrNull() + } + }.subscribeOn(Schedulers.io()) + } + + ///////////////////////////////////////////////////////// + // Utility + ///////////////////////////////////////////////////////// + + fun removeOrphanedRecords(): Single { + return Single.fromCallable { streamTable.deleteOrphans() } + .subscribeOn(Schedulers.io()) + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java deleted file mode 100644 index 1480735fb..000000000 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.java +++ /dev/null @@ -1,189 +0,0 @@ -package org.schabi.newpipe.local.playlist; - -import androidx.annotation.Nullable; - -import org.schabi.newpipe.database.AppDatabase; -import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry; -import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry; -import org.schabi.newpipe.database.playlist.PlaylistStreamEntry; -import org.schabi.newpipe.database.playlist.dao.PlaylistDAO; -import org.schabi.newpipe.database.playlist.dao.PlaylistStreamDAO; -import org.schabi.newpipe.database.playlist.model.PlaylistEntity; -import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity; -import org.schabi.newpipe.database.stream.dao.StreamDAO; -import org.schabi.newpipe.database.stream.model.StreamEntity; - -import java.util.ArrayList; -import java.util.List; - -import io.reactivex.rxjava3.core.Completable; -import io.reactivex.rxjava3.core.Flowable; -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.schedulers.Schedulers; - -public class LocalPlaylistManager { - private static final long THUMBNAIL_ID_LEAVE_UNCHANGED = -2; - - private final AppDatabase database; - private final StreamDAO streamTable; - private final PlaylistDAO playlistTable; - private final PlaylistStreamDAO playlistStreamTable; - - public LocalPlaylistManager(final AppDatabase db) { - database = db; - streamTable = db.streamDAO(); - playlistTable = db.playlistDAO(); - playlistStreamTable = db.playlistStreamDAO(); - } - - public Maybe> createPlaylist(final String name, final List streams) { - // Disallow creation of empty playlists - if (streams.isEmpty()) { - return Maybe.empty(); - } - - // Save to the database directly. - // Make sure the new playlist is always on the top of bookmark. - // The index will be reassigned to non-negative number in BookmarkFragment. - return Maybe.fromCallable(() -> database.runInTransaction(() -> { - final List streamIds = streamTable.upsertAll(streams); - final PlaylistEntity newPlaylist = new PlaylistEntity(name, false, - streamIds.get(0), -1); - - return insertJoinEntities(playlistTable.insert(newPlaylist), - streamIds, 0); - } - )).subscribeOn(Schedulers.io()); - } - - public Maybe> appendToPlaylist(final long playlistId, - final List streams) { - return playlistStreamTable.getMaximumIndexOf(playlistId) - .firstElement() - .map(maxJoinIndex -> database.runInTransaction(() -> { - final List streamIds = streamTable.upsertAll(streams); - return insertJoinEntities(playlistId, streamIds, maxJoinIndex + 1); - } - )).subscribeOn(Schedulers.io()); - } - - private List insertJoinEntities(final long playlistId, final List streamIds, - final int indexOffset) { - - final List joinEntities = new ArrayList<>(streamIds.size()); - - for (int index = 0; index < streamIds.size(); index++) { - joinEntities.add(new PlaylistStreamEntity(playlistId, streamIds.get(index), - index + indexOffset)); - } - return playlistStreamTable.insertAll(joinEntities); - } - - public Completable updateJoin(final long playlistId, final List streamIds) { - final List joinEntities = new ArrayList<>(streamIds.size()); - for (int i = 0; i < streamIds.size(); i++) { - joinEntities.add(new PlaylistStreamEntity(playlistId, streamIds.get(i), i)); - } - - return Completable.fromRunnable(() -> database.runInTransaction(() -> { - playlistStreamTable.deleteBatch(playlistId); - playlistStreamTable.insertAll(joinEntities); - })).subscribeOn(Schedulers.io()); - } - - public Completable updatePlaylists(final List updateItems, - final List deletedItems) { - final List items = new ArrayList<>(updateItems.size()); - for (final PlaylistMetadataEntry item : updateItems) { - items.add(new PlaylistEntity(item)); - } - return Completable.fromRunnable(() -> database.runInTransaction(() -> { - for (final Long uid : deletedItems) { - playlistTable.deletePlaylist(uid); - } - for (final PlaylistEntity item : items) { - playlistTable.upsertPlaylist(item); - } - })).subscribeOn(Schedulers.io()); - } - - public Flowable> getDistinctPlaylistStreams(final long playlistId) { - return playlistStreamTable - .getStreamsWithoutDuplicates(playlistId).subscribeOn(Schedulers.io()); - } - - /** - * Get playlists with attached information about how many times the provided stream is already - * contained in each playlist. - * - * @param streamUrl the stream url for which to check for duplicates - * @return a list of {@link PlaylistDuplicatesEntry} - */ - public Flowable> getPlaylistDuplicates(final String streamUrl) { - return playlistStreamTable.getPlaylistDuplicatesMetadata(streamUrl) - .subscribeOn(Schedulers.io()); - } - - public Flowable> getPlaylists() { - return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io()); - } - - public Flowable> getPlaylistStreams(final long playlistId) { - return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io()); - } - - public Maybe renamePlaylist(final long playlistId, final String name) { - return modifyPlaylist(playlistId, name, THUMBNAIL_ID_LEAVE_UNCHANGED, false); - } - - public Maybe changePlaylistThumbnail(final long playlistId, - final long thumbnailStreamId, - final boolean isPermanent) { - return modifyPlaylist(playlistId, null, thumbnailStreamId, isPermanent); - } - - public long getPlaylistThumbnailStreamId(final long playlistId) { - return playlistTable.getPlaylist(playlistId).blockingFirst().get(0).getThumbnailStreamId(); - } - - public boolean getIsPlaylistThumbnailPermanent(final long playlistId) { - return playlistTable.getPlaylist(playlistId).blockingFirst().get(0) - .isThumbnailPermanent(); - } - - public long getAutomaticPlaylistThumbnailStreamId(final long playlistId) { - final long streamId = playlistStreamTable.getAutomaticThumbnailStreamId(playlistId) - .blockingFirst(); - if (streamId < 0) { - return PlaylistEntity.DEFAULT_THUMBNAIL_ID; - } - return streamId; - } - - private Maybe modifyPlaylist(final long playlistId, - @Nullable final String name, - final long thumbnailStreamId, - final boolean isPermanent) { - return playlistTable.getPlaylist(playlistId) - .firstElement() - .filter(playlistEntities -> !playlistEntities.isEmpty()) - .map(playlistEntities -> { - final PlaylistEntity playlist = playlistEntities.get(0); - if (name != null) { - playlist.setName(name); - } - if (thumbnailStreamId != THUMBNAIL_ID_LEAVE_UNCHANGED) { - playlist.setThumbnailStreamId(thumbnailStreamId); - playlist.setThumbnailPermanent(isPermanent); - } - return playlistTable.update(playlist); - }).subscribeOn(Schedulers.io()); - } - - public Maybe hasPlaylists() { - return playlistTable.getCount() - .firstElement() - .map(count -> count > 0) - .subscribeOn(Schedulers.io()); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt new file mode 100644 index 000000000..d914ca72c --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt @@ -0,0 +1,181 @@ +/* + * SPDX-FileCopyrightText: 2018-2024 NewPipe contributors + * SPDX-FileCopyrightText: 2025-2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package org.schabi.newpipe.local.playlist + +import androidx.room3.withWriteTransaction +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.core.Maybe +import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.runBlocking +import org.schabi.newpipe.database.AppDatabase +import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry +import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry +import org.schabi.newpipe.database.playlist.PlaylistStreamEntry +import org.schabi.newpipe.database.playlist.model.PlaylistEntity +import org.schabi.newpipe.database.playlist.model.PlaylistStreamEntity +import org.schabi.newpipe.database.stream.model.StreamEntity + +class LocalPlaylistManager(private val database: AppDatabase) { + + private val streamTable = database.streamDAO() + private val playlistTable = database.playlistDAO() + private val playlistStreamTable = database.playlistStreamDAO() + + fun createPlaylist(name: String, streams: List): Maybe> { + // Disallow creation of empty playlists + if (streams.isEmpty()) { + return Maybe.empty() + } + + // Save to the database directly. + // Make sure the new playlist is always on the top of bookmark. + // The index will be reassigned to non-negative number in BookmarkFragment. + return Maybe.fromCallable { + runBlocking { + database.withWriteTransaction { + val streamIds = streamTable.upsertAll(streams) + val newPlaylist = PlaylistEntity( + name = name, + isThumbnailPermanent = false, + thumbnailStreamId = streamIds[0], + displayIndex = -1 + ) + insertJoinEntities(playlistTable.insert(newPlaylist), streamIds, 0) + } + } + }.subscribeOn(Schedulers.io()) + } + + fun appendToPlaylist(playlistId: Long, streams: List): Maybe> { + return playlistStreamTable.getMaximumIndexOf(playlistId) + .firstElement() + .map { maxJoinIndex -> + runBlocking { + database.withWriteTransaction> { + val streamIds = streamTable.upsertAll(streams) + insertJoinEntities(playlistId, streamIds, maxJoinIndex + 1) + } + } + }.subscribeOn(Schedulers.io()) + } + + private fun insertJoinEntities( + playlistId: Long, + streamIds: List, + indexOffset: Int + ): List { + val entities = streamIds.mapIndexed { index, streamId -> + PlaylistStreamEntity(playlistId, streamId, index + indexOffset) + } + return playlistStreamTable.insertAll(entities) + } + + fun updateJoin(playlistId: Long, streamIds: List): Completable { + val joinEntities = streamIds.mapIndexed { index, streamId -> + PlaylistStreamEntity(playlistId, streamId, index) + } + + return Completable.fromAction { + playlistStreamTable.updatePlaylistStreams(playlistId, joinEntities) + }.subscribeOn(Schedulers.io()) + } + + fun updatePlaylists( + updateItems: List, + deletedItems: List + ): Completable { + return Completable.fromRunnable { + playlistTable.updatePlaylists(updateItems = updateItems, deletedItems = deletedItems) + }.subscribeOn(Schedulers.io()) + } + + fun getDistinctPlaylistStreams(playlistId: Long): Flowable> { + return playlistStreamTable + .getStreamsWithoutDuplicates(playlistId) + .subscribeOn(Schedulers.io()) + } + + /** + * Get playlists with attached information about how many times the provided stream is already + * contained in each playlist. + * + * @param streamUrl the stream url for which to check for duplicates + * @return a list of [PlaylistDuplicatesEntry] + */ + fun getPlaylistDuplicates(streamUrl: String): Flowable> { + return playlistStreamTable.getPlaylistDuplicatesMetadata(streamUrl) + .subscribeOn(Schedulers.io()) + } + + fun getPlaylists(): Flowable> { + return playlistStreamTable.getPlaylistMetadata().subscribeOn(Schedulers.io()) + } + + fun getPlaylistStreams(playlistId: Long): Flowable> { + return playlistStreamTable.getOrderedStreamsOf(playlistId).subscribeOn(Schedulers.io()) + } + + fun renamePlaylist(playlistId: Long, name: String): Maybe { + return modifyPlaylist(playlistId, name, THUMBNAIL_ID_LEAVE_UNCHANGED, false) + } + + fun changePlaylistThumbnail( + playlistId: Long, + thumbnailStreamId: Long, + isPermanent: Boolean + ): Maybe { + return modifyPlaylist(playlistId, null, thumbnailStreamId, isPermanent) + } + + fun getPlaylistThumbnailStreamId(playlistId: Long): Long { + return playlistTable.getPlaylist(playlistId).blockingFirst()[0].thumbnailStreamId + } + + fun getIsPlaylistThumbnailPermanent(playlistId: Long): Boolean { + return playlistTable.getPlaylist(playlistId).blockingFirst()[0].isThumbnailPermanent + } + + fun getAutomaticPlaylistThumbnailStreamId(playlistId: Long): Long { + val streamId = playlistStreamTable.getAutomaticThumbnailStreamId(playlistId) + .blockingFirst() + return if (streamId < 0) PlaylistEntity.DEFAULT_THUMBNAIL_ID else streamId + } + + private fun modifyPlaylist( + playlistId: Long, + name: String?, + thumbnailStreamId: Long, + isPermanent: Boolean + ): Maybe { + return playlistTable.getPlaylist(playlistId) + .firstElement() + .filter { playlistEntities -> playlistEntities.isNotEmpty() } + .map { playlistEntities -> + val playlist = playlistEntities[0] + if (name != null) { + playlist.name = name + } + if (thumbnailStreamId != THUMBNAIL_ID_LEAVE_UNCHANGED) { + playlist.thumbnailStreamId = thumbnailStreamId + playlist.isThumbnailPermanent = isPermanent + } + playlistTable.update(playlist) + }.subscribeOn(Schedulers.io()) + } + + fun hasPlaylists(): Maybe { + return playlistTable.count + .firstElement() + .map { count -> count > 0 } + .subscribeOn(Schedulers.io()) + } + + companion object { + private const val THUMBNAIL_ID_LEAVE_UNCHANGED = -2L + } +} diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistViewModel.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistViewModel.kt index 954449bb4..67024df5a 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistViewModel.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistViewModel.kt @@ -43,7 +43,7 @@ class LocalPlaylistViewModel(application: Application) : AndroidViewModel(applic fun removeWatchedStreams(playlistId: Long, removePartiallyWatched: Boolean) { _workState.value = WorkState.Loading - val historyIdsMaybe = recordManager.streamHistorySortedById + val historyIdsMaybe = recordManager.getStreamHistorySortedById() .firstElement() .map { historyList -> historyList.map { it.streamId } From b44894e849c29c94c179751607a5fd25a1017514 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Fri, 16 Oct 2026 19:03:27 +0800 Subject: [PATCH 124/155] Migrate tests to use new room v3.x APIs Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 2 + .../newpipe/database/DatabaseMigrationTest.kt | 308 +++++++++--------- .../schabi/newpipe/database/FeedDAOTest.kt | 11 +- .../playlist/LocalPlaylistManagerTest.kt | 2 +- .../schabi/newpipe/testUtil/TestDatabase.kt | 2 +- .../org/schabi/newpipe/database/Migrations.kt | 38 +-- .../local/history/HistoryRecordManager.kt | 16 +- gradle/libs.versions.toml | 5 +- 8 files changed, 192 insertions(+), 192 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 538d1fd19..6e05fc523 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -327,6 +327,8 @@ dependencies { androidTestImplementation(libs.androidx.runner) androidTestImplementation(libs.androidx.room.testing) androidTestImplementation(libs.assertj.core) + androidTestImplementation(libs.androidx.sqlite.bundled) + androidTestImplementation(libs.jetbrains.coroutines.test) } aboutLibraries { diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index fd551b7b8..70e47afa0 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -1,12 +1,13 @@ package org.schabi.newpipe.database -import android.content.ContentValues -import android.database.sqlite.SQLiteDatabase -import androidx.room.Room -import androidx.room.testing.MigrationTestHelper +import androidx.room3.Room +import androidx.room3.testing.MigrationTestHelper +import androidx.sqlite.driver.bundled.BundledSQLiteDriver +import androidx.sqlite.execSQL import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertNotEquals import org.junit.Assert.assertNull @@ -37,95 +38,84 @@ class DatabaseMigrationTest { private const val DEFAULT_THIRD_URL = "https://www.youtube.com/watch?v=dQw4w9WgXcQ" } + private val instrumentation = InstrumentationRegistry.getInstrumentation() + @get:Rule val testHelper = MigrationTestHelper( - InstrumentationRegistry.getInstrumentation(), - AppDatabase::class.java + instrumentation = instrumentation, + databaseClass = AppDatabase::class, + driver = BundledSQLiteDriver(), + file = instrumentation.targetContext.getDatabasePath(AppDatabase.DATABASE_NAME) ) @Test - fun migrateDatabaseFrom2to3() { - val databaseInV2 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_2) + fun migrateDatabaseFrom2to3() = runTest { + val databaseInV2 = testHelper.createDatabase(version = Migrations.DB_VER_2) databaseInV2.run { - insert( - "streams", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("service_id", DEFAULT_SERVICE_ID) - put("url", DEFAULT_URL) - put("title", DEFAULT_TITLE) - put("stream_type", DEFAULT_TYPE.name) - put("duration", DEFAULT_DURATION) - put("uploader", DEFAULT_UPLOADER_NAME) - put("thumbnail_url", DEFAULT_THUMBNAIL) - } - ) - insert( - "streams", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("service_id", DEFAULT_SECOND_SERVICE_ID) - put("url", DEFAULT_SECOND_URL) - } - ) - insert( - "streams", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("service_id", DEFAULT_SERVICE_ID) - } - ) + val sql = """ + INSERT OR FAIL INTO streams + (service_id, url, title, stream_type, duration, uploader, thumbnail_url) + VALUES (?, ?, ?, ?, ?, ?, ?) + """.trimIndent() + + prepare(sql).use { statement -> + statement.bindInt(1, DEFAULT_SERVICE_ID) + statement.bindText(2, DEFAULT_URL) + statement.bindText(3, DEFAULT_TITLE) + statement.bindText(4, DEFAULT_TYPE.name) + statement.bindLong(5, DEFAULT_DURATION) + statement.bindText(6, DEFAULT_UPLOADER_NAME) + statement.bindText(7, DEFAULT_THUMBNAIL) + statement.step() + } + + prepare(sql).use { statement -> + statement.bindInt(1, DEFAULT_SECOND_SERVICE_ID) + statement.bindText(2, DEFAULT_SECOND_URL) + statement.step() + } + + prepare(sql).use { statement -> + statement.bindInt(1, DEFAULT_SERVICE_ID) + statement.step() + } close() } testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_3, - true, - Migrations.MIGRATION_2_3 + version = Migrations.DB_VER_3, + migrations = listOf(Migrations.MIGRATION_2_3) ) testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_4, - true, - Migrations.MIGRATION_3_4 + version = Migrations.DB_VER_4, + migrations = listOf(Migrations.MIGRATION_3_4) ) testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_5, - true, - Migrations.MIGRATION_4_5 + version = Migrations.DB_VER_5, + migrations = listOf(Migrations.MIGRATION_4_5) ) testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_6, - true, - Migrations.MIGRATION_5_6 + version = Migrations.DB_VER_6, + migrations = listOf(Migrations.MIGRATION_5_6) ) testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_7, - true, - Migrations.MIGRATION_6_7 + version = Migrations.DB_VER_7, + migrations = listOf(Migrations.MIGRATION_6_7) ) testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_8, - true, - Migrations.MIGRATION_7_8 + version = Migrations.DB_VER_8, + migrations = listOf(Migrations.MIGRATION_7_8) ) testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_9, - true, - Migrations.MIGRATION_8_9 + version = Migrations.DB_VER_9, + migrations = listOf(Migrations.MIGRATION_8_9) ) val migratedDatabaseV3 = getMigratedDatabase() @@ -163,8 +153,8 @@ class DatabaseMigrationTest { } @Test - fun migrateDatabaseFrom7to8() { - val databaseInV7 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_7) + fun migrateDatabaseFrom7to8() = runTest { + val databaseInV7 = testHelper.createDatabase(version = Migrations.DB_VER_7) val defaultSearch1 = " abc " val defaultSearch2 = " abc" @@ -175,53 +165,43 @@ class DatabaseMigrationTest { val otherServiceId = ServiceList.SoundCloud.serviceId databaseInV7.run { - insert( - "search_history", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("service_id", serviceId) - put("search", defaultSearch1) - } - ) - insert( - "search_history", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("service_id", serviceId) - put("search", defaultSearch2) - } - ) - insert( - "search_history", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("service_id", otherServiceId) - put("search", defaultSearch1) - } - ) - insert( - "search_history", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("service_id", otherServiceId) - put("search", defaultSearch2) - } - ) + val sql = "INSERT OR FAIL INTO search_history (service_id, search) VALUES (?, ?)" + + prepare(sql).use { statement -> + statement.bindInt(1, serviceId) + statement.bindText(2, defaultSearch1) + statement.step() + } + + prepare(sql).use { statement -> + statement.bindInt(1, serviceId) + statement.bindText(2, defaultSearch2) + statement.step() + } + + prepare(sql).use { statement -> + statement.bindInt(1, otherServiceId) + statement.bindText(2, defaultSearch1) + statement.step() + } + + prepare(sql).use { statement -> + statement.bindInt(1, otherServiceId) + statement.bindText(2, defaultSearch2) + statement.step() + } + close() } testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_8, - true, - Migrations.MIGRATION_7_8 + version = Migrations.DB_VER_8, + migrations = listOf(Migrations.MIGRATION_7_8) ) testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_9, - true, - Migrations.MIGRATION_8_9 + version = Migrations.DB_VER_9, + migrations = listOf(Migrations.MIGRATION_8_9) ) val migratedDatabaseV8 = getMigratedDatabase() @@ -234,66 +214,82 @@ class DatabaseMigrationTest { } @Test - fun migrateDatabaseFrom8to9() { - val databaseInV8 = testHelper.createDatabase(AppDatabase.DATABASE_NAME, Migrations.DB_VER_8) + fun migrateDatabaseFrom8to9() = runTest { + val databaseInV8 = testHelper.createDatabase(version = Migrations.DB_VER_8) val localUid1: Long val localUid2: Long val remoteUid1: Long val remoteUid2: Long + databaseInV8.run { - localUid1 = insert( - "playlists", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("name", DEFAULT_NAME + "1") - put("is_thumbnail_permanent", false) - put("thumbnail_stream_id", -1) - } - ) - localUid2 = insert( - "playlists", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("name", DEFAULT_NAME + "2") - put("is_thumbnail_permanent", false) - put("thumbnail_stream_id", -1) - } - ) - delete( - "playlists", - "uid = ?", - Array(1) { localUid1 } - ) - remoteUid1 = insert( - "remote_playlists", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("service_id", DEFAULT_SERVICE_ID) - put("url", DEFAULT_URL) - } - ) - remoteUid2 = insert( - "remote_playlists", - SQLiteDatabase.CONFLICT_FAIL, - ContentValues().apply { - put("service_id", DEFAULT_SECOND_SERVICE_ID) - put("url", DEFAULT_SECOND_URL) - } - ) - delete( - "remote_playlists", - "uid = ?", - Array(1) { remoteUid2 } - ) + val remotePlaylistsSQL = """ + INSERT OR FAIL INTO remote_playlists + (service_id, url) + VALUES (?, ?) + """.trimIndent() + val playlistsSQL = """ + INSERT OR FAIL INTO playlists + (name, is_thumbnail_permanent, thumbnail_stream_id) + VALUES (?, ?, ?) + """.trimIndent() + + prepare(playlistsSQL).use { statement -> + statement.bindText(1, DEFAULT_NAME + "1") + statement.bindBoolean(2, false) + statement.bindInt(3, -1) + statement.step() + } + + prepare("SELECT MAX(uid) FROM playlists").use { statement -> + statement.step() + localUid1 = statement.getLong(0) + } + + prepare(playlistsSQL).use { statement -> + statement.bindText(1, DEFAULT_NAME + "2") + statement.bindBoolean(2, false) + statement.bindInt(3, -1) + statement.step() + } + + prepare("SELECT MAX(uid) FROM playlists").use { statement -> + statement.step() + localUid2 = statement.getLong(0) + } + + execSQL("DELETE FROM playlists WHERE uid = $localUid1") + + prepare(remotePlaylistsSQL).use { statement -> + statement.bindInt(1, DEFAULT_SERVICE_ID) + statement.bindText(2, DEFAULT_URL) + statement.step() + } + + prepare("SELECT MAX(uid) FROM remote_playlists").use { statement -> + statement.step() + remoteUid1 = statement.getLong(0) + } + + prepare(remotePlaylistsSQL).use { statement -> + statement.bindInt(1, DEFAULT_SECOND_SERVICE_ID) + statement.bindText(2, DEFAULT_SECOND_URL) + statement.step() + } + + prepare("SELECT MAX(uid) FROM remote_playlists").use { statement -> + statement.step() + remoteUid2 = statement.getLong(0) + } + + execSQL("DELETE FROM remote_playlists WHERE uid = $remoteUid2") + close() } testHelper.runMigrationsAndValidate( - AppDatabase.DATABASE_NAME, - Migrations.DB_VER_9, - true, - Migrations.MIGRATION_8_9 + version = Migrations.DB_VER_9, + migrations = listOf(Migrations.MIGRATION_8_9) ) val migratedDatabaseV9 = getMigratedDatabase() diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt index a61caad06..0347dcbba 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/FeedDAOTest.kt @@ -1,11 +1,12 @@ package org.schabi.newpipe.database import android.content.Context -import androidx.room.Room +import androidx.room3.Room import androidx.test.core.app.ApplicationProvider import io.reactivex.rxjava3.core.Single import java.io.IOException import java.time.OffsetDateTime +import kotlinx.coroutines.test.runTest import org.junit.After import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull @@ -68,7 +69,7 @@ class FeedDAOTest { } @Test - fun testUnlinkStreamsOlderThan_KeepOne() { + fun testUnlinkStreamsOlderThan_KeepOne() = runTest { setupUnlinkDelete("2023-08-15T00:00:00Z") val streams = feedDAO.getStreams( FeedGroupEntity.GROUP_ALL_ID, @@ -82,7 +83,7 @@ class FeedDAOTest { } @Test - fun testUnlinkStreamsOlderThan_KeepMultiple() { + fun testUnlinkStreamsOlderThan_KeepMultiple() = runTest { setupUnlinkDelete("2023-08-01T00:00:00Z") val streams = feedDAO.getStreams( FeedGroupEntity.GROUP_ALL_ID, @@ -106,7 +107,7 @@ class FeedDAOTest { ) } - private fun setupUnlinkDelete(time: String) { + private suspend fun setupUnlinkDelete(time: String) { clearAndFillTables() Single.fromCallable { feedDAO.unlinkStreamsOlderThan(OffsetDateTime.parse(time)) @@ -116,7 +117,7 @@ class FeedDAOTest { }.blockingSubscribe() } - private fun clearAndFillTables() { + private suspend fun clearAndFillTables() { db.clearAllTables() streamDAO.insertAll(allStreams) subscriptionDAO.insertAll( diff --git a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt index ac9e84228..71be85c88 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/local/playlist/LocalPlaylistManagerTest.kt @@ -56,7 +56,7 @@ class LocalPlaylistManagerTest { // This should not behave like this. // It should throw an error because currently the result is null result.test().await().assertComplete() - manager.playlists.test().awaitCount(1).assertValue(emptyList()) + manager.getPlaylists().test().awaitCount(1).assertValue(mutableListOf()) } @Test() diff --git a/app/src/androidTest/java/org/schabi/newpipe/testUtil/TestDatabase.kt b/app/src/androidTest/java/org/schabi/newpipe/testUtil/TestDatabase.kt index 8b1a261be..9c0ec196e 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/testUtil/TestDatabase.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/testUtil/TestDatabase.kt @@ -1,6 +1,6 @@ package org.schabi.newpipe.testUtil -import androidx.room.Room +import androidx.room3.Room import androidx.test.core.app.ApplicationProvider import org.junit.Assert.assertSame import org.schabi.newpipe.NewPipeDatabase diff --git a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt index 0aa608264..62908f0bd 100644 --- a/app/src/main/java/org/schabi/newpipe/database/Migrations.kt +++ b/app/src/main/java/org/schabi/newpipe/database/Migrations.kt @@ -293,18 +293,18 @@ object Migrations { // Create a temp table to initialize display_index. connection.execSQL( "CREATE TABLE `playlists_tmp` " + - "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - "`name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, " + - "`thumbnail_stream_id` INTEGER NOT NULL, " + - "`display_index` INTEGER NOT NULL)" + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`name` TEXT, `is_thumbnail_permanent` INTEGER NOT NULL, " + + "`thumbnail_stream_id` INTEGER NOT NULL, " + + "`display_index` INTEGER NOT NULL)" ) connection.execSQL( "INSERT INTO `playlists_tmp` " + - "(`uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + - "`display_index`) " + - "SELECT `uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + - "-1 " + - "FROM `playlists`" + "(`uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + + "`display_index`) " + + "SELECT `uid`, `name`, `is_thumbnail_permanent`, `thumbnail_stream_id`, " + + "-1 " + + "FROM `playlists`" ) // Replace the old table, note that this also removes the index on the name which @@ -316,18 +316,18 @@ object Migrations { // Create a temp table to initialize display_index. connection.execSQL( "CREATE TABLE `remote_playlists_tmp` " + - "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + - "`thumbnail_url` TEXT, `uploader` TEXT, " + - "`display_index` INTEGER NOT NULL," + - "`stream_count` INTEGER)" + "(`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + "`service_id` INTEGER NOT NULL, `name` TEXT, `url` TEXT, " + + "`thumbnail_url` TEXT, `uploader` TEXT, " + + "`display_index` INTEGER NOT NULL," + + "`stream_count` INTEGER)" ) connection.execSQL( "INSERT INTO `remote_playlists_tmp` (`uid`, `service_id`, " + - "`name`, `url`, `thumbnail_url`, `uploader`, `display_index`, " + - "`stream_count`)" + - "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " + - "-1, `stream_count` FROM `remote_playlists`" + "`name`, `url`, `thumbnail_url`, `uploader`, `display_index`, " + + "`stream_count`)" + + "SELECT `uid`, `service_id`, `name`, `url`, `thumbnail_url`, `uploader`, " + + "-1, `stream_count` FROM `remote_playlists`" ) // Replace the old table, note that this also removes the index on the name which @@ -338,7 +338,7 @@ object Migrations { // Create index on the new table. connection.execSQL( "CREATE UNIQUE INDEX `index_remote_playlists_service_id_url` " + - "ON `remote_playlists` (`service_id`, `url`)" + "ON `remote_playlists` (`service_id`, `url`)" ) } } diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt index 5976ec148..886437a21 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt @@ -53,9 +53,9 @@ class HistoryRecordManager(context: Context) { private val isStreamHistoryEnabled: Boolean get() = sharedPreferences.getBoolean(streamHistoryKey, false) - ///////////////////////////////////////////////////////// + // /////////////////////////////////////////////////////// // Watch History - ///////////////////////////////////////////////////////// + // /////////////////////////////////////////////////////// /** * Marks a stream item as watched such that it is hidden from the feed if watched videos are @@ -165,9 +165,9 @@ class HistoryRecordManager(context: Context) { return streamHistoryTable.getStatistics().subscribeOn(Schedulers.io()) } - ///////////////////////////////////////////////////////// + // /////////////////////////////////////////////////////// // Search History - ///////////////////////////////////////////////////////// + // /////////////////////////////////////////////////////// fun onSearched(serviceId: Int, search: String): Maybe { if (!isSearchHistoryEnabled) { @@ -214,9 +214,9 @@ class HistoryRecordManager(context: Context) { } } - ///////////////////////////////////////////////////////// + // /////////////////////////////////////////////////////// // Stream State History - ///////////////////////////////////////////////////////// + // /////////////////////////////////////////////////////// fun loadStreamState(queueItem: PlayQueueItem): Maybe { return queueItem.stream @@ -281,9 +281,9 @@ class HistoryRecordManager(context: Context) { }.subscribeOn(Schedulers.io()) } - ///////////////////////////////////////////////////////// + // /////////////////////////////////////////////////////// // Utility - ///////////////////////////////////////////////////////// + // /////////////////////////////////////////////////////// fun removeOrphanedRecords(): Single { return Single.fromCallable { streamTable.deleteOrphans() } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a94c09fe1..c61316883 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -61,9 +61,9 @@ rxbinding = "4.0.0" rxjava = "3.1.12" settings = "1.3.0" sonarqube = "7.5.0.8588" +sqlite = "2.7.1" statesaver = "1.4.1" # TODO: Drop because it is deprecated and incompatible with KSP2 stetho = "1.6.0" -sqlite = "2.7.1" swiperefreshlayout = "1.2.0" # You can use a local version by uncommenting a few lines in settings.gradle # Or you can use a commit you pushed to GitHub by just replacing TeamNewPipe with your GitHub @@ -105,8 +105,8 @@ androidx-room-runtime = { module = "androidx.room3:room3-runtime", version.ref = androidx-room-rxjava3 = { module = "androidx.room3:room3-rxjava3", version.ref = "room" } androidx-room-testing = { module = "androidx.room3:room3-testing", version.ref = "room" } androidx-runner = { module = "androidx.test:runner", version.ref = "runner" } -androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" } androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" } +androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" } androidx-test-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso" } androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" } androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } @@ -140,6 +140,7 @@ jetbrains-compose-test-ui = { module = "org.jetbrains.compose.ui:ui-test", versi jetbrains-compose-tooling = { module = "org.jetbrains.compose.ui:ui-tooling", version.ref = "multiplatform" } jetbrains-compose-ui = { module = "org.jetbrains.compose.ui:ui", version.ref = "multiplatform" } jetbrains-coroutines-swing = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-swing", version.ref = "coroutines" } +jetbrains-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } jetbrains-lifecycle-navigation3 = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "lifecycle" } jetbrains-lifecycle-viewmodel = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" } jetbrains-navigation3-ui = { module = "org.jetbrains.androidx.navigation3:navigation3-ui", version.ref = "navigation3" } From 638c5ae4fa46a06e5a7576697c3a339944f487ef Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Oct 2026 14:50:52 +0800 Subject: [PATCH 125/155] Migrate database migration tests to use SQLiteConnection APIs Signed-off-by: Aayush Gupta --- .../newpipe/database/DatabaseMigrationTest.kt | 330 ++++++++++-------- 1 file changed, 188 insertions(+), 142 deletions(-) diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index 70e47afa0..19ead419b 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -9,8 +9,6 @@ import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals -import org.junit.Assert.assertNotEquals -import org.junit.Assert.assertNull import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -83,73 +81,62 @@ class DatabaseMigrationTest { close() } - testHelper.runMigrationsAndValidate( + val migratedConnection = testHelper.runMigrationsAndValidate( version = Migrations.DB_VER_3, migrations = listOf(Migrations.MIGRATION_2_3) ) - testHelper.runMigrationsAndValidate( - version = Migrations.DB_VER_4, - migrations = listOf(Migrations.MIGRATION_3_4) - ) - - testHelper.runMigrationsAndValidate( - version = Migrations.DB_VER_5, - migrations = listOf(Migrations.MIGRATION_4_5) - ) - - testHelper.runMigrationsAndValidate( - version = Migrations.DB_VER_6, - migrations = listOf(Migrations.MIGRATION_5_6) - ) - - testHelper.runMigrationsAndValidate( - version = Migrations.DB_VER_7, - migrations = listOf(Migrations.MIGRATION_6_7) - ) - - testHelper.runMigrationsAndValidate( - version = Migrations.DB_VER_8, - migrations = listOf(Migrations.MIGRATION_7_8) - ) - - testHelper.runMigrationsAndValidate( - version = Migrations.DB_VER_9, - migrations = listOf(Migrations.MIGRATION_8_9) - ) - - val migratedDatabaseV3 = getMigratedDatabase() - val listFromDB = migratedDatabaseV3.streamDAO().getAll().blockingFirst() - // Only expect 2, the one with the null url will be ignored - assertEquals(2, listFromDB.size) + migratedConnection.prepare("SELECT (COUNT(*) = 2) FROM streams").use { statement -> + statement.step() + assert(statement.getBoolean(0)) + } - val streamFromMigratedDatabase = listFromDB[0] - assertEquals(DEFAULT_SERVICE_ID, streamFromMigratedDatabase.serviceId) - assertEquals(DEFAULT_URL, streamFromMigratedDatabase.url) - assertEquals(DEFAULT_TITLE, streamFromMigratedDatabase.title) - assertEquals(DEFAULT_TYPE, streamFromMigratedDatabase.streamType) - assertEquals(DEFAULT_DURATION, streamFromMigratedDatabase.duration) - assertEquals(DEFAULT_UPLOADER_NAME, streamFromMigratedDatabase.uploader) - assertEquals(DEFAULT_THUMBNAIL, streamFromMigratedDatabase.thumbnailUrl) - assertNull(streamFromMigratedDatabase.viewCount) - assertNull(streamFromMigratedDatabase.textualUploadDate) - assertNull(streamFromMigratedDatabase.uploadDate) - assertNull(streamFromMigratedDatabase.isUploadDateApproximation) + // Verify first stream exists + migratedConnection.prepare( + """ + SELECT (COUNT(*) = 1) FROM streams + WHERE + service_id = $DEFAULT_SERVICE_ID AND + url = '$DEFAULT_URL' AND + title = '$DEFAULT_TITLE' AND + stream_type = '${DEFAULT_TYPE.name}' AND + duration = $DEFAULT_DURATION AND + uploader = '$DEFAULT_UPLOADER_NAME' AND + thumbnail_url = '$DEFAULT_THUMBNAIL' AND + view_count IS NULL AND + textual_upload_date IS NULL AND + upload_date IS NULL AND + is_upload_date_approximation IS NULL + """.trimIndent() + ).use { statement -> + statement.step() + assert(statement.getBoolean(0)) + } - val secondStreamFromMigratedDatabase = listFromDB[1] - assertEquals(DEFAULT_SECOND_SERVICE_ID, secondStreamFromMigratedDatabase.serviceId) - assertEquals(DEFAULT_SECOND_URL, secondStreamFromMigratedDatabase.url) - assertEquals("", secondStreamFromMigratedDatabase.title) - // Should fallback to VIDEO_STREAM - assertEquals(StreamType.VIDEO_STREAM, secondStreamFromMigratedDatabase.streamType) - assertEquals(0, secondStreamFromMigratedDatabase.duration) - assertEquals("", secondStreamFromMigratedDatabase.uploader) - assertEquals("", secondStreamFromMigratedDatabase.thumbnailUrl) - assertNull(secondStreamFromMigratedDatabase.viewCount) - assertNull(secondStreamFromMigratedDatabase.textualUploadDate) - assertNull(secondStreamFromMigratedDatabase.uploadDate) - assertNull(secondStreamFromMigratedDatabase.isUploadDateApproximation) + // Verify second stream exists + migratedConnection.prepare( + """ + SELECT (COUNT(*) = 1) FROM streams + WHERE + service_id = $DEFAULT_SECOND_SERVICE_ID AND + url = '$DEFAULT_SECOND_URL' AND + title = '' AND + stream_type = '${StreamType.VIDEO_STREAM.name}' AND + duration = 0 AND + uploader = '' AND + thumbnail_url = '' AND + view_count IS NULL AND + textual_upload_date IS NULL AND + upload_date IS NULL AND + is_upload_date_approximation IS NULL + """.trimIndent() + ).use { statement -> + statement.step() + assert(statement.getBoolean(0)) + } + + migratedConnection.close() } @Test @@ -194,92 +181,105 @@ class DatabaseMigrationTest { close() } - testHelper.runMigrationsAndValidate( + val migratedConnection = testHelper.runMigrationsAndValidate( version = Migrations.DB_VER_8, migrations = listOf(Migrations.MIGRATION_7_8) ) - testHelper.runMigrationsAndValidate( - version = Migrations.DB_VER_9, - migrations = listOf(Migrations.MIGRATION_8_9) - ) + migratedConnection.prepare( + """ + SELECT (COUNT(*) = 2) FROM search_history + WHERE + search = 'abc' AND + service_id IN ( + SELECT service_id FROM search_history + WHERE search = 'abc' + GROUP BY service_id + HAVING COUNT(*) = 1 + ) + """.trimIndent() + ).use { statement -> + statement.step() + assert(statement.getBoolean(0)) + } - val migratedDatabaseV8 = getMigratedDatabase() - val listFromDB = migratedDatabaseV8.searchHistoryDAO().getAll().blockingFirst() - - assertEquals(2, listFromDB.size) - assertEquals("abc", listFromDB[0].search) - assertEquals("abc", listFromDB[1].search) - assertNotEquals(listFromDB[0].serviceId, listFromDB[1].serviceId) + migratedConnection.close() } @Test fun migrateDatabaseFrom8to9() = runTest { val databaseInV8 = testHelper.createDatabase(version = Migrations.DB_VER_8) + val lastPlaylistUIDSQL = "SELECT MAX(uid) FROM playlists" + val playlistsSQL = """ + INSERT OR FAIL INTO playlists + (name, is_thumbnail_permanent, thumbnail_stream_id) + VALUES (?, ?, ?) + """.trimIndent() + + val lastRemotePlaylistUIDSQL = "SELECT MAX(uid) FROM remote_playlists" + val remotePlaylistsSQL = """ + INSERT OR FAIL INTO remote_playlists + (service_id, url) + VALUES (?, ?) + """.trimIndent() + val localUid1: Long val localUid2: Long val remoteUid1: Long val remoteUid2: Long databaseInV8.run { - val remotePlaylistsSQL = """ - INSERT OR FAIL INTO remote_playlists - (service_id, url) - VALUES (?, ?) - """.trimIndent() - val playlistsSQL = """ - INSERT OR FAIL INTO playlists - (name, is_thumbnail_permanent, thumbnail_stream_id) - VALUES (?, ?, ?) - """.trimIndent() - + // Insert first local playlist prepare(playlistsSQL).use { statement -> statement.bindText(1, DEFAULT_NAME + "1") statement.bindBoolean(2, false) - statement.bindInt(3, -1) + statement.bindLong(3, -1) statement.step() } - prepare("SELECT MAX(uid) FROM playlists").use { statement -> + localUid1 = prepare(lastPlaylistUIDSQL).use { statement -> statement.step() - localUid1 = statement.getLong(0) + statement.getLong(0) } + // Insert second local playlist prepare(playlistsSQL).use { statement -> statement.bindText(1, DEFAULT_NAME + "2") statement.bindBoolean(2, false) - statement.bindInt(3, -1) + statement.bindLong(3, -1) statement.step() } - prepare("SELECT MAX(uid) FROM playlists").use { statement -> + localUid2 = prepare(lastPlaylistUIDSQL).use { statement -> statement.step() - localUid2 = statement.getLong(0) + statement.getLong(0) } execSQL("DELETE FROM playlists WHERE uid = $localUid1") + // Insert first remote playlist prepare(remotePlaylistsSQL).use { statement -> statement.bindInt(1, DEFAULT_SERVICE_ID) statement.bindText(2, DEFAULT_URL) statement.step() } - prepare("SELECT MAX(uid) FROM remote_playlists").use { statement -> + remoteUid1 = prepare(lastRemotePlaylistUIDSQL).use { statement -> statement.step() - remoteUid1 = statement.getLong(0) + statement.getLong(0) } + // Insert second remote playlist prepare(remotePlaylistsSQL).use { statement -> statement.bindInt(1, DEFAULT_SECOND_SERVICE_ID) statement.bindText(2, DEFAULT_SECOND_URL) statement.step() } - prepare("SELECT MAX(uid) FROM remote_playlists").use { statement -> + remoteUid2 = prepare(lastRemotePlaylistUIDSQL).use { statement -> statement.step() - remoteUid2 = statement.getLong(0) + statement.getLong(0) } execSQL("DELETE FROM remote_playlists WHERE uid = $remoteUid2") @@ -287,60 +287,106 @@ class DatabaseMigrationTest { close() } - testHelper.runMigrationsAndValidate( + val migratedConnection = testHelper.runMigrationsAndValidate( version = Migrations.DB_VER_9, migrations = listOf(Migrations.MIGRATION_8_9) ) - val migratedDatabaseV9 = getMigratedDatabase() - var localListFromDB = migratedDatabaseV9.playlistDAO().getAll().blockingFirst() - var remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().getAll().blockingFirst() + // Verify we have only one local playlist + migratedConnection.prepare( + """ + SELECT (COUNT(*) = 1) FROM playlists + WHERE uid = $localUid2 AND display_index = -1 + """.trimIndent() + ).use { statement -> + statement.step() + assert(statement.getBoolean(0)) + } - assertEquals(1, localListFromDB.size) - assertEquals(localUid2, localListFromDB[0].uid) - assertEquals(-1, localListFromDB[0].displayIndex) - assertEquals(1, remoteListFromDB.size) - assertEquals(remoteUid1, remoteListFromDB[0].uid) - assertEquals(-1, remoteListFromDB[0].displayIndex) + // Verify we have only one remote playlist + migratedConnection.prepare( + """ + SELECT (COUNT(*) = 1) FROM remote_playlists + WHERE uid = $remoteUid1 AND display_index = -1 + """.trimIndent() + ).use { statement -> + statement.step() + assert(statement.getBoolean(0)) + } - val localUid3 = migratedDatabaseV9.playlistDAO().insert( - PlaylistEntity( - name = "${DEFAULT_NAME}3", - isThumbnailPermanent = false, - thumbnailStreamId = -1, - displayIndex = -1 - ) - ) - val remoteUid3 = migratedDatabaseV9.playlistRemoteDAO().insert( - PlaylistRemoteEntity( - serviceId = DEFAULT_THIRD_SERVICE_ID, - orderingName = DEFAULT_NAME, - url = DEFAULT_THIRD_URL, - thumbnailUrl = DEFAULT_THUMBNAIL, - uploader = DEFAULT_UPLOADER_NAME, - displayIndex = -1, - streamCount = 10 - ) - ) + // Insert third local playlist + val newPlaylistsSQL = """ + INSERT OR FAIL INTO playlists + (name, is_thumbnail_permanent, thumbnail_stream_id, display_index) + VALUES (?, ?, ?, ?) + """.trimIndent() + migratedConnection.prepare(newPlaylistsSQL).use { statement -> + statement.bindText(1, DEFAULT_NAME + "3") + statement.bindBoolean(2, false) + statement.bindLong(3, -1) + statement.bindLong(4, -1) + statement.step() + } - localListFromDB = migratedDatabaseV9.playlistDAO().getAll().blockingFirst() - remoteListFromDB = migratedDatabaseV9.playlistRemoteDAO().getAll().blockingFirst() - assertEquals(2, localListFromDB.size) - assertEquals(localUid3, localListFromDB[1].uid) - assertEquals(-1, localListFromDB[1].displayIndex) - assertEquals(2, remoteListFromDB.size) - assertEquals(remoteUid3, remoteListFromDB[1].uid) - assertEquals(-1, remoteListFromDB[1].displayIndex) - } + val localUid3 = migratedConnection.prepare(lastPlaylistUIDSQL).use { statement -> + statement.step() + statement.getLong(0) + } - private fun getMigratedDatabase(): AppDatabase { - val database: AppDatabase = Room.databaseBuilder( - ApplicationProvider.getApplicationContext(), - AppDatabase::class.java, - AppDatabase.DATABASE_NAME - ) - .build() - testHelper.closeWhenFinished(database) - return database + // Insert third remote playlist + val newRemotePlaylistsSQL = """ + INSERT OR FAIL INTO remote_playlists + (service_id, name, url, thumbnail_url, uploader, display_index, stream_count) + VALUES (?, ?, ?, ?, ?, ?, ?) + """.trimIndent() + migratedConnection.prepare(newRemotePlaylistsSQL).use { statement -> + statement.bindInt(1, DEFAULT_THIRD_SERVICE_ID) + statement.bindText(2, DEFAULT_NAME) + statement.bindText(3, DEFAULT_THIRD_URL) + statement.bindText(4, DEFAULT_THUMBNAIL) + statement.bindText(5, DEFAULT_UPLOADER_NAME) + statement.bindLong(6, -1) + statement.bindLong(7, 10) + statement.step() + } + + val remoteUid3 = migratedConnection.prepare(lastRemotePlaylistUIDSQL).use { statement -> + statement.step() + statement.getLong(0) + } + + // Verify we have 2 local playlists now with third one present + migratedConnection.prepare("SELECT (COUNT(*) = 2) FROM playlists").use { statement -> + statement.step() + require(statement.getBoolean(0)) + } + + migratedConnection.prepare( + """ + SELECT (COUNT(*) = 1) FROM playlists + WHERE uid = $localUid3 AND display_index = -1 + """.trimIndent() + ).use { statement -> + statement.step() + assert(statement.getBoolean(0)) + } + + // Verify we have 2 remote playlists now with third one present + migratedConnection.prepare("SELECT (COUNT(*) = 2) FROM remote_playlists").use { statement -> + statement.step() + require(statement.getBoolean(0)) + } + + migratedConnection.prepare( + """ + SELECT (COUNT(*) = 1) FROM remote_playlists + WHERE uid = $remoteUid3 AND display_index = -1 + """.trimIndent() + ).use { statement -> + statement.step() + assert(statement.getBoolean(0)) + } + + migratedConnection.close() } } From 8f8b4a828ec42035ac1ac3e99a5a7f66026778b7 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 21 Oct 2026 16:21:55 +0800 Subject: [PATCH 126/155] Create temp database when working with migrations As this runs on JVM, its works fine as compared to Android. Signed-off-by: Aayush Gupta --- .../org/schabi/newpipe/database/DatabaseMigrationTest.kt | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt index 19ead419b..5b9c26211 100644 --- a/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt +++ b/app/src/androidTest/java/org/schabi/newpipe/database/DatabaseMigrationTest.kt @@ -1,19 +1,15 @@ package org.schabi.newpipe.database -import androidx.room3.Room import androidx.room3.testing.MigrationTestHelper import androidx.sqlite.driver.bundled.BundledSQLiteDriver import androidx.sqlite.execSQL -import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import java.io.File import kotlinx.coroutines.test.runTest -import org.junit.Assert.assertEquals import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.schabi.newpipe.database.playlist.model.PlaylistEntity -import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity import org.schabi.newpipe.extractor.ServiceList import org.schabi.newpipe.extractor.stream.StreamType @@ -43,7 +39,7 @@ class DatabaseMigrationTest { instrumentation = instrumentation, databaseClass = AppDatabase::class, driver = BundledSQLiteDriver(), - file = instrumentation.targetContext.getDatabasePath(AppDatabase.DATABASE_NAME) + file = File.createTempFile("test", ".db") ) @Test From 4e594b06cc8a629d6a07cc4081448c554346b093 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 22 Oct 2026 14:55:56 +0800 Subject: [PATCH 127/155] Apply review feedback for Kotlin conversion * Use fromRunnable in updateJoin to return like other methods * Relocate saveStreamState to group loadStreamState overloads Signed-off-by: Aayush Gupta --- .../local/history/HistoryRecordManager.kt | 28 +++++++++---------- .../local/playlist/LocalPlaylistManager.kt | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt index 886437a21..90ab5ce8e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt @@ -237,20 +237,6 @@ class HistoryRecordManager(context: Context) { .subscribeOn(Schedulers.io()) } - fun saveStreamState(info: StreamInfo, progressMillis: Long): Completable { - return Completable.fromAction { - runBlocking { - database.withWriteTransaction { - val streamId = streamTable.upsert(StreamEntity(info)) - val state = StreamStateEntity(streamId, progressMillis) - if (state.isValid(info.duration)) { - streamStateTable.upsert(state) - } - } - } - }.subscribeOn(Schedulers.io()) - } - fun loadStreamState(info: InfoItem): Maybe { return Maybe.fromCallable { streamTable.getStream(info.serviceId.toLong(), info.url) @@ -281,6 +267,20 @@ class HistoryRecordManager(context: Context) { }.subscribeOn(Schedulers.io()) } + fun saveStreamState(info: StreamInfo, progressMillis: Long): Completable { + return Completable.fromAction { + runBlocking { + database.withWriteTransaction { + val streamId = streamTable.upsert(StreamEntity(info)) + val state = StreamStateEntity(streamId, progressMillis) + if (state.isValid(info.duration)) { + streamStateTable.upsert(state) + } + } + } + }.subscribeOn(Schedulers.io()) + } + // /////////////////////////////////////////////////////// // Utility // /////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt index d914ca72c..d6a541746 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt @@ -80,7 +80,7 @@ class LocalPlaylistManager(private val database: AppDatabase) { PlaylistStreamEntity(playlistId, streamId, index) } - return Completable.fromAction { + return Completable.fromRunnable { playlistStreamTable.updatePlaylistStreams(playlistId, joinEntities) }.subscribeOn(Schedulers.io()) } From 7934d953a7f5ea42b8db02c92f947a8b72869ee6 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 22 Oct 2026 16:28:52 +0800 Subject: [PATCH 128/155] Use rx3 API of coroutines to simplify logic with room v3 migration Also avoid cancellations when storing search history Signed-off-by: Aayush Gupta --- .../local/history/HistoryRecordManager.kt | 123 +++++++++--------- .../local/playlist/LocalPlaylistManager.kt | 26 ++-- 2 files changed, 74 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt index 90ab5ce8e..cd5a2b2c7 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/history/HistoryRecordManager.kt @@ -16,7 +16,11 @@ import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers import java.time.OffsetDateTime import java.time.ZoneOffset -import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.rx3.rxCompletable +import kotlinx.coroutines.rx3.rxMaybe +import kotlinx.coroutines.withContext import org.schabi.newpipe.NewPipeDatabase import org.schabi.newpipe.R import org.schabi.newpipe.database.LocalItem @@ -72,46 +76,44 @@ class HistoryRecordManager(context: Context) { val currentTime = OffsetDateTime.now(ZoneOffset.UTC) - return Maybe.fromCallable { - runBlocking { - database.withWriteTransaction { - val streamId: Long - val duration: Long + return rxMaybe(Dispatchers.IO) { + database.withWriteTransaction { + val streamId: Long + val duration: Long - // Duration will not exist if the item was loaded with fast mode, so fetch it - // if empty - if (info.duration < 0) { - val completeInfo = ExtractorHelper.getStreamInfo( - info.serviceId, - info.url, - false - ).subscribeOn(Schedulers.io()).blockingGet() + // Duration will not exist if the item was loaded with fast mode, so fetch it + // if empty + if (info.duration < 0) { + val completeInfo = ExtractorHelper.getStreamInfo( + info.serviceId, + info.url, + false + ).subscribeOn(Schedulers.io()).blockingGet() - duration = completeInfo.duration - streamId = streamTable.upsert(StreamEntity(completeInfo)) - } else { - duration = info.duration - streamId = streamTable.upsert(StreamEntity(info)) - } + duration = completeInfo.duration + streamId = streamTable.upsert(StreamEntity(completeInfo)) + } else { + duration = info.duration + streamId = streamTable.upsert(StreamEntity(info)) + } - // Update the stream progress to the full duration of the video - val entity = StreamStateEntity( - streamId, - duration * 1000 - ) - streamStateTable.upsert(entity) + // Update the stream progress to the full duration of the video + val entity = StreamStateEntity( + streamId, + duration * 1000 + ) + streamStateTable.upsert(entity) - // Add a history entry - val latestEntry = streamHistoryTable.getLatestEntry(streamId) - if (latestEntry == null) { - // never actually viewed: add history entry but with 0 views - streamHistoryTable.insert(StreamHistoryEntity(streamId, currentTime, 0)) - } else { - 0L - } + // Add a history entry + val latestEntry = streamHistoryTable.getLatestEntry(streamId) + if (latestEntry == null) { + // never actually viewed: add history entry but with 0 views + streamHistoryTable.insert(StreamHistoryEntity(streamId, currentTime, 0)) + } else { + 0L } } - }.subscribeOn(Schedulers.io()) + } } fun onViewed(info: StreamInfo): Maybe { @@ -120,24 +122,22 @@ class HistoryRecordManager(context: Context) { } val currentTime = OffsetDateTime.now(ZoneOffset.UTC) - return Maybe.fromCallable { - runBlocking { - database.withWriteTransaction { - val streamId = streamTable.upsert(StreamEntity(info)) - val latestEntry = streamHistoryTable.getLatestEntry(streamId) + return rxMaybe(Dispatchers.IO) { + database.withWriteTransaction { + val streamId = streamTable.upsert(StreamEntity(info)) + val latestEntry = streamHistoryTable.getLatestEntry(streamId) - if (latestEntry != null) { - streamHistoryTable.delete(latestEntry) - latestEntry.accessDate = currentTime - latestEntry.repeatCount = latestEntry.repeatCount + 1 - streamHistoryTable.insert(latestEntry) - } else { - // just viewed for the first time: set 1 view - streamHistoryTable.insert(StreamHistoryEntity(streamId, currentTime, 1)) - } + if (latestEntry != null) { + streamHistoryTable.delete(latestEntry) + latestEntry.accessDate = currentTime + latestEntry.repeatCount = latestEntry.repeatCount + 1 + streamHistoryTable.insert(latestEntry) + } else { + // just viewed for the first time: set 1 view + streamHistoryTable.insert(StreamHistoryEntity(streamId, currentTime, 1)) } } - }.subscribeOn(Schedulers.io()) + } } fun deleteStreamHistoryAndState(streamId: Long): Completable { @@ -177,8 +177,9 @@ class HistoryRecordManager(context: Context) { val currentTime = OffsetDateTime.now(ZoneOffset.UTC) val newEntry = SearchHistoryEntry(currentTime, serviceId, search) - return Maybe.fromCallable { - runBlocking { + // TODO: Do this in a viewmodel once UI is migrated to avoid cancellations + return rxMaybe(Dispatchers.IO) { + withContext(NonCancellable) { database.withWriteTransaction { val latestEntry = searchHistoryTable.latestEntry if (latestEntry != null && latestEntry.hasEqualValues(newEntry)) { @@ -189,7 +190,7 @@ class HistoryRecordManager(context: Context) { } } } - }.subscribeOn(Schedulers.io()) + } } fun deleteSearchHistory(search: String): Single { @@ -268,17 +269,15 @@ class HistoryRecordManager(context: Context) { } fun saveStreamState(info: StreamInfo, progressMillis: Long): Completable { - return Completable.fromAction { - runBlocking { - database.withWriteTransaction { - val streamId = streamTable.upsert(StreamEntity(info)) - val state = StreamStateEntity(streamId, progressMillis) - if (state.isValid(info.duration)) { - streamStateTable.upsert(state) - } + return rxCompletable(Dispatchers.IO) { + database.withWriteTransaction { + val streamId = streamTable.upsert(StreamEntity(info)) + val state = StreamStateEntity(streamId, progressMillis) + if (state.isValid(info.duration)) { + streamStateTable.upsert(state) } } - }.subscribeOn(Schedulers.io()) + } } // /////////////////////////////////////////////////////// diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt index d6a541746..383519311 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistManager.kt @@ -11,7 +11,9 @@ import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Maybe import io.reactivex.rxjava3.schedulers.Schedulers +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.rx3.rxMaybe import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.playlist.PlaylistDuplicatesEntry import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry @@ -35,20 +37,18 @@ class LocalPlaylistManager(private val database: AppDatabase) { // Save to the database directly. // Make sure the new playlist is always on the top of bookmark. // The index will be reassigned to non-negative number in BookmarkFragment. - return Maybe.fromCallable { - runBlocking { - database.withWriteTransaction { - val streamIds = streamTable.upsertAll(streams) - val newPlaylist = PlaylistEntity( - name = name, - isThumbnailPermanent = false, - thumbnailStreamId = streamIds[0], - displayIndex = -1 - ) - insertJoinEntities(playlistTable.insert(newPlaylist), streamIds, 0) - } + return rxMaybe(Dispatchers.IO) { + database.withWriteTransaction { + val streamIds = streamTable.upsertAll(streams) + val newPlaylist = PlaylistEntity( + name = name, + isThumbnailPermanent = false, + thumbnailStreamId = streamIds[0], + displayIndex = -1 + ) + insertJoinEntities(playlistTable.insert(newPlaylist), streamIds, 0) } - }.subscribeOn(Schedulers.io()) + } } fun appendToPlaylist(playlistId: Long, streams: List): Maybe> { From c7fe85205ae329276df11fa74e1120b82217b83f Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 21 Oct 2026 02:30:13 +0200 Subject: [PATCH 129/155] Improve docs and fix typos --- .../newpipe/download/DownloadDialog.java | 2 +- .../org/schabi/newpipe/player/Player.java | 20 +++++++++++-------- .../NonUriHlsDataSourceFactory.java | 2 +- .../gesture/PopupPlayerGestureListener.kt | 2 +- .../player/mediasource/FailedMediaSource.java | 2 +- .../mediasource/ManagedMediaSource.java | 2 +- .../player/playback/PlaybackListener.java | 2 +- .../playback/SurfaceHolderCallback.java | 6 +++--- .../newpipe/player/playqueue/PlayQueue.java | 2 +- .../newpipe/player/ui/PopupPlayerUi.java | 2 +- .../newpipe/player/ui/VideoPlayerUi.java | 2 +- 11 files changed, 24 insertions(+), 20 deletions(-) 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 178fcefe1..627e85fe1 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -924,7 +924,7 @@ public class DownloadDialog extends DialogFragment } else if (targetFile == null) { // This part is called if: // * the filename is not used in a pending/finished download - // * the file does not exists, create + // * the file does not exist, create if (!mainStorage.mkdirs()) { showFailedDialog(R.string.error_path_creation); diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index b5b2228ca..39bdb7fb1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -186,7 +186,9 @@ public final class Player implements PlaybackListener, Listener { // Playback //////////////////////////////////////////////////////////////////////////*/ - // play queue might be null e.g. while player is starting + /** + * The play queue might be {@code null} e.g. while player is starting + */ @Nullable private PlayQueue playQueue; @@ -230,8 +232,10 @@ public final class Player implements PlaybackListener, Listener { private PlayerType playerType = PlayerType.MAIN; private int currentState = STATE_PREFLIGHT; - // audio only mode does not mean that player type is background, but that the player was - // minimized to background but will resume automatically to the original player type + /** + * Audio-only mode does not mean that player type is background, but that the player was + * minimized to background and will change to the original player type automatically. + */ private boolean isAudioOnly = false; private boolean isPrepared = false; @@ -934,7 +938,7 @@ public final class Player implements PlaybackListener, Listener { private void onThumbnailLoaded(@Nullable final Bitmap bitmap) { // Avoid useless thumbnail updates, if the thumbnail has not actually changed. Based on the - // thumbnail loading code, this if would be skipped only when both bitmaps are `null`, since + // thumbnail loading code, this would be skipped only when both bitmaps are `null`, since // onThumbnailLoaded won't be called twice with the same nonnull bitmap by Coil's target. if (currentThumbnail != bitmap) { currentThumbnail = bitmap; @@ -1522,7 +1526,7 @@ public final class Player implements PlaybackListener, Listener { *
  • From {@link PlaybackException#ERROR_CODE_IO_INVALID_HTTP_CONTENT_TYPE BAD_IO} to * {@link PlaybackException#ERROR_CODE_PARSING_MANIFEST_UNSUPPORTED UNSUPPORTED_FORMATS}: * If the stream source is validated by the extractor but not recognized by the player, - * then we can try to recover playback by signalling an error on the {@link PlayQueue}.
  • + * then we can try to recover playback by signaling an error on the {@link PlayQueue}. *
  • For {@link PlaybackException#ERROR_CODE_TIMEOUT PLAYER_TIMEOUT}, * {@link PlaybackException#ERROR_CODE_IO_UNSPECIFIED MEDIA_SOURCE_RESOLVER_TIMEOUT} and * {@link PlaybackException#ERROR_CODE_IO_NETWORK_CONNECTION_FAILED NO_NETWORK}: @@ -1541,7 +1545,7 @@ public final class Player implements PlaybackListener, Listener { */ // Any error code not explicitly covered here are either unrelated to NewPipe use case // (e.g. DRM) or not recoverable (e.g. Decoder error). In both cases, the player should - // shutdown. + // shut down. @SuppressWarnings("SwitchIntDef") @Override public void onPlayerError(@NonNull final PlaybackException error) { @@ -2241,7 +2245,7 @@ public final class Player implements PlaybackListener, Listener { reloadPlayQueueManager(); }); - // Disable or enable video and subtitles renderers depending of the + // Disable or enable video and subtitles renderers depending on the // videoAndSubtitlesEnabled value trackSelector.setParameters(trackSelector.buildUponParameters() .setTrackTypeDisabled(C.TRACK_TYPE_TEXT, !videoAndSubtitlesEnabled) @@ -2354,7 +2358,7 @@ public final class Player implements PlaybackListener, Listener { try { return !exoPlayerIsNull() && simpleExoPlayer.isCurrentMediaItemDynamic(); } catch (final IndexOutOfBoundsException e) { - // Why would this even happen =(... but lets log it anyway, better safe than sorry + // Why would this even happen =(... but let's log it anyway, better safe than sorry if (DEBUG) { Log.d(TAG, "player.isCurrentWindowDynamic() failed: ", e); } diff --git a/app/src/main/java/org/schabi/newpipe/player/datasource/NonUriHlsDataSourceFactory.java b/app/src/main/java/org/schabi/newpipe/player/datasource/NonUriHlsDataSourceFactory.java index 676443a9c..0c9b631bf 100644 --- a/app/src/main/java/org/schabi/newpipe/player/datasource/NonUriHlsDataSourceFactory.java +++ b/app/src/main/java/org/schabi/newpipe/player/datasource/NonUriHlsDataSourceFactory.java @@ -18,7 +18,7 @@ import java.nio.charset.StandardCharsets; *

    * If media requests are relative, the URI from which the manifest comes from (either the * manifest URI (preferred) or the master URI (if applicable)) must be returned, otherwise the - * content will be not playable, as it will be an invalid URL, or it may be treat as something + * content will be not playable, as it will be an invalid URL, or it may be treated as something * unexpected, for instance as a file for * {@link com.google.android.exoplayer2.upstream.DefaultDataSource DefaultDataSource}s. *

    diff --git a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt index 60752652e..ea74f4c7f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/gesture/PopupPlayerGestureListener.kt @@ -258,7 +258,7 @@ class PopupPlayerGestureListener( // -- Determine if the ClosingOverlayView (red X) has to be shown or hidden -- val showClosingOverlayView: Boolean = playerUi.isInsideClosingRadius(movingEvent) - // Check if an view is in expected state and if not animate it into the correct state + // Check if a view is in expected state and if not animate it into the correct state if (binding.closingOverlay.isVisible != showClosingOverlayView) { binding.closingOverlay.animate(showClosingOverlayView, 200) } diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java index b9ca90d89..e0b32b73c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/FailedMediaSource.java @@ -98,7 +98,7 @@ public class FailedMediaSource extends BaseMediaSource implements ManagedMediaSo *

    * If the exception is not known, e.g. {@link java.net.UnknownHostException} or some * other network issue, then no source info is refreshed and - * {@link #maybeThrowSourceInfoRefreshError()} be will triggered. + * {@link #maybeThrowSourceInfoRefreshError()} will be triggered. *

    * Note that this method is called only once until {@link #releaseSourceInternal()} is called, * so if no action is done in here, playback will stall unless diff --git a/app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSource.java b/app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSource.java index 9d6b94893..3994c2ecf 100644 --- a/app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSource.java +++ b/app/src/main/java/org/schabi/newpipe/player/mediasource/ManagedMediaSource.java @@ -15,7 +15,7 @@ public interface ManagedMediaSource extends MediaSource { * {@link ManagedMediaSource}, then it should be replaced. * @param isInterruptable specifies if this {@link ManagedMediaSource} potentially * being played. - * @return whether this could be replaces + * @return whether this could be replaced */ boolean shouldBeReplacedWith(@NonNull PlayQueueItem newIdentity, boolean isInterruptable); diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java b/app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java index 737607001..03fdaa9b1 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java +++ b/app/src/main/java/org/schabi/newpipe/player/playback/PlaybackListener.java @@ -72,7 +72,7 @@ public interface PlaybackListener { /** * Called when the play queue can no longer be played or used. * Currently, this means the play queue is empty and complete. - * Signals to the listener that it should shutdown. + * Signals to the listener that it should shut down. *

    * May be called at any time. *

    diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/SurfaceHolderCallback.java b/app/src/main/java/org/schabi/newpipe/player/playback/SurfaceHolderCallback.java index da6cb36d4..4340d32bd 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playback/SurfaceHolderCallback.java +++ b/app/src/main/java/org/schabi/newpipe/player/playback/SurfaceHolderCallback.java @@ -8,11 +8,11 @@ import com.google.android.exoplayer2.video.PlaceholderSurface; /** * Prevent error message: 'Unrecoverable player error occurred' - * In case of rotation some users see this kind of an error which is preventable + * In case of rotation some users see this kind of error which is preventable * having a Callback that handles the lifecycle of the surface. *

    - * How?: In case we are no longer able to write to the surface eg. through rotation/putting in - * background we set set a DummySurface. Although it it works on API >= 23 only. + * How?: In case we are no longer able to write to the surface e.g. through rotation/putting in + * background we set a DummySurface. Although it works on API >= 23 only. * Result: we get a little video interruption (audio is still fine) but we won't get the * 'Unrecoverable player error occurred' error message. *

    diff --git a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java index 8a66dc2ff..9c7d0e20f 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java +++ b/app/src/main/java/org/schabi/newpipe/player/playqueue/PlayQueue.java @@ -373,7 +373,7 @@ public abstract class PlayQueue implements Serializable { * to that of the target. * If the moved item is not the currently playing and moves to an index AFTER the * current playing index, then the current playing index is decremented. - * Vice versa if the an item after the currently playing is moved BEFORE. + * Vice versa if an item after the currently playing is moved BEFORE. *

    * * @param source the original index of the item diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java index b9c29c008..4dbbb471c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/PopupPlayerUi.java @@ -243,7 +243,7 @@ public final class PopupPlayerUi extends VideoPlayerUi { //region Popup position and size /** - * Check if {@link #popupLayoutParams}' position is within a arbitrary boundary + * Check if {@link #popupLayoutParams}' position is within an arbitrary boundary * that goes from (0, 0) to (screenWidth, screenHeight). *

    * If it's out of these boundaries, {@link #popupLayoutParams}' position is changed diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java index 563927e19..65af3c44a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/VideoPlayerUi.java @@ -810,7 +810,7 @@ public abstract class VideoPlayerUi extends PlayerUi implements SeekBar.OnSeekBa /** * Update the play/pause button ({@link R.id.playPauseButton}) to reflect the action - * that will be performed when the button is clicked.. + * that will be performed when the button is clicked. * @param action the action that is performed when the play/pause button is clicked */ private void updatePlayPauseButton(final PlayButtonAction action) { From d7d6f25c031a43ec62dd37acffa5ce379d0f70cf Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 22 Oct 2026 16:47:16 +0200 Subject: [PATCH 130/155] Update extractor to the latest version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c61316883..bd4d44e8d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -75,7 +75,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "2f7d9da4ce82248637fdd3f8025086bd345f7fc2" +teamnewpipe-newpipe-extractor = "e8f89145a830b4d6cae32412007f24ea8b36c73a" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" # New versions require minSdk 24 From 11634b57a7e65118082fdda03ebd14e1ac4319bc Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 20 Oct 2026 21:11:00 +0200 Subject: [PATCH 131/155] [Debug CI] log author association --- .github/workflows/linked-issue-check.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/linked-issue-check.yml b/.github/workflows/linked-issue-check.yml index d5fdb5755..e6e83d216 100644 --- a/.github/workflows/linked-issue-check.yml +++ b/.github/workflows/linked-issue-check.yml @@ -20,6 +20,12 @@ jobs: github.event.pull_request.author_association != 'OWNER' runs-on: ubuntu-latest steps: + - name: Dump Author Association + env: + AUTHOR_ASSOCIATION: ${{ github.event.pull_request.author_association }} + run: | + echo "Author Association: $AUTHOR_ASSOCIATION" + - uses: actions/checkout@v6 - name: Check linked issues From 5e91af442cab4b3067a7d19e7c82c9dd26214493 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 21 Oct 2026 14:01:56 +0200 Subject: [PATCH 132/155] FIx: Skip check for linked issues and assignee for collaborators This skips the check for collaborators like weblate. --- .github/workflows/linked-issue-check.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/linked-issue-check.yml b/.github/workflows/linked-issue-check.yml index e6e83d216..f17cc5c25 100644 --- a/.github/workflows/linked-issue-check.yml +++ b/.github/workflows/linked-issue-check.yml @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: 2026 NewPipe e.V. # SPDX-License-Identifier: GPL-3.0-or-later -name: Check linked issue +name: Check for linked issue on: pull_request_target: @@ -14,10 +14,10 @@ permissions: jobs: check-linked-issue: - name: Check linked issue and assignee + name: Check for linked issues and author being assigned to at least one issue if: >- - github.event.pull_request.author_association != 'MEMBER' && - github.event.pull_request.author_association != 'OWNER' + !contains(fromJSON('["MEMBER", "OWNER", "COLLABORATOR"]'), + github.event.pull_request.author_association) runs-on: ubuntu-latest steps: - name: Dump Author Association From fbee43f923acd19bfb515f86878c723e94b931de Mon Sep 17 00:00:00 2001 From: Suyun Hou Date: Wed, 21 Oct 2026 04:47:51 +1100 Subject: [PATCH 133/155] show queue progress and total duration in PlayQueueActivity for popup and background queue --- .../newpipe/player/PlayQueueActivity.java | 33 ++++++++++++++ .../layout/activity_player_queue_control.xml | 44 ++++++++++++++----- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index b6bb84ec6..9dfcc247b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -366,6 +366,38 @@ public final class PlayQueueActivity extends AppCompatActivity } } + private void updateQueueTime(final int currentProgress) { + if (player == null || player.getPlayQueue() == null) { + queueControlBinding.queueTotalDuration.setVisibility(View.GONE); + return; + } + + final PlayQueue playQueue = player.getPlayQueue(); + final List streams = playQueue.getStreams(); + final int currentIndex = playQueue.getIndex(); + + if (streams.isEmpty() || currentIndex < 0 || currentIndex >= streams.size()) { + queueControlBinding.queueTotalDuration.setVisibility(View.GONE); + return; + } + + final long before = streams.subList(0, currentIndex).stream() + .mapToLong(PlayQueueItem::getDuration) + .sum(); + + final long total = streams.stream() + .mapToLong(PlayQueueItem::getDuration) + .sum(); + + final long queueProgress = before + currentProgress / 1000L; + + queueControlBinding.queueTotalDuration.setText( + Localization.getDurationString(queueProgress) + " / " + Localization.getDurationString(total) + ); + + queueControlBinding.queueTotalDuration.setVisibility(View.VISIBLE); + } + //////////////////////////////////////////////////////////////////////////// // Component On-Click Listener //////////////////////////////////////////////////////////////////////////// @@ -498,6 +530,7 @@ public final class PlayQueueActivity extends AppCompatActivity queueControlBinding.currentTime.getLayoutParams(); currentTimeParams.width = queueControlBinding.endTime.getWidth(); queueControlBinding.currentTime.setLayoutParams(currentTimeParams); + updateQueueTime(currentProgress); } @Override diff --git a/app/src/main/res/layout/activity_player_queue_control.xml b/app/src/main/res/layout/activity_player_queue_control.xml index ec4b19fc6..6f97baca3 100644 --- a/app/src/main/res/layout/activity_player_queue_control.xml +++ b/app/src/main/res/layout/activity_player_queue_control.xml @@ -81,18 +81,42 @@ android:textSize="14sp" tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis nec aliquam augue, eget cursus est. Ut id tristique enim, ut scelerisque tellus. Sed ultricies ipsum non mauris ultricies, commodo malesuada velit porta." /> - + android:orientation="horizontal" + android:gravity="center_vertical"> + + + + + + + + + + Date: Wed, 21 Oct 2026 17:00:33 +1100 Subject: [PATCH 134/155] Fix Checkstyle line length violation --- .../main/java/org/schabi/newpipe/player/PlayQueueActivity.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index 9dfcc247b..6b5017b5a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -392,7 +392,8 @@ public final class PlayQueueActivity extends AppCompatActivity final long queueProgress = before + currentProgress / 1000L; queueControlBinding.queueTotalDuration.setText( - Localization.getDurationString(queueProgress) + " / " + Localization.getDurationString(total) + Localization.getDurationString(queueProgress) + " / " + + Localization.getDurationString(total) ); queueControlBinding.queueTotalDuration.setVisibility(View.VISIBLE); From 50d490b78228a09fc9da0739a0ad35ba101e93dc Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 23 Oct 2026 06:28:47 -0700 Subject: [PATCH 135/155] add history preference keys --- .../app/preferences/HistoryPreferences.kt | 24 +++++++++++++++++++ .../newpipe/app/extensions/SettingsModule.kt | 20 ++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/preferences/HistoryPreferences.kt create mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/extensions/SettingsModule.kt diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/preferences/HistoryPreferences.kt b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/HistoryPreferences.kt new file mode 100644 index 000000000..e1e00ba63 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/preferences/HistoryPreferences.kt @@ -0,0 +1,24 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.preferences + +/** + * Preference keys and defaults for the History and cache settings screen. + */ +object HistoryPreferences { + const val KEY_ENABLE_WATCH_HISTORY = "enable_watch_history" + const val KEY_ENABLE_PLAYBACK_RESUME = "enable_playback_resume" + const val KEY_ENABLE_PLAYBACK_STATE_LISTS = "enable_playback_state_lists" + const val KEY_ENABLE_SEARCH_HISTORY = "enable_search_history" + + const val KEY_RECAPTCHA_COOKIES = "recaptcha_cookies_key" + + const val DEFAULT_ENABLE_WATCH_HISTORY = true + const val DEFAULT_ENABLE_PLAYBACK_RESUME = true + const val DEFAULT_ENABLE_PLAYBACK_STATE_LISTS = true + const val DEFAULT_ENABLE_SEARCH_HISTORY = true + const val DEFAULT_RECAPTCHA_COOKIES = "" +} diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/extensions/SettingsModule.kt b/shared/src/commonTest/kotlin/net/newpipe/app/extensions/SettingsModule.kt new file mode 100644 index 000000000..c04e7dfc4 --- /dev/null +++ b/shared/src/commonTest/kotlin/net/newpipe/app/extensions/SettingsModule.kt @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.extensions + +import com.russhwolf.settings.MapSettings +import com.russhwolf.settings.Settings +import org.koin.core.module.Module +import org.koin.dsl.module + +/** + * Builds a Koin module exposing [settings] as the only [Settings] instance. + * + * @param settings Settings to expose, empty by default + */ +fun settingsModule(settings: Settings = MapSettings()): Module = module { + single { settings } +} From 12e7ddc1bc6abfb388c9f0c3154aa2c733dde53e Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 23 Oct 2026 06:36:57 -0700 Subject: [PATCH 136/155] add history actions --- .../app/platform/AndroidHistoryActions.kt | 45 +++++++++++++++++++ .../newpipe/app/platform/HistoryActions.kt | 40 +++++++++++++++++ .../newpipe/app/platform/IOSHistoryActions.kt | 11 +++++ .../newpipe/app/platform/JVMHistoryActions.kt | 11 +++++ 4 files changed, 107 insertions(+) create mode 100644 shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidHistoryActions.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/platform/HistoryActions.kt create mode 100644 shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSHistoryActions.kt create mode 100644 shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMHistoryActions.kt diff --git a/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidHistoryActions.kt b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidHistoryActions.kt new file mode 100644 index 000000000..f03574f84 --- /dev/null +++ b/shared/src/androidMain/kotlin/net/newpipe/app/platform/AndroidHistoryActions.kt @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import android.content.Context +import co.touchlab.kermit.Logger +import org.koin.core.annotation.Singleton + +/** + * Forwards every history action to a bridge supplied by the host app. + */ +@Singleton(binds = [HistoryActions::class]) +class AndroidHistoryActions(context: Context) : HistoryActions { + + private val host: HistoryActions = loadHost(context) + + override fun wipeMetadataCache() = host.wipeMetadataCache() + + override suspend fun clearWatchHistory() = host.clearWatchHistory() + + override suspend fun clearPlaybackStates() = host.clearPlaybackStates() + + override suspend fun clearSearchHistory() = host.clearSearchHistory() + + override fun clearRecaptchaCookies() = host.clearRecaptchaCookies() + + private fun loadHost(context: Context): HistoryActions = runCatching { + Class.forName(HOST_CLASS) + .getDeclaredConstructor(Context::class.java) + .newInstance(context) as HistoryActions + }.getOrElse { error -> + Logger.w( + messageString = "No host history actions found, falling back to no-op", + throwable = error + ) + NoOpHistoryActions + } + + private companion object { + const val HOST_CLASS = "org.schabi.newpipe.settings.ComposeHistoryActions" + } +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/platform/HistoryActions.kt b/shared/src/commonMain/kotlin/net/newpipe/app/platform/HistoryActions.kt new file mode 100644 index 000000000..e5326ff89 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/platform/HistoryActions.kt @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import co.touchlab.kermit.Logger + +/** + * Platform-specific actions triggered from the History and cache settings screen. + */ +interface HistoryActions { + + fun wipeMetadataCache() + suspend fun clearWatchHistory(): Boolean + suspend fun clearPlaybackStates(): Boolean + suspend fun clearSearchHistory(): Boolean + fun clearRecaptchaCookies() +} + +internal object NoOpHistoryActions : HistoryActions { + + override fun wipeMetadataCache() = logUnsupported("wipeMetadataCache") + + override suspend fun clearWatchHistory() = logUnsupportedAndFail("clearWatchHistory") + + override suspend fun clearPlaybackStates() = logUnsupportedAndFail("clearPlaybackStates") + + override suspend fun clearSearchHistory() = logUnsupportedAndFail("clearSearchHistory") + + override fun clearRecaptchaCookies() = logUnsupported("clearRecaptchaCookies") + + private fun logUnsupported(action: String) = Logger.w(messageString = "History action '$action' is unsupported on this platform") + + private fun logUnsupportedAndFail(action: String): Boolean { + logUnsupported(action) + return false + } +} diff --git a/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSHistoryActions.kt b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSHistoryActions.kt new file mode 100644 index 000000000..cbb2e89d3 --- /dev/null +++ b/shared/src/iosMain/kotlin/net/newpipe/app/platform/IOSHistoryActions.kt @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import org.koin.core.annotation.Singleton + +@Singleton(binds = [HistoryActions::class]) +class IOSHistoryActions : HistoryActions by NoOpHistoryActions diff --git a/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMHistoryActions.kt b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMHistoryActions.kt new file mode 100644 index 000000000..52ba343de --- /dev/null +++ b/shared/src/jvmMain/kotlin/net/newpipe/app/platform/JVMHistoryActions.kt @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.platform + +import org.koin.core.annotation.Singleton + +@Singleton(binds = [HistoryActions::class]) +class JVMHistoryActions : HistoryActions by NoOpHistoryActions From b7d0d143e2ff299fee82a68b1e4d3ec46a60eefd Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 23 Oct 2026 06:50:12 -0700 Subject: [PATCH 137/155] add history settings screen --- .../newpipe/settings/ComposeHistoryActions.kt | 61 ++++ .../composeResources/values/strings.xml | 33 ++ .../net/newpipe/app/navigation/Destination.kt | 3 + .../net/newpipe/app/navigation/NavModule.kt | 5 + .../screen/settings/HistorySettingsScreen.kt | 319 ++++++++++++++++++ .../app/screen/settings/SettingsHomeScreen.kt | 4 + .../settings/HistorySettingsViewModel.kt | 121 +++++++ 7 files changed, 546 insertions(+) create mode 100644 app/src/main/java/org/schabi/newpipe/settings/ComposeHistoryActions.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreen.kt create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/HistorySettingsViewModel.kt diff --git a/app/src/main/java/org/schabi/newpipe/settings/ComposeHistoryActions.kt b/app/src/main/java/org/schabi/newpipe/settings/ComposeHistoryActions.kt new file mode 100644 index 000000000..c0aa79453 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/settings/ComposeHistoryActions.kt @@ -0,0 +1,61 @@ +/* +* SPDX-FileCopyrightText: 2026 NewPipe e.V. +* SPDX-License-Identifier: GPL-3.0-or-later +*/ + +package org.schabi.newpipe.settings + +import android.content.Context +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.rx3.await +import net.newpipe.app.platform.HistoryActions +import org.schabi.newpipe.DownloaderImpl +import org.schabi.newpipe.error.ErrorInfo +import org.schabi.newpipe.error.ErrorUtil +import org.schabi.newpipe.error.ReCaptchaActivity +import org.schabi.newpipe.error.UserAction +import org.schabi.newpipe.local.history.HistoryRecordManager +import org.schabi.newpipe.util.InfoCache + +@Suppress("unused") +class ComposeHistoryActions(private val context: Context) : HistoryActions { + + private val recordManager = HistoryRecordManager(context) + + override fun wipeMetadataCache() = InfoCache.getInstance().clearCache() + + override suspend fun clearWatchHistory() = runDeletion(REQUEST_WATCH_HISTORY) { + recordManager.deleteCompleteStreamStateHistory().await() + recordManager.deleteWholeStreamHistory().await() + recordManager.removeOrphanedRecords().await() + } + + override suspend fun clearPlaybackStates() = runDeletion(REQUEST_PLAYBACK_STATES) { + recordManager.deleteCompleteStreamStateHistory().await() + } + + override suspend fun clearSearchHistory() = runDeletion(REQUEST_SEARCH_HISTORY) { + recordManager.deleteCompleteSearchHistory().await() + } + + override fun clearRecaptchaCookies() = DownloaderImpl.getInstance().setCookie(ReCaptchaActivity.RECAPTCHA_COOKIES_KEY, "") + + private suspend fun runDeletion(request: String, deletion: suspend () -> Unit): Boolean = try { + deletion() + true + } catch (cancellation: CancellationException) { + throw cancellation + } catch (error: Exception) { + ErrorUtil.openActivity( + context, + ErrorInfo(error, UserAction.DELETE_FROM_HISTORY, request) + ) + false + } + + private companion object { + const val REQUEST_WATCH_HISTORY = "Delete from history" + const val REQUEST_PLAYBACK_STATES = "Delete playback states" + const val REQUEST_SEARCH_HISTORY = "Delete search history" + } +} diff --git a/shared/src/commonMain/composeResources/values/strings.xml b/shared/src/commonMain/composeResources/values/strings.xml index 014417a0e..a861a101c 100644 --- a/shared/src/commonMain/composeResources/values/strings.xml +++ b/shared/src/commonMain/composeResources/values/strings.xml @@ -217,4 +217,37 @@ No appropriate file manager was found for this action.\nPlease install a file manager or try to disable '%1$s' in the download settings No appropriate file manager was found for this action.\nPlease install a Storage Access Framework compatible file manager + + Watch history + Keep track of watched videos + Resume playback + Restore last playback position + Positions in lists + Show playback position indicators in lists + Search history + Store search queries locally + + + Clear data + Delete + Wipe cached metadata + Remove all cached webpage data + Metadata cache wiped + Clear watch history + Deletes the history of played streams and the playback positions + Delete entire watch history? + Watch history deleted + Delete playback positions + Deletes all playback positions + Delete all playback positions? + Playback positions deleted + Clear search history + Deletes history of search keywords + Delete entire search history? + Search history deleted + Clear reCAPTCHA cookies + Clear cookies that NewPipe stores when you solve a reCAPTCHA + reCAPTCHA cookies have been cleared + + diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt index 819aab820..4d38b2ae0 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/Destination.kt @@ -14,6 +14,9 @@ import kotlinx.serialization.Serializable @Serializable sealed interface Destination : NavKey { + @Serializable + data object HistorySettings : Destination + @Serializable data object DownloadSettings : Destination diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt index a21c8e14d..15ea33eca 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/navigation/NavModule.kt @@ -11,6 +11,7 @@ import net.newpipe.app.screen.about.AboutScreen import net.newpipe.app.screen.settings.AppearanceSettingsScreen import net.newpipe.app.screen.settings.DebugSettingsScreen import net.newpipe.app.screen.settings.DownloadSettingsScreen +import net.newpipe.app.screen.settings.HistorySettingsScreen import net.newpipe.app.screen.settings.PlayerSettingsScreen import net.newpipe.app.screen.settings.SettingsHomeScreen import net.newpipe.app.screen.settings.VideoAudioSettingsScreen @@ -57,6 +58,10 @@ fun navModule() = module { navigation { DownloadSettingsScreen() } + + navigation { + HistorySettingsScreen() + } } /** diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreen.kt new file mode 100644 index 000000000..b39701acc --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreen.kt @@ -0,0 +1,319 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.screen.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.navigationBars +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Scaffold +import androidx.compose.material3.SnackbarHost +import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.PreviewLightDark +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import kotlinx.coroutines.launch +import net.newpipe.app.composable.PreferenceCategoryTitle +import net.newpipe.app.composable.PreferenceRow +import net.newpipe.app.composable.SwitchPreference +import net.newpipe.app.composable.TopAppBar +import net.newpipe.app.navigation.Navigator +import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_PLAYBACK_RESUME +import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_PLAYBACK_STATE_LISTS +import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_SEARCH_HISTORY +import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_WATCH_HISTORY +import net.newpipe.app.preview.ThemePreviewProvider +import net.newpipe.app.viewmodel.settings.HistoryMessage +import net.newpipe.app.viewmodel.settings.HistorySettingsViewModel +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.cancel +import newpipe.shared.generated.resources.clear_cookie_summary +import newpipe.shared.generated.resources.clear_cookie_title +import newpipe.shared.generated.resources.clear_playback_states_summary +import newpipe.shared.generated.resources.clear_playback_states_title +import newpipe.shared.generated.resources.clear_search_history_summary +import newpipe.shared.generated.resources.clear_search_history_title +import newpipe.shared.generated.resources.clear_views_history_summary +import newpipe.shared.generated.resources.clear_views_history_title +import newpipe.shared.generated.resources.delete +import newpipe.shared.generated.resources.delete_playback_states_alert +import newpipe.shared.generated.resources.delete_search_history_alert +import newpipe.shared.generated.resources.delete_view_history_alert +import newpipe.shared.generated.resources.enable_playback_resume_summary +import newpipe.shared.generated.resources.enable_playback_resume_title +import newpipe.shared.generated.resources.enable_playback_state_lists_summary +import newpipe.shared.generated.resources.enable_playback_state_lists_title +import newpipe.shared.generated.resources.enable_search_history_summary +import newpipe.shared.generated.resources.enable_search_history_title +import newpipe.shared.generated.resources.enable_watch_history_summary +import newpipe.shared.generated.resources.enable_watch_history_title +import newpipe.shared.generated.resources.metadata_cache_wipe_complete_notice +import newpipe.shared.generated.resources.metadata_cache_wipe_summary +import newpipe.shared.generated.resources.metadata_cache_wipe_title +import newpipe.shared.generated.resources.recaptcha_cookies_cleared +import newpipe.shared.generated.resources.search_history_deleted +import newpipe.shared.generated.resources.settings_category_clear_data_title +import newpipe.shared.generated.resources.settings_category_history_title +import newpipe.shared.generated.resources.watch_history_deleted +import newpipe.shared.generated.resources.watch_history_states_deleted +import org.jetbrains.compose.resources.stringResource +import org.koin.compose.koinInject +import org.koin.compose.viewmodel.koinViewModel + +enum class HistoryClearTarget { + WATCH_HISTORY, + PLAYBACK_STATES, + SEARCH_HISTORY +} + +@Composable +fun HistorySettingsScreen( + navigator: Navigator = koinInject(), + viewModel: HistorySettingsViewModel = koinViewModel() +) { + val watchHistoryEnabled by viewModel.watchHistoryEnabled.collectAsStateWithLifecycle() + val playbackResumeEnabled by viewModel.playbackResumeEnabled.collectAsStateWithLifecycle() + val playbackStateListsEnabled by viewModel.playbackStateListsEnabled + .collectAsStateWithLifecycle() + val searchHistoryEnabled by viewModel.searchHistoryEnabled.collectAsStateWithLifecycle() + val recaptchaCookiesPresent by viewModel.recaptchaCookiesPresent + .collectAsStateWithLifecycle() + val message by viewModel.message.collectAsStateWithLifecycle() + + var pendingClear by remember { mutableStateOf(null) } + + HistorySettingsScreenContent( + watchHistoryEnabled = watchHistoryEnabled, + playbackResumeEnabled = playbackResumeEnabled, + playbackStateListsEnabled = playbackStateListsEnabled, + searchHistoryEnabled = searchHistoryEnabled, + recaptchaCookiesPresent = recaptchaCookiesPresent, + message = message, + pendingClear = pendingClear, + onWatchHistoryEnabledChange = viewModel::setWatchHistoryEnabled, + onPlaybackResumeEnabledChange = viewModel::setPlaybackResumeEnabled, + onPlaybackStateListsEnabledChange = viewModel::setPlaybackStateListsEnabled, + onSearchHistoryEnabledChange = viewModel::setSearchHistoryEnabled, + onWipeMetadataCache = viewModel::wipeMetadataCache, + onRequestClear = { target -> pendingClear = target }, + onConfirmClear = { target -> + when (target) { + HistoryClearTarget.WATCH_HISTORY -> viewModel.clearWatchHistory() + HistoryClearTarget.PLAYBACK_STATES -> viewModel.clearPlaybackStates() + HistoryClearTarget.SEARCH_HISTORY -> viewModel.clearSearchHistory() + } + }, + onDismissClear = { pendingClear = null }, + onClearRecaptchaCookies = viewModel::clearRecaptchaCookies, + onMessageShown = viewModel::onMessageShown, + onNavigateUp = { navigator.navigateUp() } + ) +} + +@Composable +fun HistorySettingsScreenContent( + watchHistoryEnabled: Boolean = DEFAULT_ENABLE_WATCH_HISTORY, + playbackResumeEnabled: Boolean = DEFAULT_ENABLE_PLAYBACK_RESUME, + playbackStateListsEnabled: Boolean = DEFAULT_ENABLE_PLAYBACK_STATE_LISTS, + searchHistoryEnabled: Boolean = DEFAULT_ENABLE_SEARCH_HISTORY, + recaptchaCookiesPresent: Boolean = false, + message: HistoryMessage? = null, + pendingClear: HistoryClearTarget? = null, + onWatchHistoryEnabledChange: (Boolean) -> Unit = {}, + onPlaybackResumeEnabledChange: (Boolean) -> Unit = {}, + onPlaybackStateListsEnabledChange: (Boolean) -> Unit = {}, + onSearchHistoryEnabledChange: (Boolean) -> Unit = {}, + onWipeMetadataCache: () -> Unit = {}, + onRequestClear: (HistoryClearTarget) -> Unit = {}, + onConfirmClear: (HistoryClearTarget) -> Unit = {}, + onDismissClear: () -> Unit = {}, + onClearRecaptchaCookies: () -> Unit = {}, + onMessageShown: () -> Unit = {}, + onNavigateUp: () -> Unit = {} +) { + val scope = rememberCoroutineScope() + val snackbarHostState = remember { SnackbarHostState() } + + val messageText = message?.let { pending -> + when (pending) { + HistoryMessage.METADATA_CACHE_WIPED -> { + stringResource(Res.string.metadata_cache_wipe_complete_notice) + } + + HistoryMessage.WATCH_HISTORY_DELETED -> { + stringResource(Res.string.watch_history_deleted) + } + + HistoryMessage.PLAYBACK_STATES_DELETED -> { + stringResource(Res.string.watch_history_states_deleted) + } + + HistoryMessage.SEARCH_HISTORY_DELETED -> { + stringResource(Res.string.search_history_deleted) + } + + HistoryMessage.RECAPTCHA_COOKIES_CLEARED -> { + stringResource(Res.string.recaptcha_cookies_cleared) + } + } + } + + LaunchedEffect(message) { + if (messageText == null) { + return@LaunchedEffect + } + // Showing the snackbar from the surrounding scope instead of this effect, so that marking + // the message as seen below cannot cancel it by restarting the effect + scope.launch { snackbarHostState.showSnackbar(messageText) } + onMessageShown() + } + + Scaffold( + topBar = { + TopAppBar( + title = stringResource(Res.string.settings_category_history_title), + onNavigateUp = onNavigateUp + ) + }, + snackbarHost = { SnackbarHost(snackbarHostState) } + ) { paddingValues -> + Column( + modifier = Modifier + .fillMaxSize() + .padding(top = paddingValues.calculateTopPadding()) + .verticalScroll(rememberScrollState()) + .padding(WindowInsets.navigationBars.asPaddingValues()) + ) { + SwitchPreference( + title = stringResource(Res.string.enable_watch_history_title), + summary = stringResource(Res.string.enable_watch_history_summary), + checked = watchHistoryEnabled, + onCheckedChange = onWatchHistoryEnabledChange + ) + + SwitchPreference( + title = stringResource(Res.string.enable_playback_resume_title), + summary = stringResource(Res.string.enable_playback_resume_summary), + checked = playbackResumeEnabled, + onCheckedChange = onPlaybackResumeEnabledChange, + enabled = watchHistoryEnabled + ) + SwitchPreference( + title = stringResource(Res.string.enable_playback_state_lists_title), + summary = stringResource(Res.string.enable_playback_state_lists_summary), + checked = playbackStateListsEnabled, + onCheckedChange = onPlaybackStateListsEnabledChange, + enabled = watchHistoryEnabled + ) + SwitchPreference( + title = stringResource(Res.string.enable_search_history_title), + summary = stringResource(Res.string.enable_search_history_summary), + checked = searchHistoryEnabled, + onCheckedChange = onSearchHistoryEnabledChange + ) + + PreferenceCategoryTitle( + title = stringResource(Res.string.settings_category_clear_data_title) + ) + + PreferenceRow( + title = stringResource(Res.string.metadata_cache_wipe_title), + summary = stringResource(Res.string.metadata_cache_wipe_summary), + onClick = onWipeMetadataCache + ) + PreferenceRow( + title = stringResource(Res.string.clear_views_history_title), + summary = stringResource(Res.string.clear_views_history_summary), + onClick = { onRequestClear(HistoryClearTarget.WATCH_HISTORY) } + ) + PreferenceRow( + title = stringResource(Res.string.clear_playback_states_title), + summary = stringResource(Res.string.clear_playback_states_summary), + onClick = { onRequestClear(HistoryClearTarget.PLAYBACK_STATES) } + ) + PreferenceRow( + title = stringResource(Res.string.clear_search_history_title), + summary = stringResource(Res.string.clear_search_history_summary), + onClick = { onRequestClear(HistoryClearTarget.SEARCH_HISTORY) } + ) + PreferenceRow( + title = stringResource(Res.string.clear_cookie_title), + summary = stringResource(Res.string.clear_cookie_summary), + enabled = recaptchaCookiesPresent, + onClick = onClearRecaptchaCookies + ) + } + } + + if (pendingClear != null) { + ClearDataConfirmationDialog( + target = pendingClear, + onConfirm = { + onConfirmClear(pendingClear) + onDismissClear() + }, + onDismiss = onDismissClear + ) + } +} + +@Composable +private fun ClearDataConfirmationDialog( + target: HistoryClearTarget, + onConfirm: () -> Unit, + onDismiss: () -> Unit +) { + val title = when (target) { + HistoryClearTarget.WATCH_HISTORY -> { + stringResource(Res.string.delete_view_history_alert) + } + + HistoryClearTarget.PLAYBACK_STATES -> { + stringResource(Res.string.delete_playback_states_alert) + } + + HistoryClearTarget.SEARCH_HISTORY -> { + stringResource(Res.string.delete_search_history_alert) + } + } + + AlertDialog( + onDismissRequest = onDismiss, + title = { Text(text = title) }, + confirmButton = { + TextButton(onClick = onConfirm) { + Text(text = stringResource(Res.string.delete)) + } + }, + dismissButton = { + TextButton(onClick = onDismiss) { + Text(text = stringResource(Res.string.cancel)) + } + } + ) +} + +@PreviewWrapper(ThemePreviewProvider::class) +@PreviewLightDark +@Composable +private fun HistorySettingsScreenPreview() { + HistorySettingsScreenContent() +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt index 0f5ba5373..61a132472 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/SettingsHomeScreen.kt @@ -68,6 +68,10 @@ fun SettingsHomeScreen( Destination.DownloadSettings ) + SettingsCategoryType.HISTORY -> navigator.navigateTo( + Destination.HistorySettings + ) + // TODO: wire remaining sub-screens as they are migrated else -> Unit } diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/HistorySettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/HistorySettingsViewModel.kt new file mode 100644 index 000000000..4c8112ae4 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/HistorySettingsViewModel.kt @@ -0,0 +1,121 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.viewmodel.settings + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.russhwolf.settings.Settings +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import net.newpipe.app.platform.HistoryActions +import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_PLAYBACK_RESUME +import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_PLAYBACK_STATE_LISTS +import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_SEARCH_HISTORY +import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_WATCH_HISTORY +import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_RECAPTCHA_COOKIES +import net.newpipe.app.preferences.HistoryPreferences.KEY_ENABLE_PLAYBACK_RESUME +import net.newpipe.app.preferences.HistoryPreferences.KEY_ENABLE_PLAYBACK_STATE_LISTS +import net.newpipe.app.preferences.HistoryPreferences.KEY_ENABLE_SEARCH_HISTORY +import net.newpipe.app.preferences.HistoryPreferences.KEY_ENABLE_WATCH_HISTORY +import net.newpipe.app.preferences.HistoryPreferences.KEY_RECAPTCHA_COOKIES +import org.koin.core.annotation.KoinViewModel + +enum class HistoryMessage { + METADATA_CACHE_WIPED, + WATCH_HISTORY_DELETED, + PLAYBACK_STATES_DELETED, + SEARCH_HISTORY_DELETED, + RECAPTCHA_COOKIES_CLEARED +} + +@KoinViewModel +class HistorySettingsViewModel( + private val settings: Settings, + private val historyActions: HistoryActions +) : ViewModel() { + + val watchHistoryEnabled: StateFlow + field = booleanFlow(KEY_ENABLE_WATCH_HISTORY, DEFAULT_ENABLE_WATCH_HISTORY) + + val playbackResumeEnabled: StateFlow + field = booleanFlow(KEY_ENABLE_PLAYBACK_RESUME, DEFAULT_ENABLE_PLAYBACK_RESUME) + + val playbackStateListsEnabled: StateFlow + field = booleanFlow( + KEY_ENABLE_PLAYBACK_STATE_LISTS, + DEFAULT_ENABLE_PLAYBACK_STATE_LISTS + ) + + val searchHistoryEnabled: StateFlow + field = booleanFlow(KEY_ENABLE_SEARCH_HISTORY, DEFAULT_ENABLE_SEARCH_HISTORY) + + val recaptchaCookiesPresent: StateFlow + field = MutableStateFlow(storedRecaptchaCookies().isNotEmpty()) + + val message: StateFlow + field = MutableStateFlow(null) + + fun setWatchHistoryEnabled(value: Boolean) = watchHistoryEnabled + .persist(KEY_ENABLE_WATCH_HISTORY, value) + + fun setPlaybackResumeEnabled(value: Boolean) = playbackResumeEnabled + .persist(KEY_ENABLE_PLAYBACK_RESUME, value) + + fun setPlaybackStateListsEnabled(value: Boolean) = playbackStateListsEnabled + .persist(KEY_ENABLE_PLAYBACK_STATE_LISTS, value) + + fun setSearchHistoryEnabled(value: Boolean) = searchHistoryEnabled + .persist(KEY_ENABLE_SEARCH_HISTORY, value) + + fun wipeMetadataCache() { + historyActions.wipeMetadataCache() + message.value = HistoryMessage.METADATA_CACHE_WIPED + } + + fun clearWatchHistory() = clearThenReport( + success = HistoryMessage.WATCH_HISTORY_DELETED, + deletion = historyActions::clearWatchHistory + ) + + fun clearPlaybackStates() = clearThenReport( + success = HistoryMessage.PLAYBACK_STATES_DELETED, + deletion = historyActions::clearPlaybackStates + ) + + fun clearSearchHistory() = clearThenReport( + success = HistoryMessage.SEARCH_HISTORY_DELETED, + deletion = historyActions::clearSearchHistory + ) + + fun clearRecaptchaCookies() { + historyActions.clearRecaptchaCookies() + settings.putString(KEY_RECAPTCHA_COOKIES, DEFAULT_RECAPTCHA_COOKIES) + recaptchaCookiesPresent.value = false + message.value = HistoryMessage.RECAPTCHA_COOKIES_CLEARED + } + + fun onMessageShown() { + message.value = null + } + + private fun clearThenReport(success: HistoryMessage, deletion: suspend () -> Boolean) { + viewModelScope.launch { + if (deletion()) { + message.value = success + } + } + } + + private fun storedRecaptchaCookies() = settings.getString(KEY_RECAPTCHA_COOKIES, DEFAULT_RECAPTCHA_COOKIES) + + private fun booleanFlow(key: String, defaultValue: Boolean) = MutableStateFlow(settings.getBoolean(key, defaultValue)) + + private fun MutableStateFlow.persist(key: String, newValue: Boolean) { + settings.putBoolean(key, newValue) + value = newValue + } +} From c6288316a50832d492793cf4c405dc5904810266 Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Fri, 23 Oct 2026 06:55:45 -0700 Subject: [PATCH 138/155] add history settings test --- .../newpipe/settings/ComposeHistoryActions.kt | 1 - .../newpipe/app/extensions/SettingsModule.kt | 7 + .../settings/HistorySettingsScreenTest.kt | 122 ++++++++++++++++++ 3 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreenTest.kt diff --git a/app/src/main/java/org/schabi/newpipe/settings/ComposeHistoryActions.kt b/app/src/main/java/org/schabi/newpipe/settings/ComposeHistoryActions.kt index c0aa79453..def638316 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ComposeHistoryActions.kt +++ b/app/src/main/java/org/schabi/newpipe/settings/ComposeHistoryActions.kt @@ -17,7 +17,6 @@ import org.schabi.newpipe.error.UserAction import org.schabi.newpipe.local.history.HistoryRecordManager import org.schabi.newpipe.util.InfoCache -@Suppress("unused") class ComposeHistoryActions(private val context: Context) : HistoryActions { private val recordManager = HistoryRecordManager(context) diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/extensions/SettingsModule.kt b/shared/src/commonTest/kotlin/net/newpipe/app/extensions/SettingsModule.kt index c04e7dfc4..e6e8fd870 100644 --- a/shared/src/commonTest/kotlin/net/newpipe/app/extensions/SettingsModule.kt +++ b/shared/src/commonTest/kotlin/net/newpipe/app/extensions/SettingsModule.kt @@ -13,6 +13,13 @@ import org.koin.dsl.module /** * Builds a Koin module exposing [settings] as the only [Settings] instance. * + * Every test goes through this single `single` declaration on purpose. The Koin compiler + * plugin keeps the metadata of a `single` binding in the = + * names of the synthetic parameters it + * generates, and parameter names are not part of an IR signature. Declaring `single` in + * more than one place therefore produces colliding signatures that fail klib serialization on the + * native targets. + * * @param settings Settings to expose, empty by default */ fun settingsModule(settings: Settings = MapSettings()): Module = module { diff --git a/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreenTest.kt b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreenTest.kt new file mode 100644 index 000000000..c00316a06 --- /dev/null +++ b/shared/src/commonTest/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreenTest.kt @@ -0,0 +1,122 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.screen.settings + +import androidx.compose.ui.test.ExperimentalTestApi +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performScrollTo +import androidx.compose.ui.test.v2.runComposeUiTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertNull +import net.newpipe.app.extensions.settingsModule +import net.newpipe.app.extensions.withKoin +import newpipe.shared.generated.resources.Res +import newpipe.shared.generated.resources.clear_cookie_title +import newpipe.shared.generated.resources.clear_views_history_title +import newpipe.shared.generated.resources.delete +import newpipe.shared.generated.resources.delete_view_history_alert +import newpipe.shared.generated.resources.enable_playback_resume_title +import newpipe.shared.generated.resources.enable_watch_history_title +import newpipe.shared.generated.resources.settings_category_history_title +import org.jetbrains.compose.resources.getString + +@OptIn(ExperimentalTestApi::class) +class HistorySettingsScreenTest { + + @Test + fun rendersTitleAndWatchHistoryRow() = runComposeUiTest { + withKoin( + modules = listOf(settingsModule()), + content = { HistorySettingsScreenContent() }, + onContent = { + onNodeWithText(getString(Res.string.settings_category_history_title)) + .assertIsDisplayed() + onNodeWithText(getString(Res.string.enable_watch_history_title)) + .assertIsDisplayed() + } + ) + } + + @Test + fun dependentRowDoesNotToggleWhileWatchHistoryIsOff() = runComposeUiTest { + var changed: Boolean? = null + withKoin( + modules = listOf(settingsModule()), + content = { + HistorySettingsScreenContent( + watchHistoryEnabled = false, + onPlaybackResumeEnabledChange = { value -> changed = value } + ) + }, + onContent = { + onNodeWithText(getString(Res.string.enable_playback_resume_title)).performClick() + assertNull(changed) + } + ) + } + + @Test + fun clearWatchHistoryRowAsksBeforeDeleting() = runComposeUiTest { + var confirmed: HistoryClearTarget? = null + withKoin( + modules = listOf(settingsModule()), + content = { + HistorySettingsScreenContent( + pendingClear = HistoryClearTarget.WATCH_HISTORY, + onConfirmClear = { target -> confirmed = target } + ) + }, + onContent = { + onNodeWithText(getString(Res.string.delete_view_history_alert)).assertIsDisplayed() + onNodeWithText(getString(Res.string.delete)).performClick() + assertEquals(HistoryClearTarget.WATCH_HISTORY, confirmed) + } + ) + } + + @Test + fun clearRowOnlyRequestsConfirmationWhenTapped() = runComposeUiTest { + var requested: HistoryClearTarget? = null + withKoin( + modules = listOf(settingsModule()), + content = { + HistorySettingsScreenContent( + onRequestClear = { target -> requested = target } + ) + }, + onContent = { + onNodeWithText(getString(Res.string.clear_views_history_title)) + .performScrollTo() + .performClick() + assertEquals(HistoryClearTarget.WATCH_HISTORY, requested) + } + ) + } + + @Test + fun cookieRowIsInertWithoutStoredCookies() = runComposeUiTest { + var clicked = false + withKoin( + modules = listOf(settingsModule()), + content = { + HistorySettingsScreenContent( + recaptchaCookiesPresent = false, + onClearRecaptchaCookies = { clicked = true } + ) + }, + onContent = { + onNodeWithText(getString(Res.string.clear_cookie_title)) + .performScrollTo() + .performClick() + assertFalse(clicked) + } + ) + } +} From c32810362e0b7ca192c3ee9b77ca83e81ca8b02d Mon Sep 17 00:00:00 2001 From: Ida Delphine Date: Mon, 26 Oct 2026 09:24:08 -0700 Subject: [PATCH 139/155] move HistoryMessage class --- .../screen/settings/HistorySettingsScreen.kt | 2 +- .../app/screen/settings/model/HistoryMessage.kt | 17 +++++++++++++++++ .../settings/HistorySettingsViewModel.kt | 9 +-------- 3 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/model/HistoryMessage.kt diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreen.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreen.kt index b39701acc..107a3671b 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreen.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/HistorySettingsScreen.kt @@ -41,7 +41,7 @@ import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_PLAYBACK_ST import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_SEARCH_HISTORY import net.newpipe.app.preferences.HistoryPreferences.DEFAULT_ENABLE_WATCH_HISTORY import net.newpipe.app.preview.ThemePreviewProvider -import net.newpipe.app.viewmodel.settings.HistoryMessage +import net.newpipe.app.screen.settings.model.HistoryMessage import net.newpipe.app.viewmodel.settings.HistorySettingsViewModel import newpipe.shared.generated.resources.Res import newpipe.shared.generated.resources.cancel diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/model/HistoryMessage.kt b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/model/HistoryMessage.kt new file mode 100644 index 000000000..326720381 --- /dev/null +++ b/shared/src/commonMain/kotlin/net/newpipe/app/screen/settings/model/HistoryMessage.kt @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2026 NewPipe e.V. + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +package net.newpipe.app.screen.settings.model + +/** + * One-off confirmations shown after an action on the History and cache settings screen. + */ +enum class HistoryMessage { + METADATA_CACHE_WIPED, + WATCH_HISTORY_DELETED, + PLAYBACK_STATES_DELETED, + SEARCH_HISTORY_DELETED, + RECAPTCHA_COOKIES_CLEARED +} diff --git a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/HistorySettingsViewModel.kt b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/HistorySettingsViewModel.kt index 4c8112ae4..7b648d1a6 100644 --- a/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/HistorySettingsViewModel.kt +++ b/shared/src/commonMain/kotlin/net/newpipe/app/viewmodel/settings/HistorySettingsViewModel.kt @@ -22,16 +22,9 @@ import net.newpipe.app.preferences.HistoryPreferences.KEY_ENABLE_PLAYBACK_STATE_ import net.newpipe.app.preferences.HistoryPreferences.KEY_ENABLE_SEARCH_HISTORY import net.newpipe.app.preferences.HistoryPreferences.KEY_ENABLE_WATCH_HISTORY import net.newpipe.app.preferences.HistoryPreferences.KEY_RECAPTCHA_COOKIES +import net.newpipe.app.screen.settings.model.HistoryMessage import org.koin.core.annotation.KoinViewModel -enum class HistoryMessage { - METADATA_CACHE_WIPED, - WATCH_HISTORY_DELETED, - PLAYBACK_STATES_DELETED, - SEARCH_HISTORY_DELETED, - RECAPTCHA_COOKIES_CLEARED -} - @KoinViewModel class HistorySettingsViewModel( private val settings: Settings, From 24b8cbe66b631f36fcdc82a730de7eba2dfb414b Mon Sep 17 00:00:00 2001 From: Nuralysha Izzati Binti Zairei Date: Sat, 31 Oct 2026 03:21:56 +1100 Subject: [PATCH 140/155] fix(feed): prevent group name subtitle leak into other fragments (#13366) (#13974) Co-authored-by: TobiGr --- .../schabi/newpipe/local/feed/FeedFragment.kt | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt index 89b89a800..d67720a24 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/FeedFragment.kt @@ -172,6 +172,10 @@ class FeedFragment : BaseStateFragment() { super.onResume() updateRelativeTimeViews() + if (groupName.isNotEmpty()) { + activity?.supportActionBar?.subtitle = groupName + } + if (updateListViewModeOnResume) { updateListViewModeOnResume = false @@ -182,6 +186,16 @@ class FeedFragment : BaseStateFragment() { } } + override fun onStop() { + super.onStop() + + // Clear the activities' action bar subtitle when leaving the fragment to prevent + // the feed group name from leaking into subsequent views. (#13366) + if (activity?.supportActionBar?.subtitle == groupName) { + activity?.supportActionBar?.subtitle = null + } + } + private fun setupListViewMode() { // does everything needed to setup the layouts for grid or list modes groupAdapter.spanCount = if (shouldUseGridLayout(context)) getGridSpanCountStreams(context) else 1 @@ -288,13 +302,6 @@ class FeedFragment : BaseStateFragment() { } super.onDestroy() - - if ( - (groupName != "") && - (activity?.supportActionBar?.subtitle == groupName) - ) { - activity?.supportActionBar?.subtitle = null - } } override fun onDestroyView() { From 6d624c8da050fc7028460d6860a9a2168cabb027 Mon Sep 17 00:00:00 2001 From: Suyun Hou Date: Sat, 31 Oct 2026 21:08:40 +1100 Subject: [PATCH 141/155] [Nightly] Fix queue progress display in landscape mode (#13972) --- .../layout-land/activity_player_queue_control.xml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/src/main/res/layout-land/activity_player_queue_control.xml b/app/src/main/res/layout-land/activity_player_queue_control.xml index ad2655380..a88c0382a 100644 --- a/app/src/main/res/layout-land/activity_player_queue_control.xml +++ b/app/src/main/res/layout-land/activity_player_queue_control.xml @@ -301,6 +301,19 @@ tools:ignore="HardcodedText" tools:text="1:23:49" /> + + Date: Sat, 31 Oct 2026 21:27:06 +1100 Subject: [PATCH 142/155] [Bandcamp] Fix NetworkOnMainThreadException on rotate / back (#13955) --- .../list/channel/ChannelTabFragment.java | 53 +++++++++++++++---- 1 file changed, 43 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java index 5d398821a..4cfcb847c 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/channel/ChannelTabFragment.java @@ -47,6 +47,14 @@ public class ChannelTabFragment extends BaseListInfoFragment loadResult(final boolean forceLoad) { - return ExtractorHelper.getChannelTab(serviceId, tabHandler, forceLoad); + return ExtractorHelper.getChannelTab(serviceId, tabHandler, forceLoad) + // Creating the lightweight handler may perform network requests, so it must not + // happen on the main thread. + .doOnSuccess(result -> + lightweightTabHandler = createLightweightTabHandler(result, tabHandler)); } @Override @@ -115,33 +127,54 @@ public class ChannelTabFragment extends BaseListInfoFragment Date: Sun, 25 Oct 2026 11:50:37 +0100 Subject: [PATCH 143/155] Update KAO / Keep Android Open message to match the latest developments Remove "solution" button which was linking to a GitHub repository. The information provided here was changed. Additionally, more and updated information is now displayed on the KAO website. --- app/src/main/java/org/schabi/newpipe/MainActivity.java | 8 ++------ app/src/main/res/values/strings.xml | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 6aa87b4bd..d810d814d 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -992,7 +992,6 @@ public class MainActivity extends AppCompatActivity { if (lastCheck.plus(30, ChronoUnit.DAYS).isBefore(now)) { final String detailsUrl = getKeepAndroidOpenDetailsUrl(); - final var solutionUrl = "https://github.com/woheller69/FreeDroidWarn#solutions"; final var dialog = new AlertDialog.Builder(this) .setTitle("Keep Android Open") @@ -1001,16 +1000,13 @@ public class MainActivity extends AppCompatActivity { .setPositiveButton(android.R.string.ok, (d, w) -> prefs.edit() .putLong(lastCheckKey, now.toEpochMilli()) .apply()) - .setNeutralButton(R.string.kao_solution, null) - .setNegativeButton(R.string.kao_dialog_more_info, null) + .setNeutralButton(R.string.kao_dialog_more_info, null) .show(); // If we use setNeutralButton/setNegativeButton, dialog will close after pressing the // buttons, but we want it to close only when positive button is pressed - dialog.getButton(AlertDialog.BUTTON_NEGATIVE) - .setOnClickListener(v -> ShareUtils.openUrlInBrowser(this, detailsUrl)); dialog.getButton(AlertDialog.BUTTON_NEUTRAL) - .setOnClickListener(v -> ShareUtils.openUrlInBrowser(this, solutionUrl)); + .setOnClickListener(v -> ShareUtils.openUrlInBrowser(this, detailsUrl)); } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d8d1fadee..7eff35f99 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -899,7 +899,7 @@ HTTP error 403 received from server while playing, likely caused by an IP ban or streaming URL deobfuscation issues %1$s refused to provide data, asking for a login to confirm the requester is not a bot.\n\nYour IP might have been temporarily banned by %1$s, you can wait some time or switch to a different IP (for example by turning on/off a VPN, or by switching from WiFi to mobile data).\n\nPlease see this FAQ entry for more information. This content is not available for the currently selected content country.\n\nChange your selection from \"Settings > Content > Default content country\". - In August 2025, Google announced that as of September 2026, installing apps will require developer verification for all Android apps on certified devices, including those installed outside of the Play Store. Since the developers of NewPipe do not agree to this requirement, NewPipe will no longer work on certified Android devices after that time. + Google has started enforcing a new Android developer verification requirement that makes it harder to install NewPipe in Brazil, Indonesia, Singapore, and Thailand, with a global rollout planned for 2027.\n\nUnless the requirements are changed, NewPipe may become harder or impossible to install on certified Android devices in near future. Details Solution NewPipe is dropping support for Android 5 From f6fa917f5c4b604753f430f45348206179d68efa Mon Sep 17 00:00:00 2001 From: TobiGr Date: Mon, 2 Nov 2026 09:41:08 +0100 Subject: [PATCH 144/155] Remove outdated translations for KAO dialog --- app/src/main/res/values-ar/strings.xml | 2 +- app/src/main/res/values-az/strings.xml | 2 +- app/src/main/res/values-be/strings.xml | 2 +- app/src/main/res/values-bg/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-en-rGB/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-et/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-gl/strings.xml | 2 +- app/src/main/res/values-he/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 2 +- app/src/main/res/values-hu/strings.xml | 2 +- app/src/main/res/values-in/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-lv/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pa/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt-rPT/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sv/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-zh-rCN/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- 36 files changed, 36 insertions(+), 36 deletions(-) diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index 0b75c75e5..662c73df2 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -859,7 +859,7 @@ تم تلقي خطأ HTTP 403 من الخادم أثناء التشغيل، ويرجح أن يكون السبب هو حظر عنوان IP أو مشكلات في إزالة التعتيم عن عنوان URL للبث رفض %1$s تقديم البيانات، وطلب تسجيل الدخول للتأكد من أن الطالب ليس روبوتًا.\n\nربما تم حظر عنوان IP الخاص بك مؤقتًا من قبل %1$s، يمكنك الانتظار بعض الوقت أو التبديل إلى عنوان IP مختلف (على سبيل المثال عن طريق تشغيل/إيقاف تشغيل VPN، أو التبديل من WiFi إلى بيانات الهاتف المحمول).\n\nيرجى الاطلاع على هذا السؤال الشائع لمزيد من المعلومات. هذا المحتوى غير متاح للبلد المحدد حاليًا.\n\nقم بتغيير اختيارك من ”الإعدادات > المحتوى > البلد الافتراضي للمحتوى“. - أعلنت Google أنه ابتداءً من عام 2026/2027، ستتطلب جميع التطبيقات على الأجهزة المعتمدة من Android من المطورين تقديم معلومات هويتهم الشخصية مباشرةً إلى Google. بما أن مطوري هذا التطبيق لا يوافقون على هذا الشرط، فلن يعمل هذا التطبيق على أجهزة Android المعتمدة بعد ذلك الوقت. + تفاصيل حل diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index a837c14ba..a16c59ae8 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -803,7 +803,7 @@ HTTP xətası 403 oynadarkən serverdən alındı, ehtimal ki, IP qadağası və ya yayım URL-nin deobfuscation problemləri ilə bağlıdır %1$s sorğuçunun bot olmadığını təsdiqləmək üçün giriş tələb edərək data təmin etməkdən imtina etdi.\n\nIP-niz %1$s tərəfindən müvəqqəti şəkildə qadağan oluna bilər, bir müddət gözləyə və ya başqa IP-yə keçə bilərsiniz (məsələn, VPN-i açıb/qapatmaqla və ya WiFi-dan mobil dataya keçməklə).\n\nDaha çox məlumat üçün xahiş olunur bu Tez-tez Verilən Suallar qeydinə baxın. Bu məzmun hazırda seçilən məzmun ölkəsi üçün əlçatan deyil. \n\nSeçiminizi \"Tənzimləmələr > Məzmun > İlkin məzmun ölkəsi\"- dən dəyişin. - 2025 avqustunda, Google 2026-cı ilin sentyabrından etibarən tətbiqlərin quraşdırılması Play Store xaricində quraşdırılanlar daxil olmaqla, sertifikatlaşdırılan cihazlardakı bütün Android tətbiqləri üçün tərtibatçı təsdiqlənməsini tələb edəcək deyə bəyan etdi. NewPipe tərtibatçıları bu tələblə razılaşmadığı üçün NewPipe bu vaxtdan sonra artıq sertifikatlaşdırılan Android cihazlarında işləməyəcək. + Təfərrüatlar Həll olunma diff --git a/app/src/main/res/values-be/strings.xml b/app/src/main/res/values-be/strings.xml index 5c212e436..6f019d0ce 100644 --- a/app/src/main/res/values-be/strings.xml +++ b/app/src/main/res/values-be/strings.xml @@ -826,7 +826,7 @@ Аб\'яднаныя трэнды YouTube выдалены Імпартаваць падпіскі Экспартаваць падпіскі - У жніўні 2025 года Google абвясціў, што з верасня 2026 года распрацоўшчыкі праграм Android павінны рэгістравацца, каб мець магчымасць ўсталявання сваіх праграм на сертыфікаваныя прылады. Гэта тычыцца і праграм, якія ўсталёўваюцца не з Play Store. Паколькі распрацоўшчыкі NewPipe не згодныя з такім патрабаваннем, пасля гэтага часу NewPipe больш не будзе працаваць на сертыфікаваных прыладах Android. + Падрабязнасці Рашэнне Каб выкарыстоўваць аконны прайгравальнік, у наступным меню налад Android выберыце %1$s і ўключыце %2$s. diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 452e9da79..e96c593db 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -803,7 +803,7 @@ HTTP грешка 403, получена от сървъра по време на възпроизвеждане, вероятно причинена от забрана на IP адреса или проблеми с деобфускацията на URL адреси за стрийминг %1$s отказа да предостави данни, като поиска вход, за да потвърди, че заявителят не е бот.\n\nВашият IP адрес може да е временно забранен от %1$s. Можете да изчакате известно време или да превключите към друг IP адрес (например като включите/изключите VPN или като превключите от WiFi към мобилни данни).\n\nМоля, вижте тази статия с ЧЗВ за повече информация. Това съдържание не е налично за текущо избраната държава на съдържанието.\n\nПроменете избора си от \"Настройки > Съдържание > Държава на съдържанието по подразбиране\". - През август 2025 г. Google обяви, че от септември 2026 г. инсталирането на приложения ще изисква проверка от разработчика за всички приложения за Android на сертифицирани устройства, включително тези, инсталирани извън Play Store. Тъй като разработчиците на NewPipe не са съгласни с това изискване, NewPipe вече няма да работи на сертифицирани устройства с Android след този период. + Детайли Решение diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index a21af8fff..0163d6354 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -840,7 +840,7 @@ Error HTTP 403 rebut del servidor durant la reproducció, probablement causat per un bloqueig d\'IP o problemes de desofuscació de la URL de transmissió \'\'%1$s es va negar a proporcionar dades, sol·licitant un inici de sessió per confirmar que el sol·licitant no és un bot.\n\nÉs possible que %1$s hagi bloquejat temporalment la vostra IP. Pots esperar un temps o canviar a una IP diferent (per exemple, activant/desactivant una VPN o canviant de Wi-Fi a dades mòbils).\n\nConsulta aquesta entrada de preguntes freqüents per obtenir més informació’ Aquest contingut no està disponible per al país de contingut seleccionat actualment.\n\nCanvia la teva selecció a \"Paràmetres > Contingut > País de contingut predeterminat\". - A l\'agost del 2025, Google va anunciar que, a partir del setembre del 2026, la instal·lació d\'aplicacions requerirà la verificació del desenvolupador per a totes les aplicacions d\'Android en dispositius certificats, incloses les instal·lades fora de la Play Store. Com que els desenvolupadors de NewPipe no estan d\'acord amb aquest requisit, NewPipe deixarà de funcionar en dispositius Android certificats després d\'aquesta data. + NewPipe deixarà de ser compatible amb Android 5. Malauradament, NewPipe depèn d\'algunes biblioteques que van deixar de ser compatibles amb Android 5.0 i 5.1. Per tant, la propera versió de NewPipe només funcionarà en dispositius amb Android 6 o superior. Llegeix més a la publicació del bloc. pòdcasts diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 56ac5b1f5..148bcbaf9 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -831,7 +831,7 @@ Chyba HTTP 403 obdržená od serveru během přehrávání, pravděpodobně způsobená zákazem IP adresy nebo problémy s deobfuskací streamovací adresy URL %1$s odmítl poskytnout data, žádá o přihlášení k potvrzení, že žadatel není bot.\n\nVaše IP adresa mohla být dočasně zablokována službou %1$s, můžete nějakou dobu počkat nebo přepnout na jinou IP adresu (například zapnutím/vypnutím VPN nebo přepnutím z Wi-Fi na mobilní data).\n\nPro více informací si přečtěte tento záznam v FAQ. Tento obsah není pro aktuálně vybranou zemi obsahu dostupný.\n\nZměňte výběr v nabídce \"Nastavení > Obsah > Výchozí země obsahu\". - Společnost Google oznámila, že od roku 2026/2027 budou všechny aplikace na certifikovaných zařízeních Android vyžadovat, aby vývojář odeslal své osobní identifikační údaje přímo společnosti Google. Jelikož vývojáři této aplikace s tímto požadavkem nesouhlasí, aplikace po tomto datu přestane na certifikovaných zařízeních Android fungovat. + Podrobnosti Řešení diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index db42fcc65..3b3575dcd 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -803,7 +803,7 @@ HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch eine IP-Sperre oder Probleme beim Entschlüsseln der Streaming-URL %1$s hat die Datenbereitstellung verweigert und verlangt eine Anmeldung, um zu bestätigen, dass es sich bei dem Anfragenden nicht um einen Bot handelt.\n\nDeine IP-Adresse wurde möglicherweise vorübergehend von %1$s gesperrt. Du kannst einige Zeit warten oder zu einer anderen IP-Adresse wechseln (z. B. durch Ein- und Ausschalten eines VPNs oder durch Wechseln von WLAN zu mobilen Daten).\n\nWeitere Informationen findest du unter diesem FAQ-Eintrag. Dieser Inhalt ist für das aktuell ausgewählte Land des Inhalts nicht verfügbar.\n\nÄndere die Auswahl unter „Einstellungen > Inhalt > Bevorzugtes Land des Inhalts“. - Im August 2025 gab Google bekannt, dass ab September 2026 für die Installation von Apps eine Entwicklerüberprüfung für alle Android-Apps auf zertifizierten Geräten erforderlich sein wird, einschließlich derjenigen, die außerhalb des Play Store installiert wurden. Da die Entwickler von NewPipe dieser Forderung nicht nachkommen, wird NewPipe nach diesem Zeitpunkt auf zertifizierten Android-Geräten nicht mehr funktionieren. + Details Lösung diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 8f6dbc614..4a2ded98e 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -805,7 +805,7 @@ Αυτό το περιεχόμενο δεν είναι διαθέσιμο για την τρέχουσα επιλεγμένη χώρα περιεχομένου.\n\nΑλλάξτε την επιλογή σας από \"Ρυθμίσεις > Περιεχόμενο > Προεπιλεγμένη χώρα περιεχομένου\". Λεπτομέρειες Λύση - Τον Αύγουστο του 2025, η Google ανακοίνωσε ότι από τον Σεπτέμβριο του 2026, η εγκατάσταση εφαρμογών θα απαιτεί επαλήθευση προγραμματιστή για όλες τις εφαρμογές Android σε πιστοποιημένες συσκευές, συμπεριλαμβανομένων εκείνων που είναι εγκατεστημένες εκτός του Play Store. Δεδομένου ότι οι προγραμματιστές του NewPipe δεν συμφωνούν με αυτήν την απαίτηση, το NewPipe δεν θα λειτουργεί πλέον σε πιστοποιημένες συσκευές Android μετά από αυτό το χρονικό διάστημα. + Εξαγωγή %d συνδρομής… Εξαγωγή %d συνδρομών… diff --git a/app/src/main/res/values-en-rGB/strings.xml b/app/src/main/res/values-en-rGB/strings.xml index 494e2e75a..4e6dfa728 100644 --- a/app/src/main/res/values-en-rGB/strings.xml +++ b/app/src/main/res/values-en-rGB/strings.xml @@ -820,7 +820,7 @@ HTTP error 403 received from server while playing, likely caused by an IP ban or streaming URL de-obfuscation issues %1$s refused to provide data, asking for a login to confirm the requester is not a bot.\n\nYour IP might have been temporarily banned by %1$s, you can wait some time or switch to a different IP (for example by turning on/off a VPN, or by switching from WiFi to mobile data).\n\nPlease see this FAQ entry for more information. This content is not available for the currently selected content country.\n\nChange your selection from \'Settings > Content > Default content country\'. - In August 2025, Google announced that, as of September 2026, installing apps will require developer verification for all Android apps on certified devices, including those installed outside of the Play Store. Since the developers of NewPipe do not agree to this requirement, NewPipe will no longer work on certified Android devices after that time. + Details Solution diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1694d1cbc..45c96b599 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -820,7 +820,7 @@ %s bill. Este contenido no está disponible para el país actualmente seleccionado.\n\nPuedes cambiarlo en: «Configuración > Contenido > País predeterminado para el contenido». Para usar el reproductor emergente, selecciona %1$s en el siguiente menú de la configuración de Android y habilita %2$s. - En Agosto de 2025, Google ha anunciado que, a partir de 2026/2027, todas las aplicaciones en dispositivos Android certificados requerirán que los desarrolladores envíen sus datos personales de identidad directamente a Google. Como los desarrolladores de NewPipe no están de acuerdo con este requisito, la aplicación dejará de funcionar en dispositivos Android certificados después de esa fecha. + Detalles Solución diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index a1272854f..cadf7f0da 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -803,7 +803,7 @@ Esitamise ajal lisas server andmevoogu HTTP oleku 403 ning tavaliselt tähendab see, et sinu seadme IP-aadress on keelatud või voogedastuse võrguaadressi hägustamisvastastes meetmetes on viga See sisu pole saadaval hetkel kehtvas riigis.\n\nRiiki saad muuta: Seadistused > Sisu > Sisu vaikimisi riik. %1$s keeldus andmete edastamisest ning eeldab sisselogimist tuvastamaks, et tegemist pole robotiga.\n\nLisaks võib olla juhtunud, et %1$s on lisanud sinu seadme ip-aadressi ajutisse keelunimekirja. Sa võid oodata natuke aega või vahetada võrguühendus viisi (näiteks lülitades VPN sisse/välja või kasutades WiFi asemel mobiilset internetiühendust).\n\nLisateavet leiad siit korduva kippumate küsimuste alajaotusest. - 2025. aasta augustis teatas Google, et alates septembrist 2026 uute rakenduste paigaldamine kõikides uutes Androidi seadmetes eeldab arendajate verifitseerimist, sealhulgas juhtudel, kui selline rakendus on paigaldatud väljastpoolt Google Play rakendustepoodi. Kuna NewPipe\'i arendajad pole sellise nõudmisega nõus, siis sellise aja saabumisel NewPipe enam ei toimi sertifitseeritud Androidi seadmetes. + Üksikasjad Lahendus diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 932377d36..dc131fcfc 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -819,7 +819,7 @@ Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par un bannissement d\'IP ou des problèmes de désobfuscation de l\'URL de streaming %1$s a refusé de fournir des données et a demandé un identifiant pour confirmer que l\'auteur de la requête n\'est pas un robot.\n\nVotre adresse IP a peut-être été temporairement bloquée par %1$s. Vous pouvez patienter ou essayer une autre adresse IP (par exemple, en activant/désactivant un VPN ou en passant du Wi-Fi aux données mobiles).\n\nPour plus d\'informations, veuillez consulter cette FAQ. Ce contenu n\'est pas disponible pour le pays actuellement sélectionné.\n\nModifiez votre sélection dans « Paramètres > Contenu > Pays par défaut ». - En août 2025, Google a annoncé qu\'à compter de septembre 2026, l\'installation d\'applications nécessiterait une vérification par le développeur pour toutes les applications Android sur les appareils certifiés, y compris celles installées en dehors du Play Store. Les développeurs de NewPipe refusant cette exigence, NewPipe ne fonctionnera plus sur les appareils Android certifiés après cette date. + Détails Solution diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index ae5a9d70e..9b4a4f519 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -820,7 +820,7 @@ Erro HTTP 403 recibido do servidor mentres se reproducía, probablemente causado por unha prohibición de IP ou problemas de desofuscación do URL de transmisión \"%1$s negouse a proporcionar datos, solicitando un inicio de sesión para confirmar que o solicitante non é un bot.\n\nO teu IP pode ter sido prohibido temporalmente por %1$s, podes esperar un tempo ou cambiar a un IP diferente (por exemplo, activando/desactivando unha VPN ou cambiando de WiFi a datos móbiles).\n\nConsulta esta entrada de preguntas frecuentes para obter máis información.’ Este contido non está dispoñible para o país de contido seleccionado actualmente.\n\nCambia a túa selección desde \"Configuración > Contido > País de contido predeterminado\". - En agosto de 2025, Google anunciou que, a partir de setembro de 2026, a instalación de aplicacións requirirá a verificación do desenvolvedor para todas as aplicacións de Android en dispositivos certificados, incluídas as instaladas fóra de Play Store. Dado que os desenvolvedores de NewPipe non están de acordo con este requisito, NewPipe deixará de funcionar en dispositivos Android certificados despois dese tempo. + Detalles Solución NewPipe deixa de ser compatible con Android 5 diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 79339803c..2f11c9b85 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -837,7 +837,7 @@ ייבוא מנויים מייצוא קודם בקובץ .json ייצא את המינויים שלך לקובץ .json ייבוא מייצוא קודם - באוגוסט 2025, גוגל הודיעה כי החל מספטמבר 2026, התקנת יישומים תדרוש אימות מפתח עבור כל יישומי אנדרואיד במכשירים מוסמכים, כולל אלה שהותקנו מחוץ לחנות Play. מכיוון שהמפתחים של NewPipe אינם מסכימים לדרישה זו, NewPipe כבר לא יעבוד על מכשירי אנדרואיד מוסמכים לאחר זמן זה. + פרטים פתרון NewPipe מורידה את התמיכה באנדרואיד 5 diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index ce9fa70c5..c7e39f96a 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -803,7 +803,7 @@ पले करते समय सर्वर से HTTP error 403 मिला, जो शायद IP बैन या स्ट्रीमिंग URL डीओबफस्केशन की दिक्कतों की वजह से हुआ है %1$s ने डेटा देने से मना कर दिया, और यह कन्फर्म करने के लिए लॉगिन मांगा कि रिक्वेस्ट करने वाला बोट नहीं है।\n\nहो सकता है कि %1$s ने आपके IP को कुछ समय के लिए बैन कर दिया हो, आप कुछ समय इंतज़ार कर सकते हैं या किसी दूसरे IP पर स्विच कर सकते हैं (जैसे VPN ऑन/ऑफ करके, या WiFi से मोबाइल डेटा पर स्विच करके)।\n\nअधिक जानकारी के लिए कृपया यह FAQ एंट्री देखें। यह कंटेंट अभी चुने गए देश के कंटेंट के लिए उपलब्ध नहीं है।\n\n\"सेटिंग्स > कंटेंट > डिफ़ॉल्ट कंटेंट देश\" से अपना चुनाव बदलें। - अगस्त 2025 में, Google ने घोषणा की कि सितंबर 2026 से, सर्टिफाइड डिवाइस पर सभी Android ऐप्स जिनमें Play Store के बाहर से इंस्टॉल किए गए ऐप्स भी शामिल हैं, को इंस्टॉल करने के लिए डेवलपर वेरिफिकेशन ज़रूरी होगा। चूंकि NewPipe के डेवलपर्स इस शर्त से सहमत नहीं हैं, इसलिए उस समय के बाद NewPipe सर्टिफाइड Android डिवाइस पर काम नहीं करेगा। + विवरण समाधान diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index db204fb1a..4bb6c9b29 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -803,7 +803,7 @@ HTTP 403-as hiba érkezett a kiszolgálótól a lejátszás közben, valószínűleg IP-tiltás vagy a közvetítési hivatkozás feloldási problémák miatt %1$s visszautasította az adatok szolgáltatását, és bejelentkezést kér annak megerősítésére, hogy a kérés nem robot által érkezik.\n\nElőfordulhat, hogy az IP-címét ideiglenesen letiltotta %1$s, várhat egy keveset, vagy váltson egy másik IP-címre (például VPN be-/kikapcsolásával, vagy Wi-Fi-ről mobiladat-forgalomra váltva).\n\nTovábbi információért tekintse meg ezt a GYIK-bejegyzést. Ez a tartalom a jelenleg kiválasztott tartalom országában nem elérhető.\n\nVáltoztassa meg a „Beállítások > Tartalom >Tartalom alapértelmezett országa” menüpontban. - 2025 augusztusában a Google bejelentette, hogy 2026 szeptemberétől az alkalmazások telepítéséhez fejlesztői ellenőrzésre lesz szükség a tanúsított eszközökön található összes Android-alkalmazáshoz, beleértve a Play Áruházon kívül telepített alkalmazásokat is. Mivel a NewPipe fejlesztői nem értenek egyet ezzel a követelménnyel, a NewPipe ezután nem fog működni a tanúsított Android-eszközökön. + Részletek Megoldás diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 3a339fefd..db253131b 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -789,7 +789,7 @@ %sK %sM %sB - Pada Agustus 2025, Google mengumumkan bahwa mulai September 2026, pemasangan aplikasi akan memerlukan verifikasi pengembang untuk semua aplikasi Android pada perangkat bersertifikasi, termasuk yang dipasang di luar Play Store. Karena pengembang NewPipe tidak menyetujui persyaratan ini, NewPipe tidak akan lagi berfungsi pada perangkat Android bersertifikasi setelah waktu tersebut. + Rincian Solusi diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 9a622d094..c895436ec 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -817,7 +817,7 @@ Errore HTTP 403 ricevuto dal server durante la riproduzione, probabilmente causato da un divieto dell\'IP o problemi di de-offuscamento dell\'URL in streaming %1$s ha rifiutato di fornire i dati, chiedendo un accesso per confermare che il richiedente non sia un bot.\n\nIl tuo IP potrebbe essere stato temporaneamente vietato da %1$s, puoi aspettare un po\' di tempo o passare ad un IP diverso (ad esempio accendendo/spegnendo una VPN, o passando dal WiFi ai dati mobili).\n\nLeggi questa voce nelle FAQ per maggiori informazioni. Questo contenuto non è disponibile per il Paese dei contenuti attualmente selezionato.\n\nModifica la selezione da \"Impostazioni > Contenuti > Paese dei contenuti predefinito\". - Ad agosto 2025, Google ha annunciato che a partire da settembre 2026, l\'installazione di app richiederà la verifica dello sviluppatore per tutte le app Android su dispositivi certificati, compresi quelli installati al di fuori del Play Store. Poiché gli sviluppatori di NewPipe non sono d\'accordo con questo requisito, NewPipe non funzionerà più su dispositivi Android certificati dopo quel mese. + Dettagli Soluzione diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index e87d7bf1e..2cde02d37 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -760,7 +760,7 @@ インポートされているエクスポートの設定は、NewPipe 0.27.0以降は非推奨であった脆弱な形式を使用します。 インポートされているエクスポートは信頼できる情報源からであり、将来的にはNewPipe 0.27.0かこれより新しいバージョンから得られるエクスポートのみを優先して使用します。 この脆弱な形式で設定をインポートするための対応はすぐに完全に削除され、新しいバージョンからエクスポートの設定をインポートすることは出来ません。 YouTubeの一時的なプレイリストとして共有 二次的 - 2025年8月、Googleは、2026年9月以降、Playストア以外からインストールするアプリを含め、認定済み端末上のすべてのAndroidアプリのインストールに開発者の確認が必要になると発表しました。NewPipeの開発者はこの要件に同意していないため、それ以降、NewPipeは認定済みAndroid端末で動作しなくなります。 + 詳細 解決 %sB diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 227843680..1fba37c10 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -789,7 +789,7 @@ 재생 중 서버에서 HTTP 403 오류를 수신했으며, 스트리밍 URL 역난독화 문제나 IP 차단 때문일 수 있습니다 %1$s에서 데이터 제공을 거부하고, 요청자가 봇이 아닌지 확인하기 위해 로그인을 요청하고 있습니다.\n\n아마 IP가 %1$s에서 임시 차단되었을 것이며, 잠시 기다리거나 다른 IP로 전환할 수 있습니다 (예를 들어 VPN을 켜/끄거나, WiFi를 모바일 데이터로 바꿔 보세요).\n\n자세한 정보는 여기 FAQ를 확인하세요. 이 콘텐츠는 현재 선택한 콘텐츠 지역에서 이용할 수 없습니다.\n\n\"설정 > 콘텐츠 > 기본 콘텐츠 국가\"에서 지역을 바꾸세요. - 2025년 8월, Google은 2026년 9월부터 인증된 기기에 앱을 설치하려면 Play 스토어 외 앱을 포함한 모든 Android 앱에 대해 개발자 인증을 받아야 한다고 발표했습니다. NewPipe 개발자는 이 요구 사항에 동의하지 않으므로, 이 이후 NewPipe는 더 이상 인증된 Android 기기에서 동작하지 않을 것입니다. + 자세히 해결책 diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 5ee03164c..f31d1a2c2 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -813,7 +813,7 @@ Atskaņošanas laikā no servera saņemta HTTP 403 kļūda, ko, iespējams, izraisīja straumēšanas URL derīguma beigu termiņš vai IP aizliegums Atskaņošanas laikā no servera saņemta HTTP %1$s kļūda Atskaņošanas laikā no servera saņemta HTTP 403 kļūda, ko, iespējams, izraisīja IP aizliegums vai straumēšanas URL atšifrēšanas (deobfuskācijas) problēmas - 2025. gada augustā Google paziņoja, ka, sākot ar 2026. gada septembri, lai uzstādītu lietotnes, būs nepieciešama izstrādātāja verifikācija visām Android lietotnēm sertificētajās ierīcēs, tostarp arī tām, kuras uzstādītas ārpus Play veikala. Tā kā NewPipe izstrādātāji nepiekrīt un negrib pieņemt šo prasību, pēc šī datuma NewPipe vairs nedarbosies sertificētajās Android ierīcēs. + Detalizētāka informācija Risinājums SoundCloud likvidēja oriģinālos Top 50 topus. Atbilstošā cilne noņemta no jūsu galvenās lapas. diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index f23a9c90f..5f67276a7 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -822,7 +822,7 @@ Importeer abonnementen vanuit een eerder geëxporteerd .json-bestand Exporteer uw abonnementen naar een .json-bestand - In augustus 2025 kondigde Google aan dat vanaf september 2026 voor het installeren van apps op gecertificeerde Android-apparaten, inclusief apps die buiten de Play Store zijn geïnstalleerd, een ontwikkelaars­verificatie vereist is. Omdat de ontwikkelaars van NewPipe het niet eens zijn met deze vereiste, zal NewPipe na die datum niet meer werken op gecertificeerde Android-apparaten. + NewPipe stopt met ondersteuning voor Android 5 NewPipe is afhankelijk van een aantal bibliotheken die geen ondersteuning meer bieden voor Android 5.0 en 5.1. De volgende versie van NewPipe zal daarom alleen werken op apparaten met Android 6 of hoger. Lees meer in het blogbericht. Blogbericht diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index d1ab67b10..86f2e068a 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -803,7 +803,7 @@ ਪਲੇਅ ਕਰਦੇ ਸਮੇਂ ਸਰਵਰ ਤੋਂ HTTP error 403 ਪ੍ਰਾਪਤ ਹੋਇਆ, ਜੋ ਸ਼ਾਇਦ IP ਬੈਨ ਜਾਂ ਸਟ੍ਰੀਮਿੰਗ URL ਡੀਔਬਫਸਕੇਸ਼ਨ ਸਮੱਸਿਆਵਾਂ ਕਾਰਨ ਹੋਈ ਹੈ %1$s ਨੇ ਡੇਟਾ ਪ੍ਰਦਾਨ ਕਰਨ ਤੋਂ ਇਨਕਾਰ ਕਰ ਦਿੱਤਾ, ਅਤੇ ਇਹ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਲੌਗਇਨ ਕਰਨ ਲਈ ਕਿਹਾ ਕਿ ਬੇਨਤੀਕਰਤਾ ਬੋਟ ਨਹੀਂ ਹੈ।\n\nਹੋ ਸਕਦਾ ਹੈ ਕਿ %1$s ਨੇ ਤੁਹਾਡੇ IP ਨੂੰ ਅਸਥਾਈ ਤੌਰ \'ਤੇ ਪਾਬੰਦੀ ਲਗਾਈ ਹੋਵੇ, ਤੁਸੀਂ ਕੁਝ ਸਮਾਂ ਉਡੀਕ ਕਰ ਸਕਦੇ ਹੋ ਜਾਂ ਕਿਸੇ ਵੱਖਰੇ IP \'ਤੇ ਸਵਿੱਚ ਕਰ ਸਕਦੇ ਹੋ (ਉਦਾਹਰਣ ਵਜੋਂ VPN ਨੂੰ ਚਾਲੂ/ਬੰਦ ਕਰਕੇ, ਜਾਂ WiFi ਤੋਂ ਮੋਬਾਈਲ ਡੇਟਾ \'ਤੇ ਸਵਿੱਚ ਕਰਕੇ)।\n\nਹੋਰ ਜਾਣਕਾਰੀ ਲਈ ਕਿਰਪਾ ਕਰਕੇ ਇਹ FAQ ਐਂਟਰੀ ਵੇਖੋ। ਇਹ ਸਮੱਗਰੀ ਵਰਤਮਾਨ ਵਿੱਚ ਚੁਣੇ ਗਏ ਦੇਸ਼ ਦੀ ਸਮੱਗਰੀ ਲਈ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ।\n\n\"ਸੈਟਿੰਗਾਂ > ਸਮੱਗਰੀ > ਡਿਫ਼ਾਲਟ ਸਮੱਗਰੀ ਦੇਸ਼\" ਤੋਂ ਆਪਣੀ ਚੋਣ ਬਦਲੋ। - ਅਗਸਤ 2025 ਵਿੱਚ, ਗੂਗਲ ਨੇ ਐਲਾਨ ਕੀਤਾ ਕਿ ਸਤੰਬਰ 2026 ਤੋਂ, ਐਪਸ ਨੂੰ ਸਥਾਪਿਤ ਕਰਨ ਲਈ ਪ੍ਰਮਾਣਿਤ ਡਿਵਾਈਸਾਂ \'ਤੇ ਸਾਰੇ ਐਂਡਰਾਇਡ ਐਪਸ ਲਈ ਡਿਵੈਲਪਰ ਤਸਦੀਕ ਦੀ ਲੋੜ ਹੋਵੇਗੀ, ਜਿਸ ਵਿੱਚ ਪਲੇ ਸਟੋਰ ਤੋਂ ਬਾਹਰ ਸਥਾਪਤ ਕੀਤੇ ਐਪਸ ਵੀ ਸ਼ਾਮਲ ਹਨ। ਕਿਉਂਕਿ ਨਿਊਪਾਈਪ ਦੇ ਡਿਵੈਲਪਰ ਇਸ ਲੋੜ ਨਾਲ ਸਹਿਮਤ ਨਹੀਂ ਹਨ, ਇਸ ਲਈ ਨਿਊਪਾਈਪ ਉਸ ਸਮੇਂ ਤੋਂ ਬਾਅਦ ਪ੍ਰਮਾਣਿਤ ਐਂਡਰਾਇਡ ਡਿਵਾਈਸਾਂ \'ਤੇ ਕੰਮ ਨਹੀਂ ਕਰੇਗੀ। + ਵੇਰਵੇ ਹੱਲ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 0f3d4be14..cbc21f3eb 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -831,7 +831,7 @@ Podczas odtwarzania otrzymano od serwera błąd HTTP 403, prawdopodobnie spowodowany blokadą adresu IP lub problemami z odszyfrowaniem adresu URL strumienia. %1$s odmówił dostarczenia danych, prosząc o zalogowanie się w celu potwierdzenia, że nie jest się botem.\n\nTwoje IP mogło zostać tymczasowo zablokowane przez %1$s. Możesz chwilę poczekać lub zmienić adres IP (na przykład włączając/wyłączając VPN lub przełączając się z sieci Wi-Fi na dane komórkowe).\n\nZobacz ten wpis w FAQ, aby uzyskać więcej informacji. Ta treść nie jest dostępna dla aktualnie wybranego kraju treści.\n\nZmień swój wybór w „Ustawienia > Zawartość > Domyślny kraj treści”. - W sierpniu 2025 r. Google ogłosił, że od września 2026 r. instalowanie aplikacji będzie wymagać weryfikacji ich twórców w przypadku wszystkich aplikacji na Androida na certyfikowanych urządzeniach, w tym tych zainstalowanych poza sklepem Google Play. Ponieważ programiści NewPipe nie zgadzają się z tym wymogiem, NewPipie nie będzie już działać na certyfikowanych urządzeniach z Androidem po tym czasie. + Szczegóły Rozwiązanie diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 3b6849845..eb45d822c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -817,7 +817,7 @@ Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um banimento de IP ou problemas de desofuscação de URL de streaming %1$s se recusou a fornecer dados, solicitando um login para confirmar que o solicitante não é um bot.\n\nSeu IP pode ter sido temporariamente banido por %1$s. Você pode esperar um pouco ou mudar para um IP diferente (por exemplo, ativando/desativando uma VPN ou alternando de Wi-Fi para dados móveis).\n\nConfira este artigo do FAQ para mais informações. Este conteúdo não está disponível para o país selecionado atualmente.\n\nAltere sua seleção acessando “Configurações > Conteúdo > País padrão do conteúdo”. - Em agosto de 2025, o Google anunciou que, a partir de setembro de 2026, a instalação de aplicativos exigirá a verificação do desenvolvedor para todos os aplicativos Android em dispositivos certificados, incluindo aqueles instalados fora da Play Store. Como os desenvolvedores do NewPipe não concordam com esse requisito, o NewPipe não funcionará mais em dispositivos Android certificados após essa data. + Detalhes Solução diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index 2de7d31b1..fbdd7d834 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -817,7 +817,7 @@ Este conteúdo não está disponível para o país de conteúdo atualmente selecionado.\n\nAltere a sua seleção de \"Configurações > Conteúdo > País predefinido de conteúdo\". Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado pela URL de streaming expirado ou IP banido Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um bloqueio de IP ou problemas de desofuscação da URL de streaming - Em agosto de 2025, o Google anunciou que, a partir de setembro de 2026, a instalação de apps exigirá a verificação do programador para todas as apps Android em dispositivos certificados, incluindo aqueles instalados fora da Play Store. Como os programadores do NewPipe não concordam com este requisito, o NewPipe já não funcionará em dispositivos Android certificados após essa data. + Pormenores Solução diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index e8d1e2922..21fc2ce15 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -817,7 +817,7 @@ Este conteúdo não está disponível para o país de conteúdo atualmente selecionado.\n\nAltere a sua seleção de \"Configurações > Conteúdo > País predefinido de conteúdo\". Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado pela URL de streaming expirado ou IP banido Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um bloqueio de IP ou problemas de desofuscação da URL de streaming - Em agosto de 2025, o Google anunciou que, a partir de setembro de 2026, a instalação de apps exigirá a verificação do programador para todas as apps Android em dispositivos certificados, incluindo aqueles instalados fora da Play Store. Como os programadores do NewPipe não concordam com este requisito, o NewPipe já não funcionará em dispositivos Android certificados após essa data. + Detalhes Solução diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 846bfac25..3b1184d99 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -801,7 +801,7 @@ %smii %s mil. %s mld. - În august 2025, Google a anunțat că, începând din septembrie 2026, instalarea aplicațiilor va necesita verificarea dezvoltatorului pentru toate aplicațiile Android de pe dispozitivele certificate, inclusiv pentru cele instalate din afara Play Store. Deoarece dezvoltatorii NewPipe nu sunt de acord cu această cerință, NewPipe nu va mai funcționa pe dispozitivele Android certificate după acea dată. + Soluție Detalii Acest conținut nu este disponibil pentru țara de conținut selectată în prezent.\n\nModificați selecția din „Setări > Conținut > Țara implicită pentru conținut”. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index fd5df953a..bb059a3ff 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -831,7 +831,7 @@ Во время воспроизведения получена ошибка HTTP 403 от сервера, вероятно, вызванная блокировкой IP-адреса или проблемами деобфускации URL-адреса потоковой передачи %1$s отказался предоставить данные, запросив вход в аккаунт для подтверждения, что запрашивающий не является ботом.\n\nВозможно, ваш IP-адрес временно заблокирован %1$s, вы можете подождать некоторое время или переключиться на другой IP-адрес (например, включив/выключив VPN или переключившись с Wi-Fi на мобильный интернет).\n\nПожалуйста посмотрите этот пункт FAQ для получения дополнительной информации. Этот контент недоступен для выбранной страны контента.\n\nИзмените свой выбор в разделе «Настройки > Контент > Страна контента по умолчанию». - В августе 2025 года, Google анонсировала, что с сентября 2026 года, установка приложений потребует верификации разработчика для всех Android приложений на сертифицированных устройствах, включая те, которые были установлены не через Play Store. Поскольку разработчики NewPipe не согласны с этим требованием, NewPipe перестанет работать на сертифицированных Android устройствах после этой даты. + Подробнее Решение diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index d527022bf..d03daa04b 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -831,7 +831,7 @@ Chyba HTTP 403 prijatá zo servera počas prehrávania, pravdepodobne spôsobená zákazom IP adresy alebo problémami s deobfuskáciou streamingovej URL adresy %1$s odmietol poskytnúť údaje, žiada o prihlásenie na potvrdenie, že žiadateľ nie je bot.\n\nVaša IP adresa mohla byť dočasne zakázaná %1$s, môžete nejaký čas počkať alebo prejsť na inú IP adresu (napríklad zapnutím/vypnutím VPN alebo prepnutím z WiFi na mobilné dáta).\n\nPozrite si túto časť FAQ pre viac informácií. Tento obsah nie je dostupný pre aktuálne zvolenú krajinu obsahu.\n\nZmeňte výber v ponuke \"Nastavenia > Obsah > Predvolená krajina obsahu\". - V auguste 2025 spoločnosť Google oznámila, že od septembra 2026 bude inštalácia aplikácií vyžadovať overenie vývojára pre všetky aplikácie Android na certifikovaných zariadeniach, vrátane tých, ktoré sú inštalované mimo obchodu Play Store. Keďže vývojári NewPipe s touto požiadavkou nesúhlasia, NewPipe po tomto termíne nebude na certifikovaných zariadeniach Android fungovať. + Podrobnosti Riešenie diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index a69774ea5..76f4cd60d 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -803,7 +803,7 @@ Servern svarade med HTTP-fel 403 under uppspelningen, troligen på grund av en IP-blockering eller problem med avobfuskering av strömmarnas webbadresser %1$s vägrade att lämna ut uppgifter och krävde inloggning för att bekräfta att begäran inte kommer från en robot.\n\nDin IP-adress kan ha blockerats tillfälligt av %1$s. Vänta en stund eller byt IP-adress, till exempel genom att slå av och på en VPN-anslutning eller växla mellan Wi-Fi och mobildata.\n\nLäs avsnittet i vanliga frågor för mer information. Innehållet är inte tillgängligt i det valda innehållslandet.\n\nÄndra valet under ”Inställningar > Innehåll > Standardinnehållsland”. - I augusti 2025 meddelade Google att från och med september 2026 kommer installation av appar att kräva utvecklarverifiering för alla Android-appar på certifierade enheter, inklusive de som installerats utanför Play Store. Eftersom utvecklarna av NewPipe inte godkänner detta krav kommer NewPipe inte längre att fungera på certifierade Android-enheter efter den tiden. + Detaljer Lösning diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index d2719b864..4deb26d91 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -803,7 +803,7 @@ Oynatırken sunucudan HTTP 403 hatası alındı, IP engeli ya da akış URL’si çözme sorunları olabilir %1$s veri sağlamıyor, istekçinin robot olmadığını doğrulaması için oturum açmasını istiyor.\n\n%1$s, IP adresinizi geçici olarak engellemiş olabilir, bir süre bekleyebilir ya da başka IP\'ye geçebilirsiniz (örneğin VPN\'i açıp/kapatarak ya da WiFi\'den mobil veriye geçerek).\n\nDaha çok bilgi için bu SSS girdisine bakın. Bu içerik şu anda seçili içerik ülkesinde kullanılamıyor.\n\nSeçiminizi \"Ayarlar > İçerik > Öntanımlı içerik ülkesi\"nden değiştirin. - Google, Eylül 2026\'dan sonra sertifikalı Android aygıtlarda Play Store dışından kurulmuşlarla birlikte tüm uygulamaların, geliştiricilerin kişisel kimlik bilgilerini doğrudan Google’a göndermesini gerektireceğini duyurdu. NewPipe geliştiricileri bu zorunluluğu kabul etmediğinden, NewPipe bu tarihten sonra sertifikalı Android aygıtlarda çalışmayacaktır. + Ayrıntılar Çözüm diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 1d26073c1..e4af9bdb0 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -831,7 +831,7 @@ Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через заборону IP-адреси або проблеми з деобфускацією URL-адреси потокової передачі %1$s відмовляється надати дані та запитує пароль для підтвердження, що запитувач не бот.\n\n%1$s міг тимчасово заблокувати вашу IP-адресу. Ви можете почекати деякий час або перейти на іншу IP-адресу (наприклад, увімкнувши/вимкнувши VPN або перемкнувшись з Wi-Fi на мобільні дані).\n\nЩоб дізнатися докладніше, перегляньте цю довідку. Ці матеріали недоступні для вибраної країни матеріалів.\n\nЗмініть свій вибір у розділі \"Налаштування > Матеріали > Типова країна матеріалів\". - У серпні 2025 року, Google анонсувала, що з вересня 2026 року, для встановлення застосунків буде потрібна верифікація розробника для всіх Android застосунків на сертифікованих пристроях, включаючи ті, що були встановлені не через Play Store. Оскільки розробники NewPipe не згодні з цією вимогою, NewPipe перестане працювати на сертифікованих Android пристроях після цієї дати. + Детальніше Вирішення diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 1b7f633c6..483a7570b 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -785,7 +785,7 @@ Tài khoản bị vô hiệu hóa. \n\n%1$s cung cấp lý do này: %2$s Entry đã xóa Đã xảy ra lỗi HTTP %1$s trong khi phát - Từ tháng 8 năm 2025, Google đã thông báo rằng kể từ tháng 9 năm 2026, việc cài app sẽ yêu cầu các nhà phát triển phải xác minh trên những thiết bị đã chứng nhận, kể cả đối với các ứng dụng ngoài Play Store. Vì các nhà phát triển của NewPipe không đồng ý với điều kiện này, nên có lẽ NewPipe sẽ không còn hoạt động trên các máy Android được chứng nhận sau thời điểm ấy. + Chi tiết Giải pháp NewPipe sẽ ngừng hỗ trợ phiên bản Android 5.x vào bản cập nhật sau diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index afd113e11..aa5030709 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -789,7 +789,7 @@ 播放时从服务器收到 HTTP 403 错误,可能因 IP 封锁或串流 URL 解密问题导致 %1$s 拒绝提供数据, 要求登录确认请求方不是机器人。\n\n你的 IP 可能已经暂时被 %1$s 封禁,你可以等待一段时间或切换到不同 IP (比如开/关 VPN, 或者从 WiFi 连接切换到移动数据)。\n\n请见 此 FAQ条目 获取更多信息。 此内容对当前选中的内容地区不可用。\n\n要更改选择,请前往 “设置 > 内容 > 默认内容地区”。 - 2025 年 8 月,Google 宣布自 2026 年 9 月起,在已认证设备上安装所有安卓应用都需要开发者验证身份,包括在 Play 商店之外安装的应用。由于 NewPipe 开发者反对此要求,NewPipe 在此时间点后不会再在已认证设备上工作。 + 详情 解决方案 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 2a2beed9c..5db7bbda6 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -789,7 +789,7 @@ 播放時收到來自伺服器的 HTTP 錯誤 403,可能因 IP 封鎖或串流網址去混淆化問題所致 %1$s 拒絕提供資料,要求登入以確認請求者並非機器人。\n\n您的 IP 位址可能已被 %1$s 暫時封鎖,您可稍候片刻或切換至其他 IP 位址(例如開啟/關閉 VPN,或從 Wi-Fi 切換至行動數據)。\n\n更多資訊請參見此 FAQ 條目。 此內容目前無法於您所選的國家/地區提供。\n\n請至「設定」→「內容」→「預設內容國家」變更您的選擇。 - 2025年8月,Google 宣佈自2026年9月起,所有經認證裝置上的 Android 應用程式(包含不是透過 Play 商店安裝的應用程式)皆須通過開發者驗證方可安裝。由於 NewPipe 開發團隊不接受此項要求,該應用程式屆時將無法在經認證的 Android 裝置上運作。 + 詳細資訊 解決方案 From b541f120fb069845030cea23c3b6c2b3a81b72ce Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sun, 25 Oct 2026 12:11:51 +0100 Subject: [PATCH 145/155] (chore): Add migration to reset kao_last_checked_key in order to display latest KAO updates immediately. --- .../settings/migration/SettingMigrations.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java b/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java index 7350afb40..88176f2a2 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java +++ b/app/src/main/java/org/schabi/newpipe/settings/migration/SettingMigrations.java @@ -240,6 +240,20 @@ public final class SettingMigrations { } }; + private static final Migration MIGRATION_9_10 = new Migration(9, 10) { + @Override + protected void migrate(@NonNull final Context context) { + // New Updates on KAO campaign should be displayed right away + final var lastCheckKey = context.getString(R.string.kao_last_checked_key); + final Long lastCheckedEpochMillis = sp.getLong(lastCheckKey, 0L); + if (lastCheckedEpochMillis != 0) { + sp.edit() + .putLong(lastCheckKey, 0L) + .apply(); + } + } + }; + /** * List of all implemented migrations. *

    @@ -256,12 +270,13 @@ public final class SettingMigrations { MIGRATION_6_7, MIGRATION_7_8, MIGRATION_8_9, + MIGRATION_9_10 }; /** * Version number for preferences. Must be incremented every time a migration is necessary. */ - private static final int VERSION = 9; + private static final int VERSION = 10; static void runMigrationsIfNeeded(@NonNull final Context context) { From e73ff20f59b54705b4aa61528ae8eb2a2237fe34 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 20 Aug 2026 23:20:26 +0200 Subject: [PATCH 146/155] Add changelog for NewPipe 0.29.2 (1016) --- fastlane/metadata/android/en-US/changelogs/1016.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/1016.txt diff --git a/fastlane/metadata/android/en-US/changelogs/1016.txt b/fastlane/metadata/android/en-US/changelogs/1016.txt new file mode 100644 index 000000000..75dfff429 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/1016.txt @@ -0,0 +1,9 @@ +Display chapters on the video player's seek bar +[YouTube] Add support for the "Podcasts" and "Courses" tabs +Improve the appearance of search menu titles +Show full subtitle names when provided by the service +Various player fixes, including audio ducking, black screens, and opening links with timestamps +[YouTube] Minor fixes and housekeeping +Many internal improvements and bug fixes + +Thanks to this year's ANU software engineering students who contributed to NewPipe as part of their OSS assignment! \ No newline at end of file From eeb49b8d370606bbb1497fa8b7c31612df28a3e8 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 3 Nov 2026 08:21:44 +0100 Subject: [PATCH 147/155] chore: Update extractor to the latest version --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bd4d44e8d..c5fe3aeea 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -75,7 +75,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "e8f89145a830b4d6cae32412007f24ea8b36c73a" +teamnewpipe-newpipe-extractor = "6cb36e982311dc1c529997bc329013afe75f37d1" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" # New versions require minSdk 24 From f42fe70d6da68cc587d3f1bbe5304b815a16ab96 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Tue, 3 Nov 2026 11:25:45 +0100 Subject: [PATCH 148/155] chore: Update dependencies --- gradle/libs.versions.toml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c5fe3aeea..bff280568 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ about-libraries = "15.3.0" acra = "5.14.2" activity = "1.13.0" -agp = "9.4.1" +agp = "9.5.0" appcompat = "1.8.0" assertj = "3.27.7" autoservice-google = "1.1.1" @@ -27,7 +27,7 @@ espresso = "3.7.0" exoplayer = "2.19.1" fragment = "1.9.1" groupie = "2.10.1" -jsoup = "1.23.2" +jsoup = "1.24.1" junit = "4.13.2" junit-ext = "1.3.0" kermit = "2.2.0" @@ -45,11 +45,11 @@ localbroadcastmanager = "1.1.0" markwon = "4.6.2" material = "1.11.0" # TODO: update to newer version after bug is fixed. See https://github.com/TeamNewPipe/NewPipe/pull/13018 material3 = "1.11.0-alpha07" -media = "1.7.1" +media = "1.7.1" # Keep at 1.7.1 for compatibility with exoplayer mockitoCore = "5.24.0" multiplatform = "1.12.2" -navigation3 = "1.1.2" -okhttp = "5.5.0" +navigation3 = "1.1.2" # New versions require minSdk 24 +okhttp = "5.5.1" phoenix = "3.0.0" preference = "1.2.1" prettytime = "5.0.8.Final" From fa2061b82c4facad036e078e5d62655bc3da55e3 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Thu, 5 Nov 2026 12:40:16 +0100 Subject: [PATCH 149/155] Fix(Queue): Fix author marquee resetting every second when the artist name is too long Calculate the max width for the queue time to prevent resetting the artist marquee's scrolling position when the artist name is longer than the space available. Without a fixed width the scrolling position is reset every second when updating the text and thus the width of queueTotalDuration. --- .../newpipe/player/PlayQueueActivity.java | 42 ++++++++++++++++--- .../layout/activity_player_queue_control.xml | 1 + 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index 6b5017b5a..3f6e4f0be 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -17,6 +17,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.SeekBar; +import android.widget.TextView; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; @@ -67,6 +68,13 @@ public final class PlayQueueActivity extends AppCompatActivity private boolean seeking; + /** + * The calculated max width for {@code R.id.queue_total_duration} + * used to set a fixed width for the TextView to prevent {@code R.id.artist_name} + * from resetting to left when updating the duration text. + */ + private int queueDurationWidth; + //////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////// @@ -390,13 +398,37 @@ public final class PlayQueueActivity extends AppCompatActivity .sum(); final long queueProgress = before + currentProgress / 1000L; + final String totalDuration = Localization.getDurationString(total); - queueControlBinding.queueTotalDuration.setText( - Localization.getDurationString(queueProgress) + " / " - + Localization.getDurationString(total) + // Calculate the max width for the queue time to prevent resetting the artist marquee's + // scrolling position when the artist name is longer than the space available. + // Without a fixed width the scrolling position is reset every second when updating + // the text and thus the width of queueTotalDuration. + + // Use the widest digit for the progress part while preserving its duration format. + final StringBuilder widestProgressDuration = new StringBuilder(totalDuration.length()); + for (int i = 0; i < totalDuration.length(); i++) { + final char character = totalDuration.charAt(i); + widestProgressDuration.append(Character.isDigit(character) ? '8' : character); + } + + final TextView queueDuration = queueControlBinding.queueTotalDuration; + final float progressWidth = queueDuration.getPaint() + .measureText(widestProgressDuration.toString()); + final float totalWidth = queueDuration.getPaint().measureText(totalDuration); + final float separatorWidth = queueDuration.getPaint().measureText(" / "); + + final int durationWidth = Math.round(progressWidth + separatorWidth + totalWidth); + + if (queueDurationWidth != durationWidth) { + queueDuration.setWidth(durationWidth); + queueDurationWidth = durationWidth; + } + + queueDuration.setText( + Localization.getDurationString(queueProgress) + " / " + totalDuration ); - - queueControlBinding.queueTotalDuration.setVisibility(View.VISIBLE); + queueDuration.setVisibility(View.VISIBLE); } //////////////////////////////////////////////////////////////////////////// diff --git a/app/src/main/res/layout/activity_player_queue_control.xml b/app/src/main/res/layout/activity_player_queue_control.xml index 6f97baca3..afdf03cef 100644 --- a/app/src/main/res/layout/activity_player_queue_control.xml +++ b/app/src/main/res/layout/activity_player_queue_control.xml @@ -112,6 +112,7 @@ android:textSize="12sp" android:singleLine="true" android:visibility="gone" + android:gravity="end" tools:text="16:20 / 48:30" tools:visibility="visible" /> From ce3c9b98ccb9e4521471f3de70758d8d11b4dfcb Mon Sep 17 00:00:00 2001 From: Steven Felix Date: Fri, 6 Nov 2026 18:03:54 +0700 Subject: [PATCH 150/155] README.md file changes (#13967) * Create an README.md file to be linked with an README.md symlink file in root * Attempt 1 to use README.md file in root as symlink file to README.md file inside doc folder * Use GitHub codespaces to create an README.md symlink file in root to README.md file inside doc folder * Attempt to use root relative image path links for README.md file so the images will be rendered properly on both symlink README.md file in root and the README.md file inside doc folder * Use root relative image path links for README.md files in other languages so the images will be rendered properly on each README.md files * Attempt to use root relative hyperlinks for README.md file so when the user clicks on the language hyperlinks (on both symlink README.md file in root and the README.md file inside doc folder) it will be redirected to the correct page (no more 404 status code) * Use root relative hyperlinks for README.md files in other languages so when the user clicks on the language hyperlinks (on each README.md files) it will be redirected to the correct page (no more 404 status code) --- README.md | 152 +------------------------------------------- doc/README.ar.md | 32 +++++----- doc/README.asm.md | 30 ++++----- doc/README.de.md | 30 ++++----- doc/README.es.md | 32 +++++----- doc/README.fr.md | 30 ++++----- doc/README.hi.md | 30 ++++----- doc/README.it.md | 30 ++++----- doc/README.ja.md | 32 +++++----- doc/README.ko.md | 32 +++++----- doc/README.md | 151 +++++++++++++++++++++++++++++++++++++++++++ doc/README.pa.md | 30 ++++----- doc/README.pl.md | 32 +++++----- doc/README.pt_BR.md | 30 ++++----- doc/README.ro.md | 32 +++++----- doc/README.ru.md | 30 ++++----- doc/README.ryu.md | 32 +++++----- doc/README.so.md | 32 +++++----- doc/README.sr.md | 30 ++++----- doc/README.tr.md | 32 +++++----- doc/README.zh_TW.md | 32 +++++----- 21 files changed, 447 insertions(+), 446 deletions(-) mode change 100644 => 120000 README.md create mode 100644 doc/README.md diff --git a/README.md b/README.md deleted file mode 100644 index 28a429ecb..000000000 --- a/README.md +++ /dev/null @@ -1,151 +0,0 @@ -

    -

    NewPipe

    -

    A libre lightweight streaming front-end for Android.

    - -

    Get it on F-Droid

    - -

    - - - - - -

    - -

    - - -

    - -
    -

    Screenshots • Supported Services • Description • Features • Installation and updates • Contribution • Donate • License

    -

    Website • Blog • FAQ • Press

    -
    - -*Read this document in other languages: [Deutsch](doc/README.de.md), [English](README.md), [Español](doc/README.es.md), [Français](doc/README.fr.md), [हिन्दी](doc/README.hi.md), [Italiano](doc/README.it.md), [한국어](doc/README.ko.md), [Português Brasil](doc/README.pt_BR.md), [Polski](doc/README.pl.md), [ਪੰਜਾਬੀ ](doc/README.pa.md), [日本語](doc/README.ja.md), [Română](doc/README.ro.md), [Soomaali](doc/README.so.md), [Türkçe](doc/README.tr.md), [正體中文](doc/README.zh_TW.md), [অসমীয়া](doc/README.asm.md), [Српски](doc/README.sr.md), [العربية](README.ar.md)* - -> [!warning] -> THIS APP IS IN BETA, SO YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE IN OUR GITHUB REPOSITORY BY FILLING OUT THE ISSUE TEMPLATE. -> -> PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS. -> -> "NewPipe" IS A REGISTERED WORD MARK SUBJECT TO [ITS TRADEMARK POLICY](https://newpipe-ev.de/policy/trademark/). INFRINGING APPLICATIONS WILL NOT BE TOLERATED. - -## Screenshots - -[](fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) -

    -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) - -### Supported Services - -NewPipe currently supports these services: - - -* YouTube ([website](https://www.youtube.com/)) and YouTube Music ([website](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube)) -* PeerTube ([website](https://joinpeertube.org/)) and all its instances (open the website to know what that means!) ([wiki](https://en.wikipedia.org/wiki/PeerTube)) -* Bandcamp ([website](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp)) -* SoundCloud ([website](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud)) -* media.ccc.de ([website](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) - -As you can see, NewPipe supports multiple video and audio services. Though it started off with YouTube, other people have added more services over the years, making NewPipe more and more versatile! - -Partially due to circumstance, and partially due to its popularity, YouTube is the best supported out of these services. If you use or are familiar with any of these other services, please help us improve support for them! We're looking for maintainers for SoundCloud and PeerTube. - -If you intend to add a new service, please get in touch with us first! Our [docs](https://teamnewpipe.github.io/documentation/) provide more information on how a new service can be added to the app and to the [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). - -## Description - -NewPipe works by fetching the required data from the official API (e.g. PeerTube) of the service you're using. If the official API is restricted (e.g. YouTube) for our purposes, or is proprietary, the app parses the website or uses an internal API instead. This means that you don't need an account on any service to use NewPipe. - -Also, since they are free and open source software, neither the app nor the Extractor use any proprietary libraries or frameworks, such as Google Play Services. This means you can use NewPipe on devices or custom ROMs that do not have Google apps installed. - -### Features - -* Watch videos at resolutions up to 4K -* Listen to audio in the background, only loading the audio stream to save data -* Popup mode (floating player, aka Picture-in-Picture) -* Watch live streams -* Show/hide subtitles/closed captions -* Search videos and audios (on YouTube, you can specify the content language as well) -* Enqueue videos (and optionally save them as local playlists) -* Show/hide general information about videos (such as description and tags) -* Show/hide next/related videos -* Show/hide comments -* Search videos, audios, channels, playlists and albums -* Browse videos and audios within a channel -* Subscribe to channels (yes, without logging into any account!) -* Get notifications about new videos from channels you're subscribed to -* Create and edit channel groups (for easier browsing and management) -* Browse video feeds generated from your channel groups -* View and search your watch history -* Search and watch playlists (these are remote playlists, which means they're fetched from the service you're browsing) -* Create and edit local playlists (these are created and saved within the app, and have nothing to do with any service) -* Download videos/audios/subtitles (closed captions) -* Open in Kodi -* Watch/Block age-restricted material - - - - -## Installation and updates -You can install NewPipe using one of the following methods: - 1. Add our custom repo to F-Droid and install it from there. The instructions are here: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ - 2. Download the APK from [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases), [compare the signing key](#apk-info) and install it. - 3. Update via F-Droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, and then push the update to users. - 4. Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods. - 5. If you're interested in a specific feature or bugfix provided in a Pull Request in this repo, you can also download its APK from within the PR. Read the PR description for instructions. The great thing about PR-specific APKs is that they're installed side-by-side the official app, so you don't have to worry about losing your data or messing anything up. - -We recommend method 1 for most users. APKs installed using method 1 or 2 are compatible with each other (meaning that if you installed NewPipe using either method 1 or 2, you can also update NewPipe using the other), but not with those installed using method 3. This is due to the same signing key (ours) being used for 1 and 2, but a different signing key (F-Droid's) being used for 3. Building a debug APK using method 4 excludes a key entirely. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app. When using method 5, each APK is signed with a different random key supplied by GitHub Actions, so you cannot even update it. You will have to backup and restore the app data each time you wish to use a new APK. - -In the meanwhile, if you want to switch sources for some reason (e.g. NewPipe's core functionality breaks and F-Droid doesn't have the latest update yet), we recommend following this procedure: -1. Back up your data via Settings > Backup and Restore > Export Database so you keep your history, subscriptions, and playlists -2. Uninstall NewPipe -3. Download the APK from the new source and install it -4. Import the data from step 1 via Settings > Backup and Restore > Import Database - -> [!Note] -> When you're importing a database into the official app, always make sure that it is the one you exported _from_ the official app. If you import a database exported from an APK other than the official app, it may break things. Such an action is unsupported, and you should only do so when you're absolutely certain you know what you're doing. - -### APK Info - -This is the SHA fingerprint of NewPipe's signing key to verify downloaded APKs which are signed by us. The fingerprint is also available on [NewPipe's website](https://newpipe.net#download). This is relevant for method 2. -``` -CB:84:06:9B:D6:81:16:BA:FA:E5:EE:4E:E5:B0:8A:56:7A:A6:D8:98:40:4E:7C:B1:2F:9E:75:6D:F5:CF:5C:AB -``` - -## Contribution -Whether you have ideas, translations, design changes, code cleaning, or even major code changes, help is always welcome. The app gets better and better with each contribution, no matter how big or small! If you'd like to get involved, check our [contribution notes](.github/CONTRIBUTING.md). - - -Translation status - - -## Donate -If you like NewPipe, you're welcome to send a donation. We prefer Liberapay, as it is both open-source and non-profit. For further info on donating to NewPipe, please visit our [website](https://newpipe.net/donate). - - - - - - - -
    LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    - -## Privacy Policy - -The NewPipe project aims to provide a private, anonymous experience for using web-based media services. Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or leave a comment in our blog. You can find the document [here](https://newpipe.net/legal/privacy/). - -## License -[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) - -NewPipe is Free Software: You can use, study, share, and improve it at will. Specifically you can redistribute and/or modify it under the terms of the [GNU General Public License](https://www.gnu.org/licenses/gpl.html) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. diff --git a/README.md b/README.md new file mode 120000 index 000000000..fd42db32e --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +doc/README.md \ No newline at end of file diff --git a/doc/README.ar.md b/doc/README.ar.md index 14f7c7ce1..fd80bbc59 100644 --- a/doc/README.ar.md +++ b/doc/README.ar.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    .Android واجهة أمامية متدفقة خفيفة الوزن لنظام

    @@ -22,7 +22,7 @@

    موقع • مدونة • الأسئلة الشائعة • إضغط


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > .عن طريق ملء نموذج المشكلةGITHUB هذا التطبيق في مرحلة البيتا، لذا قد تواجه بعض الأخطاء. إذا واجهت أي أخطاء، يرجى فتح مشكلة في مستودعنا على > @@ -30,18 +30,18 @@ ## لقطات الشاشة -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ### الخدمات المدعومة @@ -120,7 +120,7 @@ ## مساهمة -سواء كانت لديك أفكار، أو ترجمات، أو تغييرات في التصميم، أو تنظيف التعليمات البرمجية، أو حتى تغيير كبير في التعليمات البرمجية، فنحن نرحب بأي مساعدة. التطبيق يصبح أفضل قليلا مع كل مساهمة، مهما كانت كبيرة أو صغيرة! إذا كنت ترغب في المشاركة، قم بإلقاء نظرة على [ملاحظات المساهمة](.github/CONTRIBUTING.md). +سواء كانت لديك أفكار، أو ترجمات، أو تغييرات في التصميم، أو تنظيف التعليمات البرمجية، أو حتى تغيير كبير في التعليمات البرمجية، فنحن نرحب بأي مساعدة. التطبيق يصبح أفضل قليلا مع كل مساهمة، مهما كانت كبيرة أو صغيرة! إذا كنت ترغب في المشاركة، قم بإلقاء نظرة على [ملاحظات المساهمة](/.github/CONTRIBUTING.md). Translation status @@ -133,8 +133,8 @@ - - + +
    LiberapayVisitez NewPipe sur liberapay.comDonnez via LiberapayVisitez NewPipe sur liberapay.comDonnez via Liberapay
    diff --git a/doc/README.asm.md b/doc/README.asm.md index b795ee191..cfabf28fb 100644 --- a/doc/README.asm.md +++ b/doc/README.asm.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    এণ্ড্ৰইডৰ বাবে এটা লিব্ৰে লাইটৱেট ষ্ট্ৰীমিং ফ্ৰন্ট-এণ্ড।

    @@ -27,7 +27,7 @@ FAQ • Press


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > এই এপটো নিৰ্মিয়মান অৱস্থাত আছে, গতিকে আপুনি ব্যৱহাৰ কৰোঁতে কোনো অসুবিধাৰ সন্মুখীন হ'ব পাৰে। যদি আপুনি অসুবিধাৰ সন্মুখীন হয়, ইছ্যু টেমপ্লেট পূৰণ কৰি আমাৰ GITHUB ৰিপ'জিটৰিত এটা ইছ্যু খোলক। @@ -36,18 +36,18 @@ ## স্ত্ৰীনশ্বট -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## সমৰ্থিত সেৱাসমূহ @@ -132,8 +132,8 @@ NewPipe এ আপুনি ব্যৱহাৰ কৰা সেৱাৰ অ - - + +
    LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    diff --git a/doc/README.de.md b/doc/README.de.md index 9ebd52957..e56f280b8 100644 --- a/doc/README.de.md +++ b/doc/README.de.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Eine freie, offene und leichtgewichtige Streaming App für Android.

    @@ -22,7 +22,7 @@

    Website • Blog • FAQ • Über NewPipe


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > DIESE APP BEFINDET SICH IN EINER BETA-PHASE, DAHER KÖNNTEST DU BUGS BEGEGNEN. FALLS DIES PASSIERT, ERSTELLE EIN ISSUE (AUF ENGLISCH) IN UNSEREM GITHUB REPOSITORY, INDEM DU DIE VORLAGE DORT AUSFÜLLST. @@ -33,18 +33,18 @@ ## Screenshots -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## Unterstützte Dienste @@ -145,8 +145,8 @@ Für weitere Informationen über Spenden an NewPipe, besuche unsere [Website](ht - - + +
    LiberapayGehe zu NewPipe auf liberapay.comSpenden mit LiberapayGehe zu NewPipe auf liberapay.comSpenden mit Liberapay
    diff --git a/doc/README.es.md b/doc/README.es.md index ce8633a3e..e895dee22 100644 --- a/doc/README.es.md +++ b/doc/README.es.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Una interfaz de streaming ligera y libre para Android.

    @@ -23,7 +23,7 @@

    Sitio Web • Blog • Preguntas Frecuentes • Prensa


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > ESTA ES UNA VERSIÓN BETA, POR LO TANTO, PUEDES ENCONTRAR BUGS. SI ENCUENTRAS UNO ABRA UN ISSUE A TRAVÉS DE NUESTRO REPOSITORIO DE GITHUB. @@ -32,18 +32,18 @@ ## Capturas de Pantalla -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## Descripción @@ -111,7 +111,7 @@ Además, si quiere cambiar el método de instalación por alguna razón (por eje Si tiene ideas, traducciones, cambios de diseño, limpieza de código o cambios grandes de código, su ayuda es siempre bienvenida. ¡Cuanto más hagamos, NewPipe será mucho mejor! -Si quiere involucrarse, fíjese en nuestras [notas de contribución](../.github/CONTRIBUTING.md). +Si quiere involucrarse, fíjese en nuestras [notas de contribución](/.github/CONTRIBUTING.md). Estado de la Traducción @@ -123,8 +123,8 @@ Si te gusta NewPipe, estaremos felices con una donación. Puede enviar bitcoin o - - + +
    LiberapayVisita NewPipe en liberapay.comDona vía LiberapayVisita NewPipe en liberapay.comDona vía Liberapay
    diff --git a/doc/README.fr.md b/doc/README.fr.md index 6ecade289..2f9b48076 100644 --- a/doc/README.fr.md +++ b/doc/README.fr.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Un front-end de streaming libre et léger pour Android.

    @@ -22,7 +22,7 @@

    Site • Blog • FAQ • Presse


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > CETTE APP EST EN BETA, VOUS POUVEZ DONC RENCONTRER DES BUGS. SI C'EST LE CAS, OUVREZ UNE ISSUE DANS NOTRE DÉPÔT GITHUB EN REMPLISSANT LA CATEGORIE ISSUE. @@ -31,18 +31,18 @@ ## Captures d'écran -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ### Services supportés @@ -126,8 +126,8 @@ Si vous aimez NewPipe, vous êtes invités à envoyer un don. Nous préferons Li - - + +
    LiberapayVisitez NewPipe sur liberapay.comDonnez via LiberapayVisitez NewPipe sur liberapay.comDonnez via Liberapay
    diff --git a/doc/README.hi.md b/doc/README.hi.md index c7eb61206..44973d835 100644 --- a/doc/README.hi.md +++ b/doc/README.hi.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Android के लिए एक ओपन सोर्स, हल्का YouTube ऐप।

    @@ -22,7 +22,7 @@

    वेबसाइट • ब्लॉग • साधारण सवाल-जवाब • प्रेस


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > यह एक बीटा संस्करण है, तो अगर आपको इसमें बग्स नज़र आते हैं, कृपया हमारे GitHub रिपॉज़िटरी के ज़रिए एक समस्या खोल दें। @@ -31,18 +31,18 @@ ## ऐप कैसी दिखती है -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## समर्थित सेवाएँ @@ -129,8 +129,8 @@ NewPipe ना ही किसी Google फ्रेमवर्क लाइ - - + +
    Liberapayliberapay.com पर NewPipe को देखेंLiberapay के ज़रिए दान करेंliberapay.com पर NewPipe को देखेंLiberapay के ज़रिए दान करें
    diff --git a/doc/README.it.md b/doc/README.it.md index 8452c3851..c5b4f6b58 100644 --- a/doc/README.it.md +++ b/doc/README.it.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Un frontend di streaming libero e leggero per Android.

    @@ -22,7 +22,7 @@

    Sito • Blog • FAQ • Stampa


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > QUEST'APP È IN BETA, QUINDI POTRESTI IMBATTERTI IN BUG. SE COSÌ FOSSE, APRI UN'ISSUE SUL NOSTRO REPOSITORIO GITHUB COMPILANDO IL TEMPLATE ISSUE. @@ -31,18 +31,18 @@ ## Screenshot -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ### Servizi Supportati @@ -126,8 +126,8 @@ Se ti piace NewPipe, le donazioni sono benvenute. Preferiamo Liberapay, siccome - - + +
    LiberapayVisita NewPipe su liberapay.comDona via LiberapayVisita NewPipe su liberapay.comDona via Liberapay
    diff --git a/doc/README.ja.md b/doc/README.ja.md index 215081562..a1dfbfac1 100644 --- a/doc/README.ja.md +++ b/doc/README.ja.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    自由で軽量な Android 向けストリーミングフロントエンド

    @@ -22,7 +22,7 @@

    ウェブサイト • ブログ • FAQ • ニュース


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > これはベータ版のため、バグが発生する可能性があります。もしバグが発生した場合、GitHub のリポジトリで Issue を開いてください。 @@ -32,18 +32,18 @@ ## スクリーンショット -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## 説明 @@ -115,7 +115,7 @@ NewPipe は複数のサービスに対応しています。[ドキュメント]( 翻訳、デザインの変更、コードの整理、大規模なコードの変更などの助けはいつでも歓迎します。 より良いものを一緒に作り上げましょう! -もし貢献をしたい場合、[貢献ノート](../.github/CONTRIBUTING.md)をご確認ください。 +もし貢献をしたい場合、[貢献ノート](/.github/CONTRIBUTING.md)をご確認ください。 翻訳状態 @@ -128,8 +128,8 @@ NewPipe は複数のサービスに対応しています。[ドキュメント]( - - + +
    Liberapayliberapay.com で NewPipe を訪れるLiberapay で寄付liberapay.com で NewPipe を訪れるLiberapay で寄付
    diff --git a/doc/README.ko.md b/doc/README.ko.md index c33d5e87f..3f14f1726 100644 --- a/doc/README.ko.md +++ b/doc/README.ko.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    A libre lightweight streaming frontend for Android.

    @@ -22,7 +22,7 @@

    Website • Blog • FAQ • Press


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > 이 버전은 베타 버전이므로, 버그가 발생할 수도 있습니다. 만약 버그가 발생하였다면, 우리의 GitHub 저장소에서 Issue를 열람하여 주십시오. @@ -31,18 +31,18 @@ ## 스크린샷 -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ### 지원되는 서비스 @@ -111,7 +111,7 @@ NewPipe는 서비스의 공식 API를 이용하여 정보를 받아오는 방식 당신이 아이디어, 번역, 디자인 변경, 코드 정리, 또는 정말 큰 코드 수정에 대한 의견이 있다면, 도움은 항상 환영합니다. 더 많이 수행될수록 더 많이 발전할 수 있습니다! -만약 참여하고 싶다면, 우리의 [기여 공지](../.github/CONTRIBUTING.md)를 참고하십시오. +만약 참여하고 싶다면, 우리의 [기여 공지](/.github/CONTRIBUTING.md)를 참고하십시오. Translation status @@ -123,8 +123,8 @@ NewPipe는 서비스의 공식 API를 이용하여 정보를 받아오는 방식 - - + +
    LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 000000000..5bcd15933 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,151 @@ +

    +

    NewPipe

    +

    A libre lightweight streaming front-end for Android.

    + +

    Get it on F-Droid

    + +

    + + + + + +

    + +

    + + +

    + +
    +

    Screenshots • Supported Services • Description • Features • Installation and updates • Contribution • Donate • License

    +

    Website • Blog • FAQ • Press

    +
    + +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [Српски](/doc/README.sr.md), [العربية](/doc/README.ar.md)* + +> [!warning] +> THIS APP IS IN BETA, SO YOU MAY ENCOUNTER BUGS. IF YOU DO, OPEN AN ISSUE IN OUR GITHUB REPOSITORY BY FILLING OUT THE ISSUE TEMPLATE. +> +> PUTTING NEWPIPE, OR ANY FORK OF IT, INTO THE GOOGLE PLAY STORE VIOLATES THEIR TERMS AND CONDITIONS. +> +> "NewPipe" IS A REGISTERED WORD MARK SUBJECT TO [ITS TRADEMARK POLICY](https://newpipe-ev.de/policy/trademark/). INFRINGING APPLICATIONS WILL NOT BE TOLERATED. + +## Screenshots + +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +

    +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) + +### Supported Services + +NewPipe currently supports these services: + + +* YouTube ([website](https://www.youtube.com/)) and YouTube Music ([website](https://music.youtube.com/)) ([wiki](https://en.wikipedia.org/wiki/YouTube)) +* PeerTube ([website](https://joinpeertube.org/)) and all its instances (open the website to know what that means!) ([wiki](https://en.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([website](https://bandcamp.com/)) ([wiki](https://en.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([website](https://soundcloud.com/)) ([wiki](https://en.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([website](https://media.ccc.de/)) ([wiki](https://en.wikipedia.org/wiki/Chaos_Computer_Club)) + +As you can see, NewPipe supports multiple video and audio services. Though it started off with YouTube, other people have added more services over the years, making NewPipe more and more versatile! + +Partially due to circumstance, and partially due to its popularity, YouTube is the best supported out of these services. If you use or are familiar with any of these other services, please help us improve support for them! We're looking for maintainers for SoundCloud and PeerTube. + +If you intend to add a new service, please get in touch with us first! Our [docs](https://teamnewpipe.github.io/documentation/) provide more information on how a new service can be added to the app and to the [NewPipe Extractor](https://github.com/TeamNewPipe/NewPipeExtractor). + +## Description + +NewPipe works by fetching the required data from the official API (e.g. PeerTube) of the service you're using. If the official API is restricted (e.g. YouTube) for our purposes, or is proprietary, the app parses the website or uses an internal API instead. This means that you don't need an account on any service to use NewPipe. + +Also, since they are free and open source software, neither the app nor the Extractor use any proprietary libraries or frameworks, such as Google Play Services. This means you can use NewPipe on devices or custom ROMs that do not have Google apps installed. + +### Features + +* Watch videos at resolutions up to 4K +* Listen to audio in the background, only loading the audio stream to save data +* Popup mode (floating player, aka Picture-in-Picture) +* Watch live streams +* Show/hide subtitles/closed captions +* Search videos and audios (on YouTube, you can specify the content language as well) +* Enqueue videos (and optionally save them as local playlists) +* Show/hide general information about videos (such as description and tags) +* Show/hide next/related videos +* Show/hide comments +* Search videos, audios, channels, playlists and albums +* Browse videos and audios within a channel +* Subscribe to channels (yes, without logging into any account!) +* Get notifications about new videos from channels you're subscribed to +* Create and edit channel groups (for easier browsing and management) +* Browse video feeds generated from your channel groups +* View and search your watch history +* Search and watch playlists (these are remote playlists, which means they're fetched from the service you're browsing) +* Create and edit local playlists (these are created and saved within the app, and have nothing to do with any service) +* Download videos/audios/subtitles (closed captions) +* Open in Kodi +* Watch/Block age-restricted material + + + + +## Installation and updates +You can install NewPipe using one of the following methods: + 1. Add our custom repo to F-Droid and install it from there. The instructions are here: https://newpipe.net/FAQ/tutorials/install-add-fdroid-repo/ + 2. Download the APK from [GitHub Releases](https://github.com/TeamNewPipe/NewPipe/releases), [compare the signing key](#apk-info) and install it. + 3. Update via F-Droid. This is the slowest method of getting updates, as F-Droid must recognize changes, build the APK itself, sign it, and then push the update to users. + 4. Build a debug APK yourself. This is the fastest way to get new features on your device, but is much more complicated, so we recommend using one of the other methods. + 5. If you're interested in a specific feature or bugfix provided in a Pull Request in this repo, you can also download its APK from within the PR. Read the PR description for instructions. The great thing about PR-specific APKs is that they're installed side-by-side the official app, so you don't have to worry about losing your data or messing anything up. + +We recommend method 1 for most users. APKs installed using method 1 or 2 are compatible with each other (meaning that if you installed NewPipe using either method 1 or 2, you can also update NewPipe using the other), but not with those installed using method 3. This is due to the same signing key (ours) being used for 1 and 2, but a different signing key (F-Droid's) being used for 3. Building a debug APK using method 4 excludes a key entirely. Signing keys help ensure that a user isn't tricked into installing a malicious update to an app. When using method 5, each APK is signed with a different random key supplied by GitHub Actions, so you cannot even update it. You will have to backup and restore the app data each time you wish to use a new APK. + +In the meanwhile, if you want to switch sources for some reason (e.g. NewPipe's core functionality breaks and F-Droid doesn't have the latest update yet), we recommend following this procedure: +1. Back up your data via Settings > Backup and Restore > Export Database so you keep your history, subscriptions, and playlists +2. Uninstall NewPipe +3. Download the APK from the new source and install it +4. Import the data from step 1 via Settings > Backup and Restore > Import Database + +> [!Note] +> When you're importing a database into the official app, always make sure that it is the one you exported _from_ the official app. If you import a database exported from an APK other than the official app, it may break things. Such an action is unsupported, and you should only do so when you're absolutely certain you know what you're doing. + +### APK Info + +This is the SHA fingerprint of NewPipe's signing key to verify downloaded APKs which are signed by us. The fingerprint is also available on [NewPipe's website](https://newpipe.net#download). This is relevant for method 2. +``` +CB:84:06:9B:D6:81:16:BA:FA:E5:EE:4E:E5:B0:8A:56:7A:A6:D8:98:40:4E:7C:B1:2F:9E:75:6D:F5:CF:5C:AB +``` + +## Contribution +Whether you have ideas, translations, design changes, code cleaning, or even major code changes, help is always welcome. The app gets better and better with each contribution, no matter how big or small! If you'd like to get involved, check our [contribution notes](/.github/CONTRIBUTING.md). + + +Translation status + + +## Donate +If you like NewPipe, you're welcome to send a donation. We prefer Liberapay, as it is both open-source and non-profit. For further info on donating to NewPipe, please visit our [website](https://newpipe.net/donate). + + + + + + + +
    LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    + +## Privacy Policy + +The NewPipe project aims to provide a private, anonymous experience for using web-based media services. Therefore, the app does not collect any data without your consent. NewPipe's privacy policy explains in detail what data is sent and stored when you send a crash report, or leave a comment in our blog. You can find the document [here](https://newpipe.net/legal/privacy/). + +## License +[![GNU GPLv3 Image](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html) + +NewPipe is Free Software: You can use, study, share, and improve it at will. Specifically you can redistribute and/or modify it under the terms of the [GNU General Public License](https://www.gnu.org/licenses/gpl.html) as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. diff --git a/doc/README.pa.md b/doc/README.pa.md index d51408d5d..5a27df0dd 100644 --- a/doc/README.pa.md +++ b/doc/README.pa.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    ਐਂਡਰੌਇਡ ਲਈ ਇੱਕ ਮੁਫ਼ਤ ਹਲਕਾ-ਫੁਲਕਾ ਸਟ੍ਰੀਮਿੰਗ ਯੂਟਿਊਬ ਫਰੰਟ-ਐਂਡ।

    @@ -22,7 +22,7 @@

    ਵੈੱਬਸਾਈਟ • ਬਲੌਗ • ਆਮ ਸਵਾਲ ਜਵਾਬ • ਪ੍ਰੈਸ


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > ਇਹ ਐਪ ਬੀਟਾ ਵਿੱਚ ਹੈ, ਇਸ ਲਈ ਤੁਸੀਂ ਬੱਗ ਦਾ ਸਾਹਮਣਾ ਕਰ ਸਕਦੇ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਅਜਿਹਾ ਕਰਦੇ ਹੋ, ਤਾਂ ਟੈਮਪਲੇਟ ਨੂੰ ਭਰ ਕੇ ਸਾਡੀ ਗਿਟਹੱਬ ਰਿਪੋਜ਼ਟਰੀ ਵਿੱਚ ਇੱਕ ਮੁੱਦਾ ਖੋਲ੍ਹੋ @@ -31,18 +31,18 @@ ## ਐਪ ਕਿਹੋ-ਜਿਹੀ ਦਿਖਦੀ ਹੈ -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## ਸਮਰਥਿਤ ਸੇਵਾਵਾਂ @@ -126,8 +126,8 @@ NewPipe ਤੁਹਾਡੇ ਦੁਆਰਾ ਵਰਤੀ ਜਾ ਰਹੀ ਸੇ - - + +
    Liberapayliberapay.com 'ਤੇ NewPipe ਨੂੰ ਵੇਖੋDonate via Liberapayliberapay.com 'ਤੇ NewPipe ਨੂੰ ਵੇਖੋDonate via Liberapay
    diff --git a/doc/README.pl.md b/doc/README.pl.md index 83025dee1..032a868f4 100644 --- a/doc/README.pl.md +++ b/doc/README.pl.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Wolny, lekki streamingowy frontend na Androida.

    @@ -22,7 +22,7 @@

    Strona • Blog • FAQ • Press


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > TO JEST WERSJA BETA, WIĘC MOŻESZ NAPOTKAĆ BŁĘDY. JEŚLI TAK SIĘ STANIE, OTWÓRZ NOWY "ISSUE" NA GITHUBIE. @@ -31,18 +31,18 @@ ## Screenshoty -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## Opis @@ -108,7 +108,7 @@ W międzyczasie, jeśli z jakiegoś powodu chcesz zmienić źródło (np. rdzenn Jeśli masz jakieś pomysły, tłumaczenia, zmiany designu, oczyszczony kod, lub wielkie zmiany w kodzie, pomoc jest zawsze mile widziana. Im więcej jest zrobione, tym lepsza staje się aplikacja! -Jeśli chcesz pomóc, przeczytaj [Notkę o wkładzie](../.github/CONTRIBUTING.md). +Jeśli chcesz pomóc, przeczytaj [Notkę o wkładzie](/.github/CONTRIBUTING.md). Translation status @@ -120,8 +120,8 @@ Jeśli podoba Ci się NewPipe, bardzo ucieszylibyśmy się z dotacji. Możesz wy - - + +
    LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    diff --git a/doc/README.pt_BR.md b/doc/README.pt_BR.md index beea4dc1d..e09f7e83a 100644 --- a/doc/README.pt_BR.md +++ b/doc/README.pt_BR.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Uma interface de streaming leve e gratuita para Android.

    @@ -23,7 +23,7 @@

    Site • Blog • FAQ • Press


    -*Leia esse documento em outras línguas: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md), [العربية](README.ar.md)* +*Leia esse documento em outras línguas: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md), [العربية](/doc/README.ar.md)* > [!warning] > ESTA É UMA VERSÃO BETA, PORTANTO, VOCÊ PODE ENCONTRAR BUGS. ENCONTROU ALGUM, ABRA UM ISSUE ATRAVÉS DO NOSSO REPOSITÓRIO GITHUB PREENCHENDO O MODELO. @@ -32,18 +32,18 @@ ## Screenshots -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ### Serviços Suportados @@ -121,8 +121,8 @@ Se você gosta do NewPipe, pode enivar uma doação. Nós preferimos Liberapay, - - + +
    LiberapayVisite NewPipe em liberapay.comDoar via LiberapayVisite NewPipe em liberapay.comDoar via Liberapay
    diff --git a/doc/README.ro.md b/doc/README.ro.md index 49c8d757a..37e50221b 100644 --- a/doc/README.ro.md +++ b/doc/README.ro.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Un front-end de streaming „uşor” liber, pentru Android.

    @@ -22,7 +22,7 @@

    Website • Blog • FAQ • Presă


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > ACEASTA ESTE O VERSIUNE BETA, AŞA CĂ S-AR PUTE SĂ ÎNTÂLNIŢI ERORI. DACĂ SE ÎNTÂMPLĂ ACEST LUCRU, DESCHIDEŢI UN ISSUE PRIN REPSITORY-UL NOSTRU GITHUB. @@ -31,18 +31,18 @@ ## Capturi de ecran -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## Descriere @@ -111,7 +111,7 @@ Recomandăm metoda 1 pentru majoritatea utilizatorilor. APK-urile din metodele 1 Dacă aveţi idei, traduceri, schimbări de design, curaţarea codului, sau schimbări majore ale codului, ajutorul este întotdeauna binevenit. Cu cât se face mai mult cu atât mai bună devine aplicaţia! -Dacă doriţi să vă implicaţi, accesaţi [notele noastre de contribuţie](../.github/CONTRIBUTING.md). +Dacă doriţi să vă implicaţi, accesaţi [notele noastre de contribuţie](/.github/CONTRIBUTING.md). Translation status @@ -123,8 +123,8 @@ Dacă vă place NewPipe, am fi bucuroşi să primim o donaţie. Puteţi să ne t - - + +
    LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    diff --git a/doc/README.ru.md b/doc/README.ru.md index 8934207d8..3bb264bc0 100644 --- a/doc/README.ru.md +++ b/doc/README.ru.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Свободный и легковесный клиент потоковых сервисов для Android.

    @@ -22,7 +22,7 @@

    Сайт • Блог • ЧЗВ • Пресса


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > ЭТО ПРИЛОЖЕНИЕ НАХОДИТСЯ В СТАДИИ БЕТА, ПОЭТОМУ ВЫ МОЖЕТЕ ОБНАРУЖИТЬ ОШИБКИ. ЕСЛИ ЭТО СЛУЧИТСЯ, ОТКРОЙТЕ ВОПРОС В НАШЕМ РЕПОЗИТОРИИ GITHUB, ЗАПОЛНЯ ЕГО ПО ШАБЛОНУ. @@ -31,18 +31,18 @@ ## Скриншоты -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ### Поддерживаемые сервисы @@ -124,8 +124,8 @@ NewPipe работает, извлекая необходимые данные - - + +
    LiberapayПосетите NewPipe на liberapay.comПожертвование через LiberapayПосетите NewPipe на liberapay.comПожертвование через Liberapay
    diff --git a/doc/README.ryu.md b/doc/README.ryu.md index 71b0a5429..43cd77681 100644 --- a/doc/README.ryu.md +++ b/doc/README.ryu.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    じゆーいっしけいりょうなAndroidんきーストリーミングフロントエンド

    @@ -22,7 +22,7 @@

    ウェブサイト • ブログ • FAQ • ニュース


    -*ふかぬぎんぐっしゆむん: [English](../README.md), [Español](README.es.md), [हिन्दी](README.hi.md), [한국어](README.ko.md), [Soomaali](README.so.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [日本語](README.ja.md), [Română](README.ro.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*ふかぬぎんぐっしゆむん: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [Српски](/doc/README.sr.md), [العربية](/doc/README.ar.md)* > [!warning] > くれーベータばんぬたみ、バグぬはっせいすがのうゆいがあいびーん。むしバグぬはっせいさーあい、GitHubぬリポジトリっしIssueふぃらちくぃみそーれー。 @@ -32,18 +32,18 @@ ## スクリーンショット -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## しちめい @@ -115,7 +115,7 @@ NewPipeーふくすんぬサービスんかいたいおうそーいびーん。[ ふんやちゅん、デザインぬへんかん、コードぬせいり、だいきぶやーコードぬへんかんんでーぬたしきーやいちやてぃんかんぎうぅいさびーん。 ゆりじょーとぅーまじゅんちゅくいとぅらさびら! -むしこうきんさるいばあい、[こうきんノート](../.github/CONTRIBUTING.md)ぐかくにんくぃみそーれー。 +むしこうきんさるいばあい、[こうきんノート](/.github/CONTRIBUTING.md)ぐかくにんくぃみそーれー。 ふんやちゅるじょうたい @@ -128,8 +128,8 @@ NewPipeーふくすんぬサービスんかいたいおうそーいびーん。[ - - + +
    Liberapayliberapay.comっしNewPipeちゅーんLiberapayなちーふliberapay.comっしNewPipeちゅーんLiberapayなちーふ
    diff --git a/doc/README.so.md b/doc/README.so.md index 792a8cfec..40cff7bd8 100644 --- a/doc/README.so.md +++ b/doc/README.so.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    App bilaash ah oo fudud looguna talagalay in Android-ka wax loogu daawado.

    @@ -22,7 +22,7 @@

    Website-ka • Maqaalada • Su'aalaha Aalaa La-iswaydiiyo • Warbaahinta


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > MIDKAN, NOOCA APP-KA EE HADDA WALI TIJAABO AYUU KU JIRAA, SIDAA DARTEED CILLADO AYAAD LA KULMI KARTAA. HADAAD LA KULANTO, KA FUR ARIN SHARAXAYA QAYBTANADA ARRIMAHA EE GITHUB-KA. @@ -31,18 +31,18 @@ ## Sawir-shaashadeed -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## Faahfaahin @@ -106,7 +106,7 @@ Waxaa kale, hadaad rabto inaad tixraacayada kala badasho sabab jirta awgeed (tus ## Kusoo Kordhin Hadaad hayso fikrado; rogid, qaab badal, nadiifin koodh, ama koodhka ood si wayn wax oga badashaa—caawinta marwalba waa lasoo dhawaynayaa. Waxbadan hadii la qabto waxbadan ayaa fiicnaan! -Hadaad jeceshahay inaad qayb ka noqoto, fiiri [ogaysiisyada kusoo kordhinta](../.github/CONTRIBUTING.md). +Hadaad jeceshahay inaad qayb ka noqoto, fiiri [ogaysiisyada kusoo kordhinta](/.github/CONTRIBUTING.md). Heerka turjimaada @@ -118,8 +118,8 @@ Hadaad jeceshahay NewPipe waan ku faraxsanaan lahayn deeq. Waxaad soo diri karta - - + +
    LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    diff --git a/doc/README.sr.md b/doc/README.sr.md index f05c35f2d..3dd0230d3 100644 --- a/doc/README.sr.md +++ b/doc/README.sr.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Бесплатна и лагана апликација за стримовање за Android.

    @@ -22,7 +22,7 @@

    Веб-сајт • Блог • ЧПП • Штампа


    -*Прочитајте овај документ на другим језицима: [Deutsch](README.de.md), [English](README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Прочитајте овај документ на другим језицима: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [Српски](/doc/README.sr.md), [العربية](/doc/README.ar.md)* > [!warning] > ОВА АПЛИКАЦИЈА ЈЕ У БЕТА ВЕРЗИЈИ, ТАКО ДА МОЖЕТЕ НАИЋИ НА ГРЕШКЕ. АКО НАИЂЕТЕ, НАПИШИТЕ ИЗВЕШТАЈ У НАШЕМ GITHUB РЕПОЗИТОРИЈУМУ ПОПУЊАВАЊЕМ ШАБЛОНА ИЗВЕШТАЈА. @@ -31,18 +31,18 @@ ## Снимци екрана -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ### Подржане услуге @@ -119,8 +119,8 @@ NewPipe ради тако што преузима потребне податк - - + +
    LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    diff --git a/doc/README.tr.md b/doc/README.tr.md index 2a4b5d13b..5dab23580 100644 --- a/doc/README.tr.md +++ b/doc/README.tr.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    Android için hafif ve özgür bir akış arayüzü.

    @@ -22,7 +22,7 @@

    Web sitesi • Blog • SSS • Basın


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > BU SÜRÜM BETA SÜRÜMÜDÜR, BU NEDENLE HATALARLA KARŞILAŞABİLİRSİNİZ. HATA BULURSANIZ BU GITHUB DEPOSUNDA BUNU BİLDİRİN. @@ -31,18 +31,18 @@ ## Ekran görüntüleri -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## Açıklama @@ -110,7 +110,7 @@ Bu arada, herhangi bir nedenle kaynakları değiştirmek istiyorsanız (örneği Fikirleriniz, çevirileriniz, tasarım değişiklikleriniz, kod temizlemeniz veya ağır kod değişiklikleriniz olsun, yardımınıza her zaman açığız. Yapılan her değişiklikle NewPipe daha da iyi bir konuma geliyor! -Eğer yer almak istiyorsanız, [katkı sağlayanlar için hazırladığımız notları](../.github/CONTRIBUTING.md) kontrol edin. +Eğer yer almak istiyorsanız, [katkı sağlayanlar için hazırladığımız notları](/.github/CONTRIBUTING.md) kontrol edin. Çeviri istatistikleri @@ -122,8 +122,8 @@ NewPipe'ı beğendiyseniz, yapacağınız bağışlar bizi motive eder. Bitcoin - - + +
    Liberapayliberapay.com üzerinde NewPipe'ı ziyaret edinLiberapay aracılığıyla bağış yapınliberapay.com üzerinde NewPipe'ı ziyaret edinLiberapay aracılığıyla bağış yapın
    diff --git a/doc/README.zh_TW.md b/doc/README.zh_TW.md index 3aa95316a..e8639922e 100644 --- a/doc/README.zh_TW.md +++ b/doc/README.zh_TW.md @@ -1,4 +1,4 @@ -

    +

    NewPipe

    輕巧的 Android 串流前端

    @@ -22,7 +22,7 @@

    網站 • 部落格 • FAQ • 媒體


    -*Read this document in other languages: [Deutsch](README.de.md), [English](../README.md), [Español](README.es.md), [Français](README.fr.md), [हिन्दी](README.hi.md), [Italiano](README.it.md), [한국어](README.ko.md), [Português Brasil](README.pt_BR.md), [Polski](README.pl.md), [ਪੰਜਾਬੀ ](README.pa.md), [日本語](README.ja.md), [Română](README.ro.md), [Soomaali](README.so.md), [Türkçe](README.tr.md), [正體中文](README.zh_TW.md), [অসমীয়া](README.asm.md), [うちなーぐち](README.ryu.md), [Српски](README.sr.md) , [العربية](README.ar.md)* +*Read this document in other languages: [Deutsch](/doc/README.de.md), [English](/doc/README.md), [Español](/doc/README.es.md), [Français](/doc/README.fr.md), [हिन्दी](/doc/README.hi.md), [Italiano](/doc/README.it.md), [한국어](/doc/README.ko.md), [Português Brasil](/doc/README.pt_BR.md), [Polski](/doc/README.pl.md), [ਪੰਜਾਬੀ ](/doc/README.pa.md), [日本語](/doc/README.ja.md), [Română](/doc/README.ro.md), [Soomaali](/doc/README.so.md), [Türkçe](/doc/README.tr.md), [正體中文](/doc/README.zh_TW.md), [অসমীয়া](/doc/README.asm.md), [うちなーぐち](/doc/README.ryu.md), [Српски](/doc/README.sr.md) , [العربية](/doc/README.ar.md)* > [!warning] > 這是測試版本,可能會發生錯誤。如果遇到錯誤,請在我們的 GITHUB REPO 開 ISSUE 回報。 @@ -32,18 +32,18 @@ ## 截圖 -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) -[](../fastlane/metadata/android/en-US/images/phoneScreenshots/08.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/00.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/01.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/02.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/03.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/04.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/05.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/06.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/07.png) +[](/fastlane/metadata/android/en-US/images/phoneScreenshots/08.png)

    -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) -[](../fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/09.png) +[](/fastlane/metadata/android/en-US/images/tenInchScreenshots/10.png) ## 說明 @@ -115,7 +115,7 @@ NewPipe 支援多種服務。我們的[使用文件](https://teamnewpipe.github. ## 貢獻 若你有任何想法、翻譯、設計、整理原始碼或大範圍的原始碼改動,我們歡迎任何幫助。 -若你想參與,請閱讀[貢獻須知(英文)](../.github/CONTRIBUTING.md)。 +若你想參與,請閱讀[貢獻須知(英文)](/.github/CONTRIBUTING.md)。 Translation status @@ -128,8 +128,8 @@ NewPipe 支援多種服務。我們的[使用文件](https://teamnewpipe.github. - - + +
    LiberapayVisit NewPipe at liberapay.comDonate via LiberapayVisit NewPipe at liberapay.comDonate via Liberapay
    From 73717d444e77ba9417935b9164f97dc543fa2844 Mon Sep 17 00:00:00 2001 From: Bharathan Date: Tue, 27 Oct 2026 00:45:15 +0530 Subject: [PATCH 151/155] Keep fullscreen player controls clear of system gesture area --- .../newpipe/player/ui/MainPlayerUi.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java index 4d85dc950..5a0ef9074 100644 --- a/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java +++ b/app/src/main/java/org/schabi/newpipe/player/ui/MainPlayerUi.java @@ -38,6 +38,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.content.res.AppCompatResources; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.ItemTouchHelper; import androidx.recyclerview.widget.RecyclerView; @@ -185,6 +187,24 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh binding.getRoot().addOnLayoutChangeListener(this); + // fitsSystemWindows only pads the controls by the system bars, but with gesture navigation + // the system reserves a taller area at the bottom for its gestures. In fullscreen, keep + // the controls out of that area, otherwise dragging the seekbar triggers system gestures. + ViewCompat.setOnApplyWindowInsetsListener(binding.playbackControlRoot, + (view, windowInsets) -> { + final WindowInsetsCompat result = + ViewCompat.onApplyWindowInsets(view, windowInsets); + if (isFullscreen) { + final int gestureBottom = windowInsets.getInsets( + WindowInsetsCompat.Type.mandatorySystemGestures()).bottom; + if (gestureBottom > view.getPaddingBottom()) { + view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), + view.getPaddingRight(), gestureBottom); + } + } + return result; + }); + binding.moreOptionsButton.setOnLongClickListener(v -> { player.getFragmentListener() .ifPresent(PlayerServiceEventListener::onMoreOptionsLongClicked); @@ -205,6 +225,8 @@ public final class MainPlayerUi extends VideoPlayerUi implements View.OnLayoutCh context.getContentResolver().unregisterContentObserver(settingsContentObserver); binding.getRoot().removeOnLayoutChangeListener(this); + + ViewCompat.setOnApplyWindowInsetsListener(binding.playbackControlRoot, null); } @Override From ca4089f991a5b0d378a55f6e1d7c5cf2e0b6899f Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Fri, 6 Nov 2026 19:27:19 +0800 Subject: [PATCH 152/155] doc: README.ar: Replace - with * for consistency with base file Signed-off-by: Aayush Gupta --- doc/README.ar.md | 54 ++++++++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/doc/README.ar.md b/doc/README.ar.md index fd80bbc59..c4a51a5f1 100644 --- a/doc/README.ar.md +++ b/doc/README.ar.md @@ -49,11 +49,11 @@ -- YouTube ([موقع إلكتروني](https://www.youtube.com/)) و YouTube Music ([موقع إلكتروني](https://music.youtube.com/)) ([ويكي](https://fr.wikipedia.org/wiki/YouTube)) -- PeerTube ([موقع إلكتروني](https://joinpeertube.org/)) و جميع حالاته (قم بزيارة الموقع لتعرف ماذا يعني ذلك!) ([ويكي](https://fr.wikipedia.org/wiki/PeerTube)) -- Bandcamp ([موقع إلكتروني](https://bandcamp.com/)) ([ويكي](https://fr.wikipedia.org/wiki/Bandcamp)) -- SoundCloud ([موقع إلكتروني](https://soundcloud.com/)) ([ويكي](https://fr.wikipedia.org/wiki/SoundCloud)) -- media.ccc.de ([موقع إلكتروني](https://media.ccc.de/)) ([ويكي](https://fr.wikipedia.org/wiki/Chaos_Computer_Club)) +* YouTube ([موقع إلكتروني](https://www.youtube.com/)) و YouTube Music ([موقع إلكتروني](https://music.youtube.com/)) ([ويكي](https://fr.wikipedia.org/wiki/YouTube)) +* PeerTube ([موقع إلكتروني](https://joinpeertube.org/)) و جميع حالاته (قم بزيارة الموقع لتعرف ماذا يعني ذلك!) ([ويكي](https://fr.wikipedia.org/wiki/PeerTube)) +* Bandcamp ([موقع إلكتروني](https://bandcamp.com/)) ([ويكي](https://fr.wikipedia.org/wiki/Bandcamp)) +* SoundCloud ([موقع إلكتروني](https://soundcloud.com/)) ([ويكي](https://fr.wikipedia.org/wiki/SoundCloud)) +* media.ccc.de ([موقع إلكتروني](https://media.ccc.de/)) ([ويكي](https://fr.wikipedia.org/wiki/Chaos_Computer_Club)) كما يمكنكم ملاحظة، يدعم نيوبايب العديد من خدمات الفيديو والصوت. على الرغم من أن البداية كانت مع يوتيوب، إلا أن أشخاصًا آخرين قاموا بإضافة خدمات جديدة على مر السنين، مما جعل نيوبايب أكثر تنوعًا ومرونة! @@ -69,28 +69,28 @@ ### سمات -- 4K شاهد مقاطع الفيديو بدقة تصل إلى -- الاستماع إلى الصوت في الخلفية، وتحميل دفق الصوت فقط لحفظ البيانات -- الوضع المنبثق (المشغل العائم، المعروف أيضًا باسم Picture-in-Picture) -- مشاهدة البث المباشر -- إظهار/إخفاء الترجمة -- ابحث عن مقاطع فيديو وصوت (على اليوتيوب، يمكنك أيضًا تحديد لغة المحتوى) -- وضع مقاطع الفيديو في قائمة الانتظار (وحفظها اختياريًا كقوائم تشغيل محلية) -- إظهار/إخفاء المعلومات العامة حول مقاطع الفيديو (مثل الوصف والعلامات) -- إظهار/إخفاء مقاطع الفيديو التالية أو ذات الصلة -- إظهار/إخفاء التعليقات -- ابحث عن مقاطع الفيديو والصوت والقنوات وقوائم التشغيل والألبومات -- تصفح مقاطع الفيديو والتسجيلات الصوتية للقناة -- الاشتراك في القنوات (نعم، دون الحاجة إلى تسجيل الدخول إلى حساب!) -- تلقي إشعارات حول مقاطع الفيديو الجديدة من القنوات التي اشتركت فيها. -- إنشاء مجموعات القنوات وتحريرها (لتسهيل الإدارة والتنقل) -- تصفح خلاصات الفيديو التي تم إنشاؤها من مجموعات القنوات الخاصة بك -- عرض وبحث تاريخ العرض الخاص بك -- عرض قوائم التشغيل والبحث فيها (هذه قوائم تشغيل عن بعد، أي أنه يتم سحبها من الخدمة التي تتصفحها) -- إنشاء وتحرير قوائم التشغيل المحلية (يتم إنشاؤها وحفظها داخل التطبيق، وليس لها أي علاقة بأي من الخدمات) -- تنزيل مقاطع الفيديو/الصوت/الترجمات -- العب في كودي -- مشاهدة/حظر المحتوى المقيد بالفئة العمرية +* 4K شاهد مقاطع الفيديو بدقة تصل إلى +* الاستماع إلى الصوت في الخلفية، وتحميل دفق الصوت فقط لحفظ البيانات +* الوضع المنبثق (المشغل العائم، المعروف أيضًا باسم Picture-in-Picture) +* مشاهدة البث المباشر +* إظهار/إخفاء الترجمة +* ابحث عن مقاطع فيديو وصوت (على اليوتيوب، يمكنك أيضًا تحديد لغة المحتوى) +* وضع مقاطع الفيديو في قائمة الانتظار (وحفظها اختياريًا كقوائم تشغيل محلية) +* إظهار/إخفاء المعلومات العامة حول مقاطع الفيديو (مثل الوصف والعلامات) +* إظهار/إخفاء مقاطع الفيديو التالية أو ذات الصلة +* إظهار/إخفاء التعليقات +* ابحث عن مقاطع الفيديو والصوت والقنوات وقوائم التشغيل والألبومات +* تصفح مقاطع الفيديو والتسجيلات الصوتية للقناة +* الاشتراك في القنوات (نعم، دون الحاجة إلى تسجيل الدخول إلى حساب!) +* تلقي إشعارات حول مقاطع الفيديو الجديدة من القنوات التي اشتركت فيها. +* إنشاء مجموعات القنوات وتحريرها (لتسهيل الإدارة والتنقل) +* تصفح خلاصات الفيديو التي تم إنشاؤها من مجموعات القنوات الخاصة بك +* عرض وبحث تاريخ العرض الخاص بك +* عرض قوائم التشغيل والبحث فيها (هذه قوائم تشغيل عن بعد، أي أنه يتم سحبها من الخدمة التي تتصفحها) +* إنشاء وتحرير قوائم التشغيل المحلية (يتم إنشاؤها وحفظها داخل التطبيق، وليس لها أي علاقة بأي من الخدمات) +* تنزيل مقاطع الفيديو/الصوت/الترجمات +* العب في كودي +* مشاهدة/حظر المحتوى المقيد بالفئة العمرية From 9121dc9a2526d0a1bdb84f87afcd23dd431b4cf4 Mon Sep 17 00:00:00 2001 From: Hosted Weblate Date: Sat, 7 Nov 2026 11:54:45 +0100 Subject: [PATCH 153/155] Translated using Weblate (French) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 28.2% (61 of 216 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (216 of 216 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (216 of 216 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (216 of 216 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (216 of 216 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (216 of 216 strings) Translated using Weblate (German) Currently translated at 100.0% (216 of 216 strings) Translated using Weblate (Polish) Currently translated at 100.0% (216 of 216 strings) Translated using Weblate (Polish) Currently translated at 100.0% (216 of 216 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (216 of 216 strings) Translated using Weblate (Korean) Currently translated at 100.0% (97 of 97 strings) Translated using Weblate (French) Currently translated at 100.0% (97 of 97 strings) Translated using Weblate (Polish) Currently translated at 100.0% (97 of 97 strings) Translated using Weblate (Polish) Currently translated at 100.0% (97 of 97 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (97 of 97 strings) Translated using Weblate (German) Currently translated at 100.0% (97 of 97 strings) Translated using Weblate (Azerbaijani) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Chinese (Simplified Han script)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Polish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Turkish) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Ukrainian) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (Korean) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (French) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Translated using Weblate (German) Currently translated at 100.0% (778 of 778 strings) Co-authored-by: Agnieszka C Co-authored-by: C. Rüdinger Co-authored-by: Emin Tufan Çetin Co-authored-by: Femini Co-authored-by: Hosted Weblate Co-authored-by: Hosted Weblate user 54392 Co-authored-by: Igor Rückert Co-authored-by: Mickaël Binos Co-authored-by: Oleh Hishak Co-authored-by: VfBFan Co-authored-by: delvani Co-authored-by: justcontributor Co-authored-by: rehork Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/az/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/pt_BR/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/uk/ Translate-URL: https://hosted.weblate.org/projects/newpipe/compose/zh_Hans/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/de/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/fr/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/ko/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pl/ Translate-URL: https://hosted.weblate.org/projects/newpipe/metadata/pt_BR/ Translation: NewPipe/Metadata Translation: NewPipe/compose --- app/src/main/res/values-az/strings.xml | 6 +- app/src/main/res/values-de/strings.xml | 34 +-- app/src/main/res/values-fr/strings.xml | 4 +- app/src/main/res/values-ko/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 94 ++++----- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-uk/strings.xml | 196 +++++++++--------- app/src/main/res/values-zh-rCN/strings.xml | 56 ++--- .../metadata/android/de/changelogs/1016.txt | 9 + .../metadata/android/fr/changelogs/1016.txt | 6 + .../metadata/android/ko/changelogs/1016.txt | 9 + .../metadata/android/ko/full_description.txt | 2 +- .../metadata/android/pl/changelogs/1016.txt | 9 + .../android/pt-BR/changelogs/1016.txt | 9 + .../composeResources/values-az/strings.xml | 28 +++ .../composeResources/values-de/strings.xml | 28 +++ .../composeResources/values-fr/strings.xml | 1 + .../composeResources/values-pl/strings.xml | 28 +++ .../values-pt-rBR/strings.xml | 60 +++++- .../composeResources/values-uk/strings.xml | 165 ++++++++++++++- .../values-zh-rCN/strings.xml | 28 +++ 22 files changed, 575 insertions(+), 203 deletions(-) create mode 100644 fastlane/metadata/android/de/changelogs/1016.txt create mode 100644 fastlane/metadata/android/fr/changelogs/1016.txt create mode 100644 fastlane/metadata/android/ko/changelogs/1016.txt create mode 100644 fastlane/metadata/android/pl/changelogs/1016.txt create mode 100644 fastlane/metadata/android/pt-BR/changelogs/1016.txt diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index a16c59ae8..b2c7b0bd7 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -173,7 +173,7 @@ Axtarış tarixçəsi silindi Bütün axtarış tarixçəsi silinsin? Açar sözlər axtarışı tarixçəsin silir - Axtarış tarixçəsini sil + Axtarış tarixçəsin təmizlə Oynatma mövqeləri silindi Bütün oynatma mövqeləri silinsin? Bütün oynatma mövqelərini silir @@ -187,7 +187,7 @@ Doldur Uyğunlaşdır Titrlər Yoxdur - Sil + Silin Hələ ki, kanal abunəliyi yoxdur Kanal seç Kanal səhifəsi @@ -803,7 +803,6 @@ HTTP xətası 403 oynadarkən serverdən alındı, ehtimal ki, IP qadağası və ya yayım URL-nin deobfuscation problemləri ilə bağlıdır %1$s sorğuçunun bot olmadığını təsdiqləmək üçün giriş tələb edərək data təmin etməkdən imtina etdi.\n\nIP-niz %1$s tərəfindən müvəqqəti şəkildə qadağan oluna bilər, bir müddət gözləyə və ya başqa IP-yə keçə bilərsiniz (məsələn, VPN-i açıb/qapatmaqla və ya WiFi-dan mobil dataya keçməklə).\n\nDaha çox məlumat üçün xahiş olunur
    bu Tez-tez Verilən Suallar qeydinə baxın. Bu məzmun hazırda seçilən məzmun ölkəsi üçün əlçatan deyil. \n\nSeçiminizi \"Tənzimləmələr > Məzmun > İlkin məzmun ölkəsi\"- dən dəyişin. - Təfərrüatlar Həll olunma @@ -828,4 +827,5 @@ Təəssüf ki, NewPipe Android 5.0 və 5.1 üçün dəstəyi dayandıran bir neçə kitabxanadan asılıdır. Bu səbəbdən, üzücü olaraq növbəti NewPipe buraxılışı yalnız Android 6 və ya daha yüksək versiyalı cihazlarda işləyəcək. Daha çoxunu blog elanında oxu. Podkastlar Kurslar + Google Android tərtibatçı təsdiqlənməsi üzrə yeni tələbin tətbiqinə başlayıb, bu Braziliya, İndoneziya, Sinqapur və Tailandda NewPipe-ın quraşdırılmasını çətinləşdirir; 2027-ci ildə isə sistemin qlobal miqyasda istifadəyə verilməsi planlaşdırılır.\n\nTələblər dəyişdirilməzsə, yaxın gələcəkdə sertifikatlaşdırılmış Android cihazlarında NewPipe quraşdırmaq daha çətin və ya imkansız ola bilər. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 3b3575dcd..d69c36138 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -125,8 +125,8 @@ Neuigkeiten Suchverlauf Suchanfragen lokal speichern - Verlauf ansehen - Wiedergabeverlauf speichern + Wiedergabeverlauf + Angeschaute Videos erfassen Verlauf Verlauf Abonnement konnte nicht geändert werden @@ -216,8 +216,8 @@ Zum Neuordnen ziehen Erstellen Umbenennen - Zuletzt wiedergegeben - Am häufigsten wiedergegeben + Zuletzt abgespielt + Am häufigsten abgespielt Immer fragen Neue Wiedergabeliste Umbenennen @@ -247,8 +247,8 @@ Vorheriger Export Beachte, dass diese Aktion das Netzwerk stark belasten kann. \n \nMöchtest du fortfahren? Bilder-Cache gelöscht - Zwischengespeicherte (Metadaten) löschen - Alle zwischengespeicherten Website-Daten entfernen + Zwischengespeicherte Metadaten löschen + Alle zwischengespeicherten Webseiten-Daten löschen Metadatencache gelöscht Fehlersuche Datei-/Inhaltsquelle existiert nicht @@ -280,12 +280,12 @@ Untertitel Textgröße und Hintergrund der Untertitel im Player anpassen. Erfordert Neustart der App Wiedergabeverlauf löschen - Den Verlauf der wiedergegebenen Streams und die Wiedergabepositionen löschen - Den ganzen Wiedergabeverlauf löschen? + Löscht den Verlauf der abgespielten Streams und die Wiedergabepositionen + Gesamten Wiedergabeverlauf löschen? Wiedergabeverlauf gelöscht Suchverlauf löschen - Den Verlauf der Suchbegriffe löschen - Den gesamten Suchverlauf löschen? + Löscht den Verlauf der Suchbegriffe + Gesamten Suchverlauf löschen? Suchverlauf gelöscht 1 Element gelöscht. NewPipe ist freie Copyleft-Software: Du kannst sie nach Belieben benutzen, untersuchen, mit anderen teilen und verbessern. Insbesondere kannst du sie unter den von der Free Software Foundation veröffentlichten Bedingungen der GNU General Public License, in der Version 3 der Lizenz oder (nach deiner Wahl) jeder späteren Version, weitergeben und/oder verändern. @@ -396,7 +396,7 @@ Systemordnerauswahl verwenden (SAF) Das „Storage Access Framework“ ermöglicht das Herunterladen auf eine externe SD-Karte Wiedergabepositionen löschen - Alle Wiedergabepositionen löschen + Löscht alle Wiedergabepositionen Alle Wiedergabepositionen löschen? Dienst umschalten, aktuell ausgewählt: Standard-Kiosk @@ -484,9 +484,9 @@ Dieser Inhalt wird von NewPipe noch nicht unterstützt. \n \nEr wird hoffentlich in einer zukünftigen Version unterstützt. Dieses Video ist altersbeschränkt. \n \nAktiviere in den Einstellungen „%1$s“, falls du diese sehen möchtest. Streams, die vor und nach dem Hinzufügen zur Wiedergabeliste angeschaut wurden, werden entfernt. \nBist du sicher? - Teilweise angesehene Streams entfernen - Gesehene entfernen - Gesehene Streams entfernen? + Teilweise angeschaute Streams entfernen + Angeschaute entfernen + Angeschaute Streams entfernen? Originalzeit vor Elementen anzeigen Originaltexte von Diensten werden in Stream-Elementen sichtbar sein YouTubes „Eingeschränkten Modus“ aktivieren @@ -593,7 +593,7 @@ An Tablet-Modus Aus - Als gesehen markieren + Als angeschaut markieren Vom Ersteller mit Herz versehen Entfernte Suchvorschläge Lokale Suchvorschläge @@ -625,7 +625,7 @@ Eine Fehlermeldung erstellen Fehler-Kurzmeldung anzeigen Für diese Aktion wurde kein geeigneter Dateimanager gefunden.\nBitte installiere einen Dateimanager oder versuche, \'%s\' in den Downloadeinstellungen zu deaktivieren - Für diese Aktion wurde kein geeigneter Dateimanager gefunden.\nBitte installiere einen Storage Access Framework kompatiblen Dateimanager + Für diese Aktion wurde kein geeigneter Dateimanager gefunden.\nBitte installiere einen mit dem Storage Access Framework kompatiblen Dateimanager Angehefteter Kommentar LeakCanary ist nicht verfügbar ExoPlayer-Standard @@ -803,7 +803,6 @@ HTTP-Fehler 403 vom Server während der Wiedergabe erhalten, wahrscheinlich verursacht durch eine IP-Sperre oder Probleme beim Entschlüsseln der Streaming-URL %1$s hat die Datenbereitstellung verweigert und verlangt eine Anmeldung, um zu bestätigen, dass es sich bei dem Anfragenden nicht um einen Bot handelt.\n\nDeine IP-Adresse wurde möglicherweise vorübergehend von %1$s gesperrt. Du kannst einige Zeit warten oder zu einer anderen IP-Adresse wechseln (z. B. durch Ein- und Ausschalten eines VPNs oder durch Wechseln von WLAN zu mobilen Daten).\n\nWeitere Informationen findest du unter diesem FAQ-Eintrag. Dieser Inhalt ist für das aktuell ausgewählte Land des Inhalts nicht verfügbar.\n\nÄndere die Auswahl unter „Einstellungen > Inhalt > Bevorzugtes Land des Inhalts“. - Details Lösung @@ -828,4 +827,5 @@ Leider ist NewPipe auf einige Bibliotheken angewiesen, welche die Unterstützung für Android 5.0 und 5.1 eingestellt haben. Die nächste Version von NewPipe wird daher leider nur auf Geräten mit Android 6 oder höher funktionieren. Mehr dazu im Blogbeitrag. Podcasts Kurse + Google hat damit begonnen, eine neue Anforderung zur Entwicklerverifizierung für Android durchzusetzen, die die Installation von NewPipe in Brasilien, Indonesien, Singapur und Thailand erschwert; eine weltweite Einführung ist für 2027 geplant.\n\nSofern die Anforderungen nicht geändert werden, könnte es in naher Zukunft schwieriger oder gar unmöglich werden, NewPipe auf zertifizierten Android-Geräten zu installieren. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index dc131fcfc..266e3e4b3 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -282,7 +282,7 @@ Ton Effacer 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 ? + Supprimer tout l\'historique de mes favoris ? Historique des vues supprimé Supprimer l’historique de recherche Supprime l’historique des mots-clés de recherche @@ -819,7 +819,6 @@ Erreur HTTP 403 reçue du serveur pendant la lecture, probablement causée par un bannissement d\'IP ou des problèmes de désobfuscation de l\'URL de streaming %1$s a refusé de fournir des données et a demandé un identifiant pour confirmer que l\'auteur de la requête n\'est pas un robot.\n\nVotre adresse IP a peut-être été temporairement bloquée par %1$s. Vous pouvez patienter ou essayer une autre adresse IP (par exemple, en activant/désactivant un VPN ou en passant du Wi-Fi aux données mobiles).\n\nPour plus d\'informations, veuillez consulter cette FAQ. Ce contenu n\'est pas disponible pour le pays actuellement sélectionné.\n\nModifiez votre sélection dans « Paramètres > Contenu > Pays par défaut ». - Détails Solution @@ -847,4 +846,5 @@ Article de blog Podcasts Cours + Google a commencé à appliquer une nouvelle exigence de vérification des développeurs Android qui rend l\'installation de NewPipe plus difficile au Brésil, en Indonésie, à Singapour et en Thaïlande, un déploiement mondial étant prévu pour 2027.\n\nÀ moins d\'un changement de ces exigences, l\'installation de NewPipe pourrait devenir plus difficile, voire impossible, sur les appareils Android certifiés dans un avenir proche. diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 1fba37c10..ac133372c 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -789,7 +789,6 @@ 재생 중 서버에서 HTTP 403 오류를 수신했으며, 스트리밍 URL 역난독화 문제나 IP 차단 때문일 수 있습니다 %1$s에서 데이터 제공을 거부하고, 요청자가 봇이 아닌지 확인하기 위해 로그인을 요청하고 있습니다.\n\n아마 IP가 %1$s에서 임시 차단되었을 것이며, 잠시 기다리거나 다른 IP로 전환할 수 있습니다 (예를 들어 VPN을 켜/끄거나, WiFi를 모바일 데이터로 바꿔 보세요).\n\n자세한 정보는 여기 FAQ를 확인하세요. 이 콘텐츠는 현재 선택한 콘텐츠 지역에서 이용할 수 없습니다.\n\n\"설정 > 콘텐츠 > 기본 콘텐츠 국가\"에서 지역을 바꾸세요. - 자세히 해결책 @@ -811,4 +810,5 @@ 블로그 게시글 팟캐스트 강의 + Google은 브라질, 인도네시아, 싱가포르, 태국에서 NewPipe 설치를 더욱 어렵게 만드는 새로운 Android 개발자 인증 요구사항을 강요하기 시작했으며, 2027년에는 전 세계로 확대할 계획입니다.\n\n요구사항이 바뀌지 않는 한, 조만간 NewPipe를 인증된 Android 기기에 설치하는 것이 더 어려워지거나 불가능해질 수 있습니다. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index cbc21f3eb..d9ac3d1f8 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -831,7 +831,6 @@ Podczas odtwarzania otrzymano od serwera błąd HTTP 403, prawdopodobnie spowodowany blokadą adresu IP lub problemami z odszyfrowaniem adresu URL strumienia. %1$s odmówił dostarczenia danych, prosząc o zalogowanie się w celu potwierdzenia, że nie jest się botem.\n\nTwoje IP mogło zostać tymczasowo zablokowane przez %1$s. Możesz chwilę poczekać lub zmienić adres IP (na przykład włączając/wyłączając VPN lub przełączając się z sieci Wi-Fi na dane komórkowe).\n\nZobacz ten wpis w FAQ, aby uzyskać więcej informacji. Ta treść nie jest dostępna dla aktualnie wybranego kraju treści.\n\nZmień swój wybór w „Ustawienia > Zawartość > Domyślny kraj treści”. - Szczegóły Rozwiązanie @@ -862,4 +861,5 @@ Wpis na blogu Podcasty Kursy + Google zaczęło wymuszać nowy wymóg weryfikacji programistów androidowych, co utrudnia instalację NewPipe w Brazylii, Indonezji, Singapurze i Tajlandii, a jego globalne wdrożenie jest planowane na 2027 r.\n\nJeśli wymóg ten nie ulegnie zmianie, NewPipe może stać się trudniejszy lub niemożliwy do instalowania na certyfikowanych urządzeniach z Androidem w najbliższej przyszłości. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index eb45d822c..f55451670 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -63,20 +63,20 @@ Reproduzir vídeo, duração: Foto de perfil do autor Escolha a pasta de download para arquivos de áudio - Áudios baixados são salvos aqui - Pasta para áudios baixados + Os arquivos de áudio baixados são salvos aqui + Pasta de download de áudios Escolha a pasta de download para arquivos de vídeo - Vídeos baixados são salvos aqui - Pasta para vídeos baixados + Os arquivos de vídeo baixados são salvos aqui + Pasta de download de vídeos Instalar Kore? Toque no ícone de lupa para iniciar sua busca. Processos - Por favor, defina uma pasta de download depois nas configurações + Defina uma pasta de download depois nas configurações O player de video não foi encontrado, mas você pode instalar o VLC. Deseja fazer isso? O site não pôde ser analisado Áudio Reproduzir no Kodi - Pesquisar + Buscar Exibir uma opção para reproduzir um vídeo através do centro de mídia Kodi Usar reprodutor de áudio externo Usar player de vídeo externo @@ -112,11 +112,11 @@ © %1$s %2$s protegido pela licença %3$s Sobre o NewPipe Download - Caracteres permitidos em nome de arquivos - Os caracteres inválidos são substituídos por este valor + Caracteres permitidos em nomes de arquivos + Caracteres inválidos são substituídos por este valor Caractere de substituição Letras e dígitos - Caracteres especiais + Caracteres mais especiais Inscrever-se Inscrito Inscrição cancelada @@ -126,10 +126,10 @@ Novidades Retomar reprodução Continuar reproduzindo após interrupções (por exemplo, ligações) - Histórico de busca - Armazena o histórico de busca localmente + Histórico de buscas + Armazenar consultas de buscas localmente Histórico de reprodução - Mantenha o controle dos vídeos assistidos + Acompanhe os vídeos assistidos Histórico Histórico Notificação do NewPipe @@ -265,9 +265,9 @@ seuID, soundcloud.com/seuid Tenha em mente que esta operação poderá consumir muitos dados. \n \nVocê deseja continuar? Cache de imagens removidos - Remover metadados em cache - Remover todos os dados da página web armazenados em cache - Cache de metadados removidos + Limpar metadados em cache + Remova todos os dados de páginas da web em cache + Cache de metadados apagado Controles para velocidade de reprodução Velocidade Afinação @@ -279,14 +279,14 @@ Fechar gaveta Legendas Modifique a escala do texto da legenda do player e os estilos de fundo. Requer reinicialização do aplicativo para entrar em vigor - Remover histórico de reprodução - Remove o histórico de vídeos assistidos e as posições de reprodução - Remover todo o histórico de reprodução? - Histórico de reprodução removido - Remover histórico de buscas - Remove o histórico de buscas - Remover todo o histórico de buscas? - Histórico de busca removido + Limpar histórico de exibição + Exclui o histórico de reprodução e as posições de reprodução + Excluir todo o histórico de exibição? + Histórico de exibição excluído + Limpar histórico de buscas + Exclui o histórico de palavras buscada + Excluir todo o histórico de buscas? + Histórico de buscas excluído 1 item excluído. NewPipe é um software copyleft libre: você pode usá-lo, estudá-lo, compartilhá-lo e melhorá-lo à vontade. Especificamente, você pode redistribuí-lo e/ou modificá-lo sob os termos da Licença Pública Geral GNU conforme publicada pela Free Software Foundation, seja a versão 3 da Licença ou (a seu critério) qualquer versão posterior. Você também quer importar as configurações? @@ -319,7 +319,7 @@ Notificação de atualização do aplicativo Notificações para novas versões do NewPipe Armazenamento externo indisponível - Não é possível baixar para o cartão SD externo. Redefinir o local da pasta de download? + Não é possível fazer download para um cartão SD externo. Redefinir o local da pasta de download? Não foi possível carregar as guias salvas, portanto, usamos as guias padrão Restaurar configurações Deseja restaurar os padrões? @@ -355,10 +355,10 @@ Não encontrado Falha no pós-processamento Parar - Número máximo de tentativas + Máximo de tentativas Número máximo de tentativas antes de cancelar o download - Interromper quando estiver usando dados móveis - Útil ao mudar para dados móveis, mas alguns downloads podem não ser suspensos + Interromper em redes limitadas + Útil ao mudar para dados móveis, embora alguns downloads não possam ser suspensos Pendente Mostrar comentários Desative para ocultar comentários @@ -366,12 +366,12 @@ Sem comentários Não foi possível carregar os comentários Fechar - Continuar reprodução + Retomar reprodução Restaurar a última posição de reprodução Posições em listas - Mostra os indicadores de posição de reprodução em listas - Remover dados - Posições de reprodução removidas + Mostrar indicadores de posição de reprodução em listas + Limpar dados + Posições de reprodução excluídas Arquivo movido ou excluído Já existe um arquivo com este nome O arquivo não pode ser sobrescrito @@ -381,17 +381,17 @@ O progresso foi perdido pois o arquivo foi excluído Tempo limite de conexão Excluir todo o histórico de downloads ou excluir todos os arquivos baixados? - Limitar fila de downloads - Permitir apenas um download de cada vez + Limitar fila de download + Um download será executado ao mesmo tempo Iniciar downloads Pausar downloads - Perguntar onde salvar o arquivo - Você será questionado onde salvar cada download. \nAtive o seletor de pasta do sistema (SAF) se você quiser baixar em um cartão SD externo - Usar o seletor de pastas do sistema (SAF) - A \"Estrutura de acesso ao armazenamento\" permite baixar em um cartão SD externo - Remover posições de reprodução - Remove todas as posições de reprodução - Remover todas as posições de reprodução? + Perguntar onde baixar + Você será perguntado onde salvar cada download.\nAtive o seletor de pastas do sistema (SAF) se desejar fazer download para um cartão SD externo + Usar seletor de pastas do sistema (SAF) + O \'Storage Access Framework\' permite downloads para um cartão SD externo + Excluir posições de reprodução + Exclui todas as posições de reprodução + Excluir todas as posições de reprodução? Alternar serviço, atualmente selecionado: Kiosk padrão Ninguém está assistindo @@ -527,9 +527,9 @@ Mostrar vazamentos de memória Na fila Enfileirar - Remove os cookies que o NewPipe armazena quando você resolve um reCAPTCHA - Remover cookies de reCAPTCHA - Os cookies de reCAPTCHA foram removidos + Apague os cookies que o NewPipe armazena quando você resolve um reCAPTCHA + Apagar os cookies do reCAPTCHA + Os cookies do reCAPTCHA foram apagados O YouTube oferece um \"Modo Restrito\" que oculta conteúdo potencialmente adulto Mostra conteúdo possivelmente inadequado para crianças pois tem restrição de idade (como +18) Permite que o Android personalize a cor da notificação de acordo com a cor principal da miniatura (isso não está disponível em todos os dispositivos) @@ -549,7 +549,7 @@ Desative para ocultar a descrição do vídeo e informações adicionais Mostrar descrição Reproduzir com - Nenhum aplicativo em seu dispositivo pode abrir isso + Nenhum aplicativo no seu dispositivo pode abrir isto Travar o aplicativo Este conteúdo está disponível apenas para usuários que pagaram, portanto não pode ser transmitido ou baixado pelo NewPipe. Este vídeo está disponível apenas para assinantes do YouTube Music Premium, portanto não pode ser transmitido ou baixado pelo NewPipe. @@ -589,8 +589,8 @@ A conta do autor foi encerrada. \nNewPipe não poderá carregar este feed no futuro. \nDeseja cancelar a inscrição neste canal? Não foi possível carregar o feed para \'%s\'. Erro ao carregar o feed - A \"Estrutura de acesso ao armazenamento\" é compatível apenas com versões a partir do Android 10 - Você será questionado onde salvar cada download + A partir do Android 10, apenas o \'Storage Access Framework\' é compatível + Você será perguntado onde salvar cada download Nenhuma pasta de download definida ainda, escolha a pasta de download padrão agora Não Sim @@ -817,7 +817,6 @@ Erro HTTP 403 recebido do servidor durante a reprodução, provavelmente causado por um banimento de IP ou problemas de desofuscação de URL de streaming %1$s se recusou a fornecer dados, solicitando um login para confirmar que o solicitante não é um bot.\n\nSeu IP pode ter sido temporariamente banido por %1$s. Você pode esperar um pouco ou mudar para um IP diferente (por exemplo, ativando/desativando uma VPN ou alternando de Wi-Fi para dados móveis).\n\nConfira este artigo do FAQ para mais informações. Este conteúdo não está disponível para o país selecionado atualmente.\n\nAltere sua seleção acessando “Configurações > Conteúdo > País padrão do conteúdo”. - Detalhes Solução @@ -845,4 +844,5 @@ Postagem no blog Podcasts Cursos + O Google começou a aplicar uma nova exigência de verificação para desenvolvedores Android, o que torna difícil a instalação do NewPipe no Brasil, na Indonésia, em Singapura e na Tailândia — com uma implementação global prevista para 2027.\n\nA menos que essas exigências sejam alteradas, o NewPipe poderá se tornar difícil ou até impossível de instalar em dispositivos Android certificados em um futuro próximo. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 4deb26d91..0f486b462 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -803,7 +803,6 @@ Oynatırken sunucudan HTTP 403 hatası alındı, IP engeli ya da akış URL’si çözme sorunları olabilir %1$s veri sağlamıyor, istekçinin robot olmadığını doğrulaması için oturum açmasını istiyor.\n\n%1$s, IP adresinizi geçici olarak engellemiş olabilir, bir süre bekleyebilir ya da başka IP\'ye geçebilirsiniz (örneğin VPN\'i açıp/kapatarak ya da WiFi\'den mobil veriye geçerek).\n\nDaha çok bilgi için bu SSS girdisine bakın. Bu içerik şu anda seçili içerik ülkesinde kullanılamıyor.\n\nSeçiminizi \"Ayarlar > İçerik > Öntanımlı içerik ülkesi\"nden değiştirin. - Ayrıntılar Çözüm @@ -828,4 +827,5 @@ Blog gönderisi Podcastler Dersler + Google; Brezilya, Endonezya, Singapur ve Tayland\'da NewPipe\'ın kurulumunu zorlaştıran yeni Android geliştirici doğrulama koşulunu uygulamaya başladı; küresel çapta yaygınlaştırma ise 2027\'de planlanıyor.\n\nKoşullar değişmezse NewPipe\'ın sertifikalı Android aygıtlara kurulumu yakın gelecekte daha da zorlaşabilir ya da olanaksızlaşabilir. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index e4af9bdb0..c720242b9 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -11,21 +11,21 @@ Налаштування Ви мали на увазі: «%1$s»? Поширити через - Зовнішній відеопрогравач - Зовнішній аудіопрогравач - Тека для завантаження відео + Використовувати зовнішній відеопрогравач + Використовувати зовнішній аудіопрогравач + Папка завантаження відео Виберіть теку для завантаження відеофайлів Виберіть теку для завантаження аудіофайлів - Шлях до теки із завантаженими відео - Тека для завантаження аудіо + Завантажені відеофайли зберігаються тут + Папка завантаження аудіо Завантажені аудіофайли зберігаються тут - Типова роздільність + Типова роздільна здатність Програти в Kodi Установити відсутній застосунок Kore? Показати опцію «Відтворити у Kodi» - Показати опцію відтворення відео в Kodi + Показувати параметр відтворення відео через медіацентр Kodi Аудіо - Типовий формат звуку + Типовий формат аудіо Тема Темна Світла @@ -48,7 +48,7 @@ Перепрошуємо, цього не мало статися. Надіслати звіт е-поштою Вибачте, щось пішло не так. - Звіт + Повідомити Інформація: Що сталося: Торкніться лупи, щоб розпочати. @@ -69,7 +69,7 @@ Пауза Видалити Контрольна сума - Гаразд + ОК Назва файлу Потоки Помилка @@ -77,10 +77,10 @@ Деталі Зачекайте… Скопійовано до буфера обміну - Вкажіть теку для завантажень пізніше в налаштуваннях + Укажіть папку завантаження пізніше в налаштуваннях Програвач потокового відео не знайдений (ви можете встановити VLC для програвання). Відкрити у віконному режимі - Прибирає звук за певної роздільності + Вилучає звук у деяких роздільних здатностях Підписатися Ви підписалися Ви відписалися від каналу @@ -90,25 +90,25 @@ Новинки У фоні У вікні - Типова роздільність вікна - Не всі пристрої можуть відтворювати 2K/4K-відео - Показувати вищі роздільності + Типова роздільна здатність спливного вікна + Лише деякі пристрої можуть відтворювати відео 2K/4K + Показувати вищі роздільні здатності Типовий формат відео - Памʼятати властивості вікна - Памʼятати останній розмір і позицію вікна + Запам’ятовувати параметри спливного вікна + Запам’ятовувати останній розмір і розташування спливного вікна Пошукові пропозиції Виберіть які пропозиції показувати під час пошуку - Історія пошуків + Історія пошуку Зберігати пошукові запити локально - Продовжувати перегляд - Відновлювати останню позицію + Продовжувати відтворення + Відновлювати останню позицію відтворення Позиції у списках - Показувати індикатори позицій переглядів у списках - Очистити дані - Вести облік перегляду відеозаписів + Показувати індикатори позиції відтворення у списках + Очищення даних + Відстежувати переглянуті відео Історія переглядів Відновлювати відтворення - Продовжувати відтворення після переривань (напр. телефонних дзвінків) + Продовжувати відтворення після перерв (наприклад, телефонних дзвінків) Показати підказку «Затисніть, щоб додати» Типова країна вмісту Програвач @@ -116,7 +116,7 @@ Історія та кеш Відтворення у віконному режимі Очистити - Найкраща роздільність + Найкраща роздільна здатність Скасувати Відтворити все Завжди @@ -139,10 +139,10 @@ Немає відео Цей дозвіл потрібен для перегляду \nу віконному режимі Завантажити - Допустимі символи в назвах файлів - Недопустимі символи замінюватимуться цим значенням - Замінні символи - Букви та цифри + Дозволені символи в назвах файлів + Недійсні символи замінюються цим значенням + Символ заміни + Літери та цифри Більшість спеціальних символів Про NewPipe Ліцензії @@ -158,8 +158,8 @@ Подробиці Налаштування аудіо Відеопрогравач - Тильний програвач - Віконний програвач + Фоновий програвач + Спливний програвач Отримання інформації… Завантаження запитаного контенту Завантажити потоковий файл @@ -232,11 +232,11 @@ Почати відтворення у вікні Відкрити бічну панель Закрити бічну панель - Завжди питати + Завжди запитувати Нова добірка Перейменувати Назва - Додати в добірку + Додати до списку відтворення Призначити ескізом добірки Додати добірку до закладок Видалити закладку @@ -249,15 +249,15 @@ Заповнити Збільшити Створені автоматично - Моніторинг втрат пам\'яті може призвести до нереагування застосунку під час запису дампу - Звітувати про помилки життєвого циклу застосунку - Примусове звітування про неможливість доставлення Rx-винятків, які відбуваються за межами фрагменту або діяльності життєвого циклу після усунення - Швидкий неточний пошук - Швидше, але не точне перемотування. Перехід на 5, 15 або 25 секунд не працюватиме - Автододавання в чергу наступної трансляції - Продовжити при завершені (не повторюваної) черги, додавши повʼязаний запис + Моніторинг витоків пам’яті може призвести до того, що застосунок перестане відповідати під час створення дампа пам\'⁸яті + Повідомляти про помилки поза життєвим циклом + Примусово повідомляти про помилки Rx + Використовувати швидке неточне перемотування + Неточне перемотування дає змогу швидше переходити до потрібної позиції, але з меншою точністю. Перемотування на 5, 15 або 25 секунд із цим параметром не працює + Автододавати наступний потік до черги + Продовжувати чергу відтворення, що закінчується (без повтору), додаванням пов’язаного потоку Файл - Такої теки не існує + Немає такої папки Такого джерела файлу/вмісту не існує Файл не існує або відсутній дозвіл на його читання або запис Назва файлу не може бути порожньою @@ -276,20 +276,20 @@ вашID, soundcloud.com/yourid Майте на увазі: ця операція може потребувати багато трафіку. \n \nБажаєте продовжити? Кеш зображень стерто - Стерти кеш метаданих + Очистити кеш метаданих Видалити всі кешовані дані вебсторінок - Кеш метаданих стерто + Кеш метаданих очищено Керування швидкістю відтворення Темп Тон Від\'єднати (може спричинити спотворення) Відсутні потоки, доступні для завантаження - Бажана дія під час відкривання + Бажана дія «відкрити» Типова дія під час відкриття вмісту — %s Субтитри Змінити масштаб тексту субтитрів програвача та стилі тла. Потрібен перезапуск, щоб застосувати зміни Очистити історію переглядів - Видаляє історію відтворень і позицій відтворення + Видаляє історію відтворених потоків і позиції відтворення Видалити всю історію переглядів? Історію переглядів видалено Очистити історію пошуку @@ -300,21 +300,21 @@ NewPipe — це copyleft libre програмне забезпечення: ви можете вільно використовувати, вивчати, поширювати та вдосконалювати його. Зокрема, ви можете розповсюджувати та/або змінювати його на умовах GNU General Public License, опублікованої Free Software Foundation, версії 3 або (на ваш вибір) будь-якої пізнішої версії. Імпортувати разом з налаштуваннями? Політика конфіденційності NewPipe - Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає жодних даних без вашої згоди. \nПолітика приватності NewPipe докладно описує, які дані надсилаються і зберігаються у звіті про збій. + Проєкт NewPipe дуже серйозно ставиться до вашої конфіденційності. Тому застосунок не збирає жодних даних без вашої згоди.\nУ політиці конфіденційності NewPipe докладно пояснюється, які дані надсилаються та зберігаються під час надсилання звіту про збій. Ознайомитися з політикою конфіденційності З метою дотримання Загального регламенту про захист даних ЄС (General Data Protection Regulation, GDPR) ми звертаємо вашу увагу на політику приватності NewPipe. Будь ласка, прочитайте уважно. \nВи маєте прийняти її, аби надіслати нам звіт про помилку. Прийняти Відхилити Без обмежень - Обмежити роздільність під час мобільних даних + Обмежувати роздільну здатність під час використання мобільних даних Пропускати тихі проміжки Крок Скинути - Зменшити при перемиканні застосунку + Згортати під час перемикання застосунку Дія при перемиканні до інших застосунків з основного відеопрогравача — %s - Нічого - Згорнути у фоновий програвач - Зменшити до програвача у вікні + Немає + Згортати до фонового програвача + Згортати до спливного програвача Канали Добірки Треки @@ -361,10 +361,10 @@ Не знайдено Невдала пост-обробка Зупинити - Максимум спроб - Найбільша кількість спроб перед скасуванням завантаження - Переривати завантаження на небезлімітних з\'єднаннях - Завантаження до зовнішньої SD-карти неможливе. Скинути розташування теки для завантажень? + Максимальна кількість повторних спроб + Максимальна кількість спроб перед скасуванням завантаження + Переривати в мережах із лімітованим трафіком + Завантаження на зовнішню SD-картку неможливе. Скинути розташування папки завантаження? Помилка зчитування збережених вкладок. Використовуються типові вкладки Вкладки, показані на головній сторінці Показувати сповіщення з пропозицією оновити застосунок за наявності нової версії @@ -385,13 +385,13 @@ Час очікування з\'єднання вичерпано Очистити історію завантажень чи завантажені файли? Обмежити чергу завантажень - Одночасно виконувати лише одне завантаження + Одночасно виконуватиметься лише одне завантаження Почати завантаження Призупинити завантаження Запитувати, куди завантажувати - Вас питатиме, куди зберігати кожне завантаження. \nУвімкніть системний вибір теки (SAF), якщо бажаєте завантажувати на зовнішню SD-картку - Використовувати системний вибір теки (SAF) - Фреймворк доступу до сховища (SAF) дозволяє завантажувати на зовнішню SD-картку + Вам буде запропоновано вибрати місце для збереження кожного завантаження.\nУвімкніть системний вибір папки (SAF), якщо хочете завантажувати файли на зовнішню SD-карту. + Використовувати системний вибір папки (SAF) + «Storage Access Framework» дає змогу завантажувати на зовнішню SD-картку Видалити позиції відтворення Видаляє всі позиції відтворення Видалити всі позиції відтворення? @@ -411,7 +411,7 @@ %s слухачів %s слухачів - Швидке перемотування + Тривалість перемотування вперед/назад Екземпляри PeerTube Виберіть сервер PeerTube Каталог серверів: %s @@ -499,7 +499,7 @@ Пісні Це відео з віковим обмеженням. \n \nЩоб побачити його ввімкніть «%1$s» в налаштуваннях. Ескіз аватара каналу - Оригінальні тексти сервісів будуть видимі в потокових елементах + Оригінальні тексти від сервісів буде видно в елементах потоків Увімкнути \"Обмежений режим\" YouTube Результати для: %s Створено %s @@ -526,7 +526,7 @@ Автоматична (тема пристрою) Радіо Цей вміст недоступний у вашій країні. - На вашому пристрої нема програми, щоб відкрити це + Жоден застосунок на вашому пристрої не може це відкрити YouTube надає «Обмежений режим», що ховає потенційно дорослий вміст Розділи Останні @@ -534,7 +534,7 @@ Ніколи Лише через Wi-Fi Починати відтворення автоматично — %s - Показувати витоки памʼяті + Показувати витоки пам’яті Показати деталі каналу Відтворити чергу Опис @@ -554,15 +554,15 @@ Цей вміст доступний лише користувачам, які заплатили, тому його не можна передавати потоково або завантажувати через NewPipe. Ви можете вибрати улюблену нічну тему нижче Рекомендовані - Збій застосунку - Початковий час оприлюднення + Аварійно завершити застосунок + Показувати минулий час на елементах Додано у чергу - Додати у чергу + Додати до черги Розв\'язати Обчислення хешу - Очистити збережені під час вирішення reCAPTCHA реп\'яшки (cookies) - Реп\'яшки (cookies) reCAPTCHA видалено - Очистити реп\'яшки (cookies) reCAPTCHA + Очищає файли cookie, які NewPipe зберігає, коли ви розв’язуєте reCAPTCHA + Файли cookie reCAPTCHA очищено + Очистити файли cookie reCAPTCHA Сповіщення про перебіг відеогешування Сповіщення про відеохешування Це відео має вікові обмеження. \nЗгідно з новою політикою YouTube щодо відео з віковими обмеженнями NewPipe не може мати доступ до жодного потоку цього відео і, таким чином, не має можливості відтворити його. @@ -570,17 +570,17 @@ Вимкніть, щоб приховати поля метаданих (автор потоку, вміст потоку або пошуковий запит) Вимкніть, щоб приховати опис відео та додаткові відомості Черга активного програвача буде замінена - Перехід від одного програвача до іншого може замінити вашу чергу - Підтверджувати очищення черги + Перемикання з одного програвача на інший може замінити вашу чергу + Запитувати підтвердження перед очищенням черги Кольорувати повідомлення основним кольором мініатюри. Підтримується не всіма пристроями Кольорове сповіщення У компактному сповіщенні є не більше трьох дій! Відредагуйте кожну дію сповіщення, натиснувши на неї. Виберіть до трьох з них, які будуть показані в компактному сповіщенні, за допомогою прапорців праворуч. Обрізати мініатюру відео показувану в сповіщенні з пропорцій 16: 9 до 1:1 - Вимкнення тунелювання медіаданих за наявності чорного екрана або гальмування під час відтворення відео. - Вимкнути тунелювання медіа - Починаючи з Android 10, підтримується тільки \"Storage Access Framework\" - Вас питатиме, куди зберігати кожне завантаження + Вимкніть медіатунелювання, якщо під час відтворення відео з’являється чорний екран або підвисання. + Вимкнути медіатунелювання + Починаючи з Android 10 підтримується лише «Storage Access Framework» + Вам пропонуватимуть вибрати, куди зберігати кожне завантаження Не вказано теки завантаження, оберіть типову теку завантаження зараз Відкрити вебсайт Внутрішнє @@ -608,9 +608,9 @@ Режим швидкої підписки не надає багато інформації щодо цього. Коментарі вимкнено Не показувати - Низька якість (менше) - Висока якість (більше) - Мініатюра з попереднім переглядом на повзунку поступу + Низька якість (менший розмір) + Висока якість (більший розмір) + Попередній перегляд мініатюр на шкалі часу Вподобано автором Позначити переглянутим Віддалені пропозиції пошуку @@ -628,8 +628,8 @@ %s завантажень завершено Проведіть пальцем по елементах, щоб вилучити їх - Не запускати відео в мініпрогравачі, а перемикати в повноекранний режим безпосередньо, якщо автообертання заблоковано. Ви все одно можете отримати доступ до мініпрогравача, вийшовши з повноекранного режиму - Запустити основний програвач у повноекранному режимі + Не запускати відео в мініпрогравачі, а одразу переходити в повноекранний режим, якщо автоповорот заблоковано. Мініпрогравач усе одно можна відкрити, вийшовши з повноекранного режиму + Запускати основний програвач на весь екран Заплановано наступним Запланувати наступним Обробка… Трохи заждіть @@ -638,7 +638,7 @@ Перевірка оновлень… Нові записи стрічки Показати \"Збій програвача\" - Показує параметр збою під час використання програвача + Показує пункт аварійного завершення під час користування програвачем Збій програвача Сповіщення про звіт про помилку Сповіщення для звітів про помилки @@ -646,11 +646,11 @@ Сталася помилка. Перегляньте сповіщення Для цієї дії не знайдено відповідного файлового менеджера. \nУстановіть файловий менеджер або спробуйте вимкнути «%s» у налаштуваннях завантажень Для цієї дії не знайдено відповідного файлового менеджера. \nУстановіть файловий менеджер, сумісний зі Storage Access Framework - Показати панель помилок + Показати сроаіщення із помилкою Створити сповіщення про помилку Закріплений коментар LeakCanary недоступний - Типовий ExoPlayer + Типове значення ExoPlayer Ви підписалися на цей канал , Сповіщення про нові трансляції для підписок @@ -661,7 +661,7 @@ %s нових трансляцій Завантаження відомостей про трансляцію… - Запустити виявлення нових трансляцій + Запустити перевірку нових потоків Сповіщати про нові трансляції з підписок Сповіщення вимкнено Будь-яка мережа @@ -683,7 +683,7 @@ Вибрана трансляція не підтримується зовнішніми програвачами Виберіть якість для зовнішніх програвачів Невідома якість - Розмір інтервалу завантаження відтворення + Розмір інтервалу завантаження під час відтворення Переглянути на сайті Поширені запитання Якщо у вас виникають труднощі з використанням застосунку, обов’язково перегляньте відповіді на поширені запитання! @@ -699,7 +699,7 @@ Дублікат додано %d раз(ів) У виділених сірим кольором добірках цей елемент уже є. Ігнорувати події апаратних медіакнопок - Корисно, наприклад, якщо ви використовуєте гарнітуру зі зламаними фізичними кнопками + Корисно, наприклад, якщо ви використовуєте гарнітуру з несправними фізичними кнопками Вилучити дублікати Вилучити дублікати? Бажаєте вилучити всі повторювані трансляції в цій добірці? @@ -709,35 +709,35 @@ Повністю переглянуто Частково переглянуто Яскравість - Нічого - Дія жестом ліворуч + Немає + Дія лівого жесту Виберіть жест для лівої половини екрана програвача Виберіть жест для правої половини екрана програвача - Дія жесту праворуч + Дія правого жесту Гучність Змінити розмір інтервалу завантаження прогресивного вмісту (наразі %s). Нижче значення може прискорити його початкове завантаження Надавати перевагу оригінальному аудіо - Вибирати оригінальну звукову доріжку незалежно від мови + Вибирати оригінальну аудіодоріжку незалежно від мови Надавати перевагу описовому аудіо - Вибирати звукову доріжку з описом для людей із вадами зору, якщо вона є + Вибирати за наявності аудіодоріжку з описами для людей із порушеннями зору Аудіо: %s Звукова доріжка Вибір звукової доріжки для зовнішніх програвачів Невідомо Налаштування ExoPlayer - Керування деякими налаштуваннями ExoPlayer. Щоб ці зміни набули чинності, потрібно перезапустити програвач - Використовувати запасну функцію декодера ExoPlayer - Завжди використовувати обхідний шлях налаштування поверхні відеовиходу ExoPlayer + Керування деякими налаштуваннями ExoPlayer. Щоб зміни набули чинності, потрібно перезапустити програвач + Використовувати резервний декодер ExoPlayer + Завжди використовувати обхідний шлях ExoPlayer для налаштування поверхні виведення відео %1$s %2$s оригінальна дубльована описова У цій трансляції вже має бути звукова доріжка - Увімкніть цю опцію, якщо у вас є проблеми з ініціалізацією декодерів, які повертаються до декодерів нижчого пріоритету, якщо не вдається ініціалізувати первинні декодери. Це може призвести до погіршення якості відтворення порівняно з використанням первинних декодерів - Цей обхідний шлях вивільняє і повторно встановлює відеокодеки, коли відбувається зміна поверхні, замість того, щоб налаштовувати поверхню на кодек безпосередньо. Це налаштування вже використовується ExoPlayer на деяких пристроях з цією проблемою, але воно працює лише на Android 6 і новіших версіях \n \nУвімкнення цієї опції може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу до повноекранного режиму + Увімкніть цей параметр, якщо виникають проблеми з ініціалізацією декодера: у разі збою ініціалізації основних декодерів буде використано декодери з нижчим пріоритетом. Це може погіршити продуктивність відтворення порівняно з основними декодерами + Цей обхідний спосіб звільняє та повторно створює відеокодеки, коли змінюється поверхня відтворення, замість того щоб безпосередньо встановлювати нову поверхню для кодека. На деяких пристроях із такою проблемою цей механізм уже використовується в ExoPlayer. Налаштування діє лише на Android 6 і новіших версіях.\n\nУвімкнення цього параметра може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу в повноекранний режим. Перемістити селектор головних вкладок униз Розміщення головних вкладок - Тунелювання медіа типово було вимкнено на вашому пристрої, оскільки ваша модель його не підтримує. + Медіатунелювання вимкнено на вашому пристрої за замовчуванням, оскільки відомо, що ця модель його не підтримує. Немає трансляцій Немає трансляцій наживо Відео @@ -831,7 +831,6 @@ Під час відтворення від сервера отримано помилку HTTP 403, ймовірно, через заборону IP-адреси або проблеми з деобфускацією URL-адреси потокової передачі %1$s відмовляється надати дані та запитує пароль для підтвердження, що запитувач не бот.\n\n%1$s міг тимчасово заблокувати вашу IP-адресу. Ви можете почекати деякий час або перейти на іншу IP-адресу (наприклад, увімкнувши/вимкнувши VPN або перемкнувшись з Wi-Fi на мобільні дані).\n\nЩоб дізнатися докладніше, перегляньте цю довідку. Ці матеріали недоступні для вибраної країни матеріалів.\n\nЗмініть свій вибір у розділі \"Налаштування > Матеріали > Типова країна матеріалів\". - Детальніше Вирішення @@ -862,4 +861,5 @@ Допис у блозі Подкасти Курси + Google почала запроваджувати нову вимогу щодо верифікації розробників Android, через яку встановлення NewPipe стало складнішим у Бразилії, Індонезії, Сінгапурі та Таїланді. Глобальне впровадження заплановане на 2027 рік.\n\nЯкщо вимоги не буде змінено, найближчим часом встановлення NewPipe на сертифіковані пристрої Android може стати складнішим або взагалі неможливим. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index aa5030709..e90f6cdbc 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -37,7 +37,7 @@ 显示搜索建议 订阅 已订阅 - 记录播放记录 + 观看历史 播放器 历史记录和缓存 撤销 @@ -46,7 +46,7 @@ 仅一次 添加至 文件 - 清空播放历史 + 清除观看历史 无 最小化到后台播放器 最小化到弹窗播放器 @@ -61,8 +61,8 @@ NewPipe 可更新! 服务器不接受多线程下载, 使用 @string/msg_threads = 1 重试 自动播放 - 清空数据 - 播放历史已删除 + 清除数据 + 已删除观看历史 喜欢 不喜欢 视频 @@ -180,9 +180,9 @@ 最新 继续播放 中断后继续播放(如通话) - 记录搜索历史 - Newpipe 将在本地存储搜索历史记录 - Newpipe 将保留播放记录 + 搜索历史 + 本地存储搜索查询 + 保留看过的视频的痕迹 历史记录 历史记录 NewPipe 通知 @@ -290,9 +290,9 @@ 你的 ID:soundcloud.com/[你的ID] 该操作消耗大量流量, \n \n你想继续吗? 清空图像缓存成功 - 清空已缓存的元数据 - 清空已缓存的网页数据 - 清空元数据缓存成功 + 擦除已缓存的元数据 + 删除所有已缓存的网页数据 + 已擦除元数据缓存 播放速度控制 节奏 音调 @@ -302,12 +302,12 @@ 没有可下载的串流 字幕 修改播放器字幕文本缩放和背景样式。需要重启应用生效 - 删除串流播放历史和播放痕迹记录 - 删除全部播放历史? - 清空搜索历史 - 清空搜索历史关键词 - 是否删除全部搜索历史? - 搜索历史已删除 + 删除已播放串流的历史记录和播放位置 + 删除全部观看历史? + 清除搜索历史 + 删除搜索关键词历史 + 删除所有搜索历史? + 已删除搜索历史 NewPipe 是 Copyleft 的自由软件:您可以随时使用、研究共享和改进它。您可以根据自由软件基金会发布的 GNU 通用公共许可证 GPLv3 或(由您选择的)任何更高版本的许可证重新分发或修改该许可证。 是否要导入设置? NewPipe 隐私政策 @@ -361,11 +361,11 @@ 是否隐藏评论 无法加载评论 关闭 - 记录播放痕迹历史 - 再次打开播放过的视频时, 自动定位到上次播放时位置 - 在列表中显示历史播放位置 - 在列表中,使用底端进度条显示某一视频上次播放时的播放位置 - 已删除播放痕迹历史 + 继续播放 + 恢复最后播放位置 + 列表中位置 + 在列表中显示播放位置指示器 + 已删除播放位置 文件已被移动或被删除 同名文件已存在 同名的已下载文件已经存在 @@ -384,9 +384,9 @@ 应用会询问在哪里保存每个下载。\n如果想下载到外部 SD 卡,请启用系统文件夹选择器(SAF) 使用系统文件夹选择器(SAF) “存储访问框架”允许下载到外部 SD 卡 - 删除播放痕迹历史 - 删除所有播放痕迹历史 - 是否删除全部播放痕迹历史? + 删除播放位置 + 删除所有播放位置 + 删除所有播放位置? 『时下流行』页-默认 没有人在观看 @@ -507,9 +507,9 @@ 显示内存泄露 已加入播放队列 加入队列 - 清空与本地存储的 reCAPTCHA 验证码有关的 cookie - reCAPTCHA cookie 已被清空 - 清空 reCAPTCHA cookie + 清除 NewPipe 在你解决 reCAPTCHA 时存储的 cookies + 已清除 reCAPTCHA cookies + 清除 reCAPTCHA cookies YouTube提供了“受限模式”,可以隐藏潜在的成人内容 展示有年龄限制的、可能不适合儿童观看的内容(比如 18+) 让 Android 系统根据视频缩略图的主色彩给通知着色(注意,该特性仅在部分设备上可用) @@ -789,7 +789,6 @@ 播放时从服务器收到 HTTP 403 错误,可能因 IP 封锁或串流 URL 解密问题导致 %1$s 拒绝提供数据, 要求登录确认请求方不是机器人。\n\n你的 IP 可能已经暂时被 %1$s 封禁,你可以等待一段时间或切换到不同 IP (比如开/关 VPN, 或者从 WiFi 连接切换到移动数据)。\n\n请见 此 FAQ条目 获取更多信息。 此内容对当前选中的内容地区不可用。\n\n要更改选择,请前往 “设置 > 内容 > 默认内容地区”。 - 详情 解决方案 @@ -811,4 +810,5 @@ 博客文章 播客 课程 + Google 已经开始在巴西、印尼、新加坡和泰国强制实施一项新的安卓开发者验证要求,该要求增加了安装 NewPipe 的难度;这项要求计划 2027 年在全球推出。\n\n除非该要求出现变化,否则不久将来在特定安卓设备上安装本应用可能变得更加困难或根本不可能。 diff --git a/fastlane/metadata/android/de/changelogs/1016.txt b/fastlane/metadata/android/de/changelogs/1016.txt new file mode 100644 index 000000000..eb606d1bf --- /dev/null +++ b/fastlane/metadata/android/de/changelogs/1016.txt @@ -0,0 +1,9 @@ +Kapitelanzeige auf der Videoplayer-Suchleiste +[YouTube] Unterstützung für Tabs „Podcasts“ und „Kurse“ +Verbesserte Darstellung der Suchmenü-Titel +Anzeige vollständiger Untertitelnamen, sofern vom Dienst bereitgestellt +Verschiedene Player-Fixes, u. a. Audio-Ducking, Black Screens und Öffnen von Links mit Zeitstempeln +[YouTube] Kleinere Fixes und Optimierungen +… + +Vielen Dank an die diesjährigen ANU-Software-Engineering-Studierenden, die im Rahmen ihres OSS-Einsatzes zu NewPipe beigetragen haben! diff --git a/fastlane/metadata/android/fr/changelogs/1016.txt b/fastlane/metadata/android/fr/changelogs/1016.txt new file mode 100644 index 000000000..fe7c5f628 --- /dev/null +++ b/fastlane/metadata/android/fr/changelogs/1016.txt @@ -0,0 +1,6 @@ +Affichage des chapitres sur la barre de défilement du lecteur vidéo +[YouTube] Ajout de la prise en charge des onglets « Podcasts » et « Cours » +Amélioration de l'apparence des titres du menu de recherche +Affichage des noms complets des sous-titres lorsqu'ils sont fournis par le service +Diverses corrections apportées au lecteur, notamment concernant l'atténuation du son, les écrans noirs et l'ouverture des liens avec des horodatages +[YouTube] Corrections mineures et mises à jour de maintenance diff --git a/fastlane/metadata/android/ko/changelogs/1016.txt b/fastlane/metadata/android/ko/changelogs/1016.txt new file mode 100644 index 000000000..c08575a62 --- /dev/null +++ b/fastlane/metadata/android/ko/changelogs/1016.txt @@ -0,0 +1,9 @@ +동영상 플레이어의 탐색 막대에 챕터 표시 +[YouTube] "팟캐스트" 및 "학습" 탭 지원 +검색 메뉴 제목의 모양 개선 +서비스가 제공하는 경우 전체 자막 이름 표시 +오디오 조정, 블랙 스크린, 타임스탬프가 있는 링크 열기 등 여러 플레이어 문제 수정 +[YouTube] 작은 수정 및 정돈 +여러 내부 개선 및 버그 수정 + +올해 오픈소스 과제의 일환으로 NewPipe 개발에 기여해준 ANU 소프트웨어공학과 학생들에게 감사드립니다! diff --git a/fastlane/metadata/android/ko/full_description.txt b/fastlane/metadata/android/ko/full_description.txt index b12aa9902..dbb6e12d3 100644 --- a/fastlane/metadata/android/ko/full_description.txt +++ b/fastlane/metadata/android/ko/full_description.txt @@ -1 +1 @@ -NewPipe는 구글 프레임워크 러이브러리나 유튜브 API를 전혀 사용하지 않습니다. NewPipe는 필요한 정보를 얻기 위해서만 웹사이트 파싱을 합니다. 따라서 구글 서비스가 설치되지 않은 디바이스에서도 이 앱을 사용할 수 있습니다. 또한, NewPipe 사용을 위해 유튜브 계정이 필요없으며, 완벽한 오픈소스입니다. +NewPipe는 Google 프레임워크 라이브러리나 YouTube API를 전혀 사용하지 않습니다. NewPipe는 필요한 정보를 얻기 위해서만 웹사이트 파싱을 합니다. 따라서 Google 서비스가 설치되지 않은 기기에서도 이 앱을 사용할 수 있습니다. 또한 NewPipe 사용에는 YouTube 계정이 필요하지 않으며, 완벽한 자유 오픈소스입니다. diff --git a/fastlane/metadata/android/pl/changelogs/1016.txt b/fastlane/metadata/android/pl/changelogs/1016.txt new file mode 100644 index 000000000..85fad785a --- /dev/null +++ b/fastlane/metadata/android/pl/changelogs/1016.txt @@ -0,0 +1,9 @@ +Wyświetlanie rozdziałów na pasku przewijania odtwarzacza wideo +[YouTube] Dodano obsługę kart „Podcasty” i „Kursy” +Ulepszono wygląd tytułów w menu wyszukiwania +Wyświetlanie pełnych nazw napisów, gdy zostały udostępnione przez serwis +Różne poprawki odtwarzacza, w tym tłumienie dźwięku, czarne ekrany i otwieranie linków ze znacznikami czasowymi +[YouTube] Drobne poprawki i porządki +Wiele wewnętrznych ulepszeń i poprawek błędów + +Dziękujemy tegorocznym studentom ANU, którzy pomogli w rozwoju NewPipe! diff --git a/fastlane/metadata/android/pt-BR/changelogs/1016.txt b/fastlane/metadata/android/pt-BR/changelogs/1016.txt new file mode 100644 index 000000000..70a72cb8a --- /dev/null +++ b/fastlane/metadata/android/pt-BR/changelogs/1016.txt @@ -0,0 +1,9 @@ +Display chapters on the video player's seek bar +[YouTube] Add support for the "Podcasts" and "Courses" tabs +Improve the appearance of search menu titles +Show full subtitle names when provided by the service +Various player fixes, including audio ducking, black screens, and opening links with timestamps +[YouTube] Minor fixes and housekeeping +Many internal improvements and bug fixes + +Thanks to this year's ANU software engineering students who contributed to NewPipe as part of their OSS assignment! diff --git a/shared/src/commonMain/composeResources/values-az/strings.xml b/shared/src/commonMain/composeResources/values-az/strings.xml index 445f0d575..fb12fd41d 100644 --- a/shared/src/commonMain/composeResources/values-az/strings.xml +++ b/shared/src/commonMain/composeResources/values-az/strings.xml @@ -191,4 +191,32 @@ Cihazınızdakı heç bir tətbiq bunu aça bilməz Bu əməliyyat üçün uyğun fayl meneceri tapılmadı.\nZəhmət olmasa, fayl menecerini quraşdır və ya endirmə tənzimləmələrində '%1$s'-i qeyri-aktiv etməyə çalış Bu fəaliyyət üçün uyğun fayl meneceri tapılmadı.\nXahiş olunur, Yaddaş Giriş Quruluşuna uyğun fayl meneceri quraşdır + Baxış tarixçəsi + Baxılmış videoların saxlanılması + Oynatmanı davam etdir + Son oynatma mövqeyini qaytar + Siyahılardakı mövqelər + Siyahılarda oynatma mövqe göstəricilərini göstər + Axtarış tarixçəsi + Axtarış sorğularını yerli olaraq saxla + Məlumat təmizlə + Silin + Toplanmış şərhi məlumatı təmizlə + Toplanmış bütün veb-səhifə məlumatlarını sil + Şərhi məlumat qalığı silindi + Baxış tarixçəsini təmizlə + Oynadılmış yayımlar tarixçəsini və oynatma mövqelərini silir + Bütün baxış tarixçəsi silinsin? + Baxış tarixçəsi silindi + Oynatma mövqelərini sil + Bütün oynatma mövqelərini silir + Bütün oynatma mövqeləri silinsin? + Oynatma mövqeləri silindi + Axtarış tarixçəsin təmizlə + Açar sözlər axtarışı tarixçəsin silir + Bütün axtarış tarixçəsi silinsin? + Axtarış tarixçəsi silindi + reCAPTCHA bazalarını təmizlə + reCAPTCHA həll edərkən NewPipe saxladığı bazaları sil + reCAPTCHA bazaları təmizləndi diff --git a/shared/src/commonMain/composeResources/values-de/strings.xml b/shared/src/commonMain/composeResources/values-de/strings.xml index e28a45970..5e7399f07 100644 --- a/shared/src/commonMain/composeResources/values-de/strings.xml +++ b/shared/src/commonMain/composeResources/values-de/strings.xml @@ -191,4 +191,32 @@ Keine App auf deinem Gerät kann dies öffnen Für diese Aktion wurde kein geeigneter Dateimanager gefunden.\nBitte installiere einen Dateimanager oder versuche, '%1$s' in den Downloadeinstellungen zu deaktivieren Für diese Aktion wurde kein geeigneter Dateimanager gefunden.\nBitte installiere einen Storage Access Framework kompatiblen Dateimanager + Wiedergabeverlauf + Angeschaute Videos erfassen + Suchverlauf + Wiedergabe fortsetzen + Letzte Wiedergabeposition wiederherstellen + Positionen in Listen + Wiedergabepositionsanzeigen in Listen anzeigen + Gesamten Suchverlauf löschen? + Suchanfragen lokal speichern + Daten löschen + Löschen + Zwischengespeicherte Metadaten löschen + Alle zwischengespeicherten Webseiten-Daten löschen + Metadatencache gelöscht + Wiedergabeverlauf löschen + Löscht den Verlauf der Suchbegriffe + Löscht den Verlauf der abgespielten Streams und die Wiedergabepositionen + Wiedergabeverlauf gelöscht + Wiedergabepositionen löschen + Löscht alle Wiedergabepositionen + Gesamten Wiedergabeverlauf löschen? + Alle Wiedergabepositionen löschen? + Lösche Cookies, die NewPipe speichert, wenn du ein reCAPTCHA löst + Wiedergabepositionen gelöscht + Suchverlauf löschen + Suchverlauf gelöscht + reCAPTCHA-Cookies löschen + reCAPTCHA-Cookies wurden gelöscht diff --git a/shared/src/commonMain/composeResources/values-fr/strings.xml b/shared/src/commonMain/composeResources/values-fr/strings.xml index ee090eaaf..dba85be90 100644 --- a/shared/src/commonMain/composeResources/values-fr/strings.xml +++ b/shared/src/commonMain/composeResources/values-fr/strings.xml @@ -62,4 +62,5 @@ Grille Carte Annuler + Supprimer tout l'historique de mes favoris ? diff --git a/shared/src/commonMain/composeResources/values-pl/strings.xml b/shared/src/commonMain/composeResources/values-pl/strings.xml index c6a4809e3..fc9f00928 100644 --- a/shared/src/commonMain/composeResources/values-pl/strings.xml +++ b/shared/src/commonMain/composeResources/values-pl/strings.xml @@ -193,4 +193,32 @@ Na twoim urządzeniu nie ma aplikacji, która mogłaby to otworzyć Nie znaleziono odpowiedniego menedżera plików dla tej akcji.\nZainstaluj menedżer plików lub spróbuj wyłączyć „%1$s” w ustawieniach pobierania Nie znaleziono odpowiedniego menedżera plików dla tej akcji. \nZainstaluj menedżer plików zgodny z Storage Access Framework + Historia oglądania + Śledź obejrzane wideo + Wznawiaj odtwarzanie + Przywracaj odtwarzanie od ostatniej pozycji + Pozycje odtwarzania na listach + Pokazuj wskaźniki pozycji odtwarzania na listach + Historia wyszukiwania + Przechowuj lokalnie historię wyszukiwania + Wyczyść dane + Usuń + Wyczyść pamięć podręczną metadanych + Usuwa całą pamięć podręczną stron + Wyczyszczono pamięć podręczną metadanych + Wyczyść historię oglądania + Usuwa historię odtworzonych strumieni i pozycje odtwarzania + Usunąć całą historię oglądania? + Usunięto historię oglądania + Wyczyść pozycje odtwarzania + Usuwa wszystkie pozycje odtwarzania + Usunąć wszystkie pozycje odtwarzania? + Usunięto pozycje odtwarzania + Wyczyść historię wyszukiwania + Usuwa historię wyszukiwania słów kluczowych + Usunąć całą historię wyszukiwania? + Usunięto historię wyszukiwania + Wyczyść ciasteczka reCAPTCHA + Usuwa ciasteczka, które NewPipe przechowuje po rozwiązaniu reCAPTCHA + Ciasteczka reCAPTCHA zostały wyczyszczone diff --git a/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml b/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml index 89491c7be..81431ca16 100644 --- a/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/shared/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -28,7 +28,7 @@ Concluído Não disponível Configurações - Pesquisar + Buscar Conteúdo Notificações Vídeo e áudio @@ -162,4 +162,62 @@ Criar uma notificação de erro Desculpe, algo deu errado. Reportar + OK + Perguntar onde baixar + Você será perguntado onde salvar cada download.\nAtive o seletor de pastas do sistema (SAF) se desejar fazer download para um cartão SD externo + Você será perguntado onde salvar cada download + Usar seletor de pastas do sistema (SAF) + O 'Storage Access Framework' permite downloads para um cartão SD externo + A partir do Android 10, apenas o 'Storage Access Framework' é compatível + Pasta de download de vídeos + Os arquivos de vídeo baixados são salvos aqui + Pasta de download de áudios + Os arquivos de áudio baixados são salvos aqui + Caracteres permitidos em nomes de arquivos + Letras e dígitos + Caracteres mais especiais + Caractere de substituição + Caracteres inválidos são substituídos por este valor + Máximo de tentativas + Número máximo de tentativas antes de cancelar o download + Interromper em redes limitadas + Útil ao mudar para dados móveis, embora alguns downloads não possam ser suspensos + Limitar fila de download + Um download será executado ao mesmo tempo + Erro + Essa pasta não existe + Defina uma pasta de download depois nas configurações + Armazenamento externo indisponível + Não é possível fazer download para um cartão SD externo. Redefinir o local da pasta de download? + Nenhum aplicativo no seu dispositivo pode abrir isto + Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação.\nInstale um gerenciador de arquivos ou tente desabilitar '%1$s' nas configurações de download + Nenhum gerenciador de arquivos apropriado foi encontrado para esta ação.\nInstale um gerenciador de arquivos compatível com o Storage Access Framework + Histórico de reprodução + Acompanhe os vídeos assistidos + Retomar reprodução + Restaurar a última posição de reprodução + Posições em listas + Mostrar indicadores de posição de reprodução em listas + Histórico de buscas + Armazenar consultas de buscas localmente + Limpar dados + Excluir + Limpar metadados em cache + Remova todos os dados de páginas da web em cache + Cache de metadados apagado + Limpar histórico de exibição + Exclui o histórico de reprodução e as posições de reprodução + Excluir todo o histórico de exibição? + Histórico de exibição excluído + Excluir posições de reprodução + Exclui todas as posições de reprodução + Excluir todas as posições de reprodução? + Posições de reprodução excluídas + Limpar histórico de buscas + Exclui o histórico de palavras buscada + Excluir todo o histórico de buscas? + Histórico de buscas excluído + Apagar os cookies do reCAPTCHA + Apague os cookies que o NewPipe armazena quando você resolve um reCAPTCHA + Os cookies do reCAPTCHA foram apagados diff --git a/shared/src/commonMain/composeResources/values-uk/strings.xml b/shared/src/commonMain/composeResources/values-uk/strings.xml index 15e71e216..8cd301b5e 100644 --- a/shared/src/commonMain/composeResources/values-uk/strings.xml +++ b/shared/src/commonMain/composeResources/values-uk/strings.xml @@ -15,7 +15,7 @@ Вебсайт Відвідайте вебсайт NewPipe, щоб дізнатися більше інформації та новин. Політика конфіденційності NewPipe - Проєкт NewPipe дуже серйозно ставиться до вашої приватності. Тому застосунок не збирає жодних даних без вашої згоди. \nПолітика приватності NewPipe докладно описує, які дані надсилаються і зберігаються у звіті про збій. + Проєкт NewPipe дуже серйозно ставиться до вашої конфіденційності. Тому застосунок не збирає жодних даних без вашої згоди.\nУ політиці конфіденційності NewPipe докладно пояснюється, які дані надсилаються та зберігаються під час надсилання звіту про збій. Ознайомитися з політикою конфіденційності Ліцензія NewPipe NewPipe — це copyleft libre програмне забезпечення: ви можете вільно використовувати, вивчати, поширювати та вдосконалювати його. Зокрема, ви можете розповсюджувати та/або змінювати його на умовах GNU General Public License, опублікованої Free Software Foundation, версії 3 або (на ваш вибір) будь-якої пізнішої версії. @@ -47,8 +47,8 @@ Виберіть улюблену нічну тему — %1$s Ця опція доступна, лише якщо темою вибрано %1$s Ви можете вибрати улюблену нічну тему нижче - Показувати підказку «Затисніть, щоб додати до черги» - Показувати підказку при натисканні на тло або кнопку спливного вікна у відео \\"Подробиці:\\" + Показувати підказку «Утримуйте, щоб додати до черги» + Показувати підказку під час натискання кнопки фонового відтворення або спливного вікна в інформації про відео: Режим планшета Режим списку Субтитри @@ -62,4 +62,163 @@ Сітка Картки Скасувати + Типова роздільна здатність + Типова роздільна здатність спливного вікна + Обмежувати роздільну здатність під час використання мобільних даних + Показувати вищі роздільні здатності + Лише деякі пристрої можуть відтворювати відео 2K/4K + Типовий формат відео + Типовий формат аудіо + Надавати перевагу оригінальному аудіо + Вибирати оригінальну аудіодоріжку незалежно від мови + Надавати перевагу описовому аудіо + Вибирати за наявності аудіодоріжку з описами для людей із порушеннями зору + Найкраща роздільна здатність + Без обмежень + Програвач + Використовувати зовнішній відеопрогравач + Вилучає звук у деяких роздільних здатностях + Використовувати зовнішній аудіопрогравач + Показувати параметр «Відтворити через Kodi» + Показувати параметр відтворення відео через медіацентр Kodi + Попередній перегляд мініатюр на шкалі часу + Висока якість (більший розмір) + Низька якість (менший розмір) + Не показувати + Поведінка + Бажана дія «відкрити» + Типова дія під час відкриття вмісту — %1$s + Показати інформацію + Відеопрогравач + Фоновий програвач + Спливний програвач + Завантажити + Додати до списку відтворення + Додати до черги + Завжди запитувати + Згортати під час перемикання застосунку + Дія під час перемикання на інший застосунок з основного відеопрогравача — %1$s + Немає + Згортати до фонового програвача + Згортати до спливного програвача + Запускати основний програвач на весь екран + Не запускати відео в мініпрогравачі, а одразу переходити в повноекранний режим, якщо автоповорот заблоковано. Мініпрогравач усе одно можна відкрити, вийшовши з повноекранного режиму + Автовідтворення + Запускати відтворення автоматично — %1$s + Завжди + Лише через Wi-Fi + Ніколи + Автододавати наступний потік до черги + Продовжувати чергу відтворення, що закінчується (без повтору), додаванням пов’язаного потоку + Відновлювати відтворення + Продовжувати відтворення після перерв (наприклад, телефонних дзвінків) + Дія лівого жесту + Виберіть жест для лівої половини екрана програвача + Дія правого жесту + Виберіть жест для правої половини екрана програвача + Яскравість + Гучність + Немає + Запам’ятовувати параметри спливного вікна + Запам’ятовувати останній розмір і розташування спливного вікна + Використовувати швидке неточне перемотування + Неточне перемотування дає змогу швидше переходити до потрібної позиції, але з меншою точністю. Перемотування на 5, 15 або 25 секунд із цим параметром не працює + Тривалість перемотування вперед/назад + Через обмеження ExoPlayer тривалість перемотування встановлено на %1$d с + Запитувати підтвердження перед очищенням черги + Перемикання з одного програвача на інший може замінити вашу чергу + Ігнорувати події апаратних медіакнопок + Корисно, наприклад, якщо ви використовуєте гарнітуру з несправними фізичними кнопками + + %1$d секунда + %1$d секунди + %1$d секунд + %1$d секунд + + Налаштування ExoPlayer + Керування деякими налаштуваннями ExoPlayer. Щоб зміни набули чинності, потрібно перезапустити програвач + Розмір інтервалу завантаження під час відтворення + Змінити розмір інтервалу завантаження для прогресивного вмісту (зараз %1$s). Менше значення може пришвидшити їхнє початкове завантаження + Типове значення ExoPlayer + Використовувати резервний декодер ExoPlayer + Увімкніть цей параметр, якщо виникають проблеми з ініціалізацією декодера: у разі збою ініціалізації основних декодерів буде використано декодери з нижчим пріоритетом. Це може погіршити продуктивність відтворення порівняно з основними декодерами + Вимкнути медіатунелювання + Вимкніть медіатунелювання, якщо під час відтворення відео з’являється чорний екран або підвисання. + Медіатунелювання вимкнено на вашому пристрої за замовчуванням, оскільки відомо, що ця модель його не підтримує. + Завжди використовувати обхідний шлях ExoPlayer для налаштування поверхні виведення відео + LeakCanary + Моніторинг витоків пам’яті може призвести до того, що застосунок перестане відповідати під час створення дампа пам'⁸яті + LeakCanary недоступний + Показувати витоки пам’яті + Повідомляти про помилки поза життєвим циклом + Примусово повідомляти про помилки Rx + Показувати минулий час на елементах + Оригінальні тексти від сервісів буде видно в елементах потоків + Показувати пункт «Аварійно завершити програвач» + Показує пункт аварійного завершення під час користування програвачем + Запустити перевірку нових потоків + Аварійно завершити застосунок + Показати сроаіщення із помилкою + Створити сповіщення про помилку + Вибачте, щось пішло не так. + Повідомити + ОК + Запитувати, куди завантажувати + Вам пропонуватимуть вибрати, куди зберігати кожне завантаження + Використовувати системний вибір папки (SAF) + «Storage Access Framework» дає змогу завантажувати на зовнішню SD-картку + Починаючи з Android 10 підтримується лише «Storage Access Framework» + Папка завантаження відео + Завантажені відеофайли зберігаються тут + Папка завантаження аудіо + Завантажені аудіофайли зберігаються тут + Дозволені символи в назвах файлів + Літери та цифри + Більшість спеціальних символів + Символ заміни + Недійсні символи замінюються цим значенням + Максимальна кількість повторних спроб + Максимальна кількість спроб перед скасуванням завантаження + Переривати в мережах із лімітованим трафіком + Корисно під час перемикання на мобільні дані, хоча деякі завантаження неможливо призупинити + Обмежити чергу завантажень + Одночасно виконуватиметься лише одне завантаження + Помилка + Немає такої папки + Укажіть папку завантаження пізніше в налаштуваннях + Зовнішнє сховище недоступне + Завантаження на зовнішню SD-картку неможливе. Скинути розташування папки завантаження? + Жоден застосунок на вашому пристрої не може це відкрити + Історія переглядів + Відстежувати переглянуті відео + Продовжувати відтворення + Відновлювати останню позицію відтворення + Позиції у списках + Показувати індикатори позиції відтворення у списках + Історія пошуку + Зберігати пошукові запити локально + Очищення даних + Видалити + Очистити кеш метаданих + Видалити всі кешовані дані вебсторінок + Кеш метаданих очищено + Очистити історію переглядів + Видаляє історію відтворених потоків і позиції відтворення + Видалити всю історію переглядів? + Історію переглядів видалено + Видалити позиції відтворення + Видаляє всі позиції відтворення + Видалити всі позиції відтворення? + Позиції відтворення видалено + Очистити історію пошуку + Видаляє історію пошукових запитів + Видалити всю історію пошуку? + Історію пошуку видалено + Очистити файли cookie reCAPTCHA + Очищає файли cookie, які NewPipe зберігає, коли ви розв’язуєте reCAPTCHA + Файли cookie reCAPTCHA очищено + Цей обхідний спосіб звільняє та повторно створює відеокодеки, коли змінюється поверхня відтворення, замість того щоб безпосередньо встановлювати нову поверхню для кодека. На деяких пристроях із такою проблемою цей механізм уже використовується в ExoPlayer. Налаштування діє лише на Android 6 і новіших версіях.\n\nУвімкнення цього параметра може запобігти помилкам відтворення під час перемикання поточного відеопрогравача або переходу в повноекранний режим. + Вам буде запропоновано вибрати місце для збереження кожного завантаження.\nУвімкніть системний вибір папки (SAF), якщо хочете завантажувати файли на зовнішню SD-карту. + Для цієї дії не знайдено відповідного файлового менеджера.\nВстановіть файловий менеджер або спробуйте вимкнути «%1$s» у налаштуваннях завантажень. + Для цієї дії не знайдено відповідного файлового менеджера.\nВстановіть файловий менеджер, сумісний із Storage Access Framework. diff --git a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml index c8990e918..2e8f0ee33 100644 --- a/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/shared/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -190,4 +190,32 @@ 设备上没有应用可以打开这个 没有找到适合这个操作的文件管理器。\n请安装文件管理器或试着在下载设置中禁用“%1$s” 没有找到适合这个操作的文件管理器。\n请安装兼容存储访问框架的文件管理器 + 删除全部观看历史? + 观看历史 + 保留看过的视频的痕迹 + 继续播放 + 恢复最后播放位置 + 列表中位置 + 在列表中显示播放位置指示器 + 搜索历史 + 本地存储搜索查询 + 清除数据 + 删除 + 擦除已缓存的元数据 + 删除所有已缓存的网页数据 + 已擦除元数据缓存 + 清除观看历史 + 删除已播放串流的历史记录和播放位置 + 已删除观看历史 + 删除播放位置 + 删除所有播放位置 + 删除所有播放位置? + 已删除播放位置 + 清除搜索历史 + 删除搜索关键词历史 + 删除所有搜索历史? + 已删除搜索历史 + 清除 reCAPTCHA cookies + 清除 NewPipe 在你解决 reCAPTCHA 时存储的 cookies + 已清除 reCAPTCHA cookies From 2b8eba0fe8a591dd17bc479839d553c89065c16c Mon Sep 17 00:00:00 2001 From: TobiGr Date: Sat, 7 Nov 2026 12:25:03 +0100 Subject: [PATCH 154/155] Update NewPipe Extractor to v0.27.0 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bff280568..72a1c2975 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -75,7 +75,7 @@ teamnewpipe-nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" # the corresponding commit hash, since JitPack sometimes deletes artifacts. # If there’s already a git hash, just add more of it to the end (or remove a letter) # to cause jitpack to regenerate the artifact. -teamnewpipe-newpipe-extractor = "6cb36e982311dc1c529997bc329013afe75f37d1" +teamnewpipe-newpipe-extractor = "v0.27.0" viewpager2 = "1.1.0" webkit = "1.15.0" # New versions require minSdk 24 work = "2.11.2" # New versions require minSdk 24 From c87da451aced4d8037e672ef0ab57acad9d34af6 Mon Sep 17 00:00:00 2001 From: TobiGr Date: Wed, 4 Nov 2026 19:44:57 +0100 Subject: [PATCH 155/155] Bump NewPipe version to 0.29.2 (1016) --- buildSrc/src/main/kotlin/ProjectConfig.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/src/main/kotlin/ProjectConfig.kt b/buildSrc/src/main/kotlin/ProjectConfig.kt index 83669c9b5..3d4c1e9c8 100644 --- a/buildSrc/src/main/kotlin/ProjectConfig.kt +++ b/buildSrc/src/main/kotlin/ProjectConfig.kt @@ -8,8 +8,8 @@ const val NEWPIPE_VERSION_SDK_COMPILE_MINOR = 0 const val NEWPIPE_VERSION_SDK_MIN = 23 const val NEWPIPE_VERSION_SDK_TARGET = 35 -const val NEWPIPE_VERSION_CODE = 1015 -const val NEWPIPE_VERSION_NAME = "0.29.1" +const val NEWPIPE_VERSION_CODE = 1016 +const val NEWPIPE_VERSION_NAME = "0.29.2" const val NEWPIPE_APPLICATION_ID_OLD = "org.schabi.newpipe" const val NEWPIPE_APPLICATION_ID_NEW = "net.newpipe.app"